redux 和react没有必然关系,redux可以应用于各种框架,包括jquery,甚至js都可以使用redux,只不过redux和react更加搭配。redux也推出了专门应用于react的react-redux。
就是通过store.dispatch 来进行更新store中的数据,然后会按照reducer方法中的处理逻辑来更新store的数据,组件会通过store.subscriber监听来获取更新的数据,可以通过setState等方法来更新数据进而重新更新组件
构建action对象,通过创建一个函数,来返回一个对象,返回的action对象需要有type属性,否则会报错。
action.js
export const sendAction = (action)=>{ return{ type: "sendAction", ...action } }
构建reducer,用来响应action,然后通过action的type值来进行单独的数据处理并将数据return 给store。
reducer.js
const initState = {value: "这是sate默认值"}; export const reducer = (state = initState, action ) => { console.log("reducer",state,action) switch (action.type) { case "sendAction": return Object.assign({},state,action); default : return state; } }
构建store,通过redux中的createRedux来创建store,createStore需要传进 构建的reducer函数,这样就会按照定义的reducer函数的处理逻辑来处理数据。
store.js
import {createStore} from "redux"; import {reducer} from "./reducer";//自定义的reducer函数 export const store = createStore(reducer);
利用store.subscriber()来注册监听,接收store更新后的数据。
home/index.js
store.subscribe(() => { console.log("subscribe",store.getState()) })
当利用store.dispatch来发送一个action的时候,就能触发监听了,在监听中通过store.getState()就可以拿到更新后的值了。
home/index.jsx
import React, {Component} from 'react'; import {sendAction} from "../action"; import {store} from "../store"; class Home extends Component { constructor(props){ super(props); this.state = { actionValue: "", }; } componentDidMount() { //接收store更新的数据 store.subscribe(() => { console.log("subscribe",store.getState()); this.setState({actionValue: store.getState().value}); }) } // 发送action handleAction = () =>{ const action = sendAction({value:"这是一个action"}); store.dispatch(action); } render() { return ( <div> <button onClick={this.handleAction}>发送一个action</button> <div> <h4>这是action的值: {this.state.actionValue}</h4> </div> </div> ); } } export default Home;