Redux

2019-12-07  本文已影响0人  能吃饭也能吃苦1236

Redux工作流程

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

//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
}
 //将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
}
//创建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.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);
}

总结

上一篇下一篇

猜你喜欢

热点阅读