Redux

Redux = Reducer + Flux

使用

  1. 安装

    1. npm i redux -S
  2. mkdir store; create index.js;

    1. // index.js
    2. import { createStore } from 'redux'
    3. import reducer from './reducer' // 引入记录本,作为参数,传给 store
    4. const store = createStore(reducer) // store:管理员
    5. export default store
  3. create reducer.js ;

    1. const defaultState = {
    2. inputValue: '',
    3. list: [] // 存储值
    4. } // 默认笔记本上什么没有存储
    5. export default (state = defaultState , action) => { // 返回一个函数 reducer:记录本,所有书籍信息
    6. return state
    7. }
  4. 组件中创建事件

    1. // TodoList.js
    2. handleInputChange = e => {
    3. const action = { // 创建一个action
    4. type: 'change_input_value',
    5. value: e.target.value
    6. }
    7. store.dispatch(action) // 把 action 传递给 store ,store 会自动把 action 传给记录本 reducer 处理
    8. }
  5. 在 reducer 中,接收并处理

    1. // reducer.js
    2. export default (state = defaultState, action) => {
    3. console.log(state, action) // 可以拿到之前的 数据 和 action
    4. if (action === 'change_input_value') {
    5. const newState = JSON.parse(JSON.stringify(state)) // 对之前的数据进行深拷贝
    6. newState.inputValue = action.value // 把最新的数据 赋值给 新数据对象
    7. return newState // 把 新的 state 返回给 store,因为 reducer 可以接收 state,但是绝不能修改 state
    8. }
    9. return state
    10. }
  6. 组件中的操作

    1. // TodoList.js
    2. constructor(props){
    3. store.subscribe(this.handleStoreChange) // 订阅 store 的改变
    4. }
    5. handleStoreChange = ()=>{
    6. this.setState(store.getState()) // 查询到 state 改变之后,把新的值 通过 store的getState 方法查询到 store 中的最新数据,重置 赋值给 组件中的 state
    7. }
    8. // 此时就可以更改页面上的数据了

    优化

    actionTypes.js 统一管理 actionType

    在组件中不断的创建 action,reducer 中 接收不同的 action,两处的 action.type 必须相同才能进行相应的逻辑处理。
    所以,我们把 action.type 抽离出来。
    cd store ; create actionTypes.js

    1. // actionTypes.js
    2. export const CHANGE_INPUT_VALUE = 'change_input_value'
    3. export const ADD_TODOITEM = 'add_todoItem'
    4. export const DELETE_TODOITEM = 'delete_todoItem'

    之后在 组件 中和 reducer.js 中 我们进引入 常量 进行 处理。

    1. action.type = ADD_TODOITEM

    actionCreators.js 统一创建 action
    1. // actionCreators.js
    2. import {
    3. CHANGE_INPUT_VALUE,
    4. ADD_TODOITEM,
    5. DELETE_TODOITEM
    6. } from './actionTypes'
    7. export const getInputChangeValueAction = value => ({
    8. type: CHANGE_INPUT_VALUE,
    9. value
    10. })
    11. export const addnewItemAction = () => ({
    12. type: ADD_TODOITEM
    13. })
    14. export const deleteItemAction = index => ({
    15. type: DELETE_TODOITEM,
    16. value: index
    17. })

    在组件中

    1. // TodoList.js
    2. import {
    3. getInputChangeValueAction,
    4. addnewItemAction,
    5. deleteItemAction
    6. } from './store/actionCreators'
    7. // 在创建 action 时候,我们就可以通过 actionCreator 中的方法 ,统一进行创建了
    8. handleInputChange = e => {
    9. console.log(e.target.value)
    10. // const action = {
    11. // type: CHANGE_INPUT_VALUE,
    12. // value: e.target.value
    13. // }
    14. const action = getInputChangeValueAction(e.target.value)
    15. store.dispatch(action)
    16. }
    17. handleAddItem = () => {
    18. // const action = {
    19. // type: ADD_TODOITEM
    20. // }
    21. const action = addnewItemAction()
    22. store.dispatch(action)
    23. }
    24. handleDeleteItem = index => {
    25. console.log('delete action', index)
    26. // const action = {
    27. // type: DELETE_TODOITEM,
    28. // value: index
    29. // }
    30. const action = deleteItemAction(index)
    31. store.dispatch(action)
    32. }