Redux

作者: 能吃饭也能吃苦1236 | 来源:发表于2019-12-07 18:24 被阅读0次

    Redux工作流程

    redux主要通过store管理react中的数据流,工作流程如下:

    • 第一步 创建store文件夹,包含一个index.js文件和一个reducer.js文件
    //index.js文件
    import { createStore } from 'redux';  //首先需要从redux中引入createStore 
    import reducer from './reducer';  //引入reducer文件
    
    //其次是使用createStore创建一个store,在createStore中配置两个参数,第一个参数为引入的reducer,第二个参数是方便在浏览器中使用Redux-DevTools工具查看数据变化
    const store = createStore(  
        reducer,
        window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
    );
    
    export default store;  //最后导出以供页面组件调用
    
    //reducer.js文件,实际上是创建一个函数
    const defaultState = {  //初始state
        inputValue:'',
        list:[1,2]
    }
    
    //实际上是创建一个函数,这个函数包含state和action两个参数
    export default  (state = defaultState, action) =>{
        return state
    }
    
    • 第二步 使用redux更新页面数据
     //将store引入需要使用的页面,这里引入到TodoList.js
    import store from './store'; 
    
    //在constructor构造函数里使用getState()方法获取store里面的state并且赋值给TodoList页面的state 
    this.state = store.getState();
    
    //在操作事件里面定义action,并使用store.dispatch()方法传给store
    handleInputChange(e) {
            const action = {
                type: 'change-input-value',
                value: e.target.value
            }
            store.dispatch(action);
    }
    
    //在reducer.js文件中根据action类型更新state 并且返回
    if(action.type === 'change-input-value'){
            const newState = JSON.parse(JSON.stringify(state));  //reducer里面不能直接修改state,只能拷贝一个state出来做修改, JSON.parse(JSON.stringify())深拷贝
            newState.inputValue = action.value;
            return newState
    }
    
    //要做到页面的实时刷新还要调用 store.subscribe()方法
    store.subscribe(this.getNewStore) //constructor构造函数中调用
    
    getNewStore() {
            this.setState(store.getState())  //获取最新的state
    }
    
    • 统一定义action中的type名称
    //创建actionTypes.js文件统一定义type名称
    export const CHANGE_INPUT_VALUE = 'change_input_value';
    export const ADD_TODO_ITEM = 'add_todo_item';
    export const DELETE_TODO_ITEM = 'delete_todo_item';
    
    //分别在TodoList.js和reducer.js引入定义好的type名称
    //TodoList.js
    import { getInputChangeAction, getAddItemAction, getDeleteItemAction } from './store/actionCreators';  
    //reducer.js
    import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM  } from './actionTypes';
    
    //使用定义好的type名称
    //TodoList.js
    const action = {
         type:CHANGE_INPUT_VALUE
    };
    //reducer.js
    if(action.type === CHANGE_INPUT_VALUE){
         const newState = JSON.parse(JSON.stringify(state));
         newState.inputValue = action.value;
         return newState
    }
    
    • 使用actionCreators统一创建action
      即不在组件里面创建action,而是在一个js文件中统一创建action,目的是方便测试和后期维护数据
    //创建actionCreators.js文件
     
    //第一步,引入actionTypes文件
    import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM  } from './actionTypes';
    
    //第二步,定义方法
    export const getInputChangeAction = (value) => ({
        type:CHANGE_INPUT_VALUE,
        value
    })
    
    //第三步,在TodoList.js文件中引入并使用
    import { getInputChangeAction } from './store/actionCreators';
    
     handleInputChange(e) {
        const action = getInputChangeAction(e.target.value);
        store.dispatch(action);
    }
    

    总结

    • redux设计与使用的三大原则
      (1)store是唯一的;
      (2)只有store能够改变自己的内容(reducer可以接受state,但绝不能改变state);
      (3)reducer必须是纯函数(纯函数是指给定固定的输入就一定会有固定的输出,而且不会有任何副作用)。
    • redux核心API
      (1)createStore:创建store;
      (2)store.dispatch:派发action,将action传递给store;
      (3)store.getState:获取store里面所有数据内容;
      (4)store.subscribe:订阅store内容改变。

    相关文章

      网友评论

          本文标题:Redux

          本文链接:https://www.haomeiwen.com/subject/vnzygctx.html