/ reactjs / 32581浏览

「Redux初探」Rudex的工作流程

Redux的工作流程图


Store为公共数据的存储库。当组件需要更新Store中的数据时,需要分发一个Action告知Store,Store中没有逻辑,需要通过Reducer处理Action,经过Reducer处理过后返回新的状态,Store获取更新后的状态后Store更新,这时候组件需要订阅Storestore.subscribe(),当Store变更时会调用subscribe(),这时组件设置更新statethis.setState(store.getState()),实现store即视图实时更新的效果。

创建一个Store

存储数据的公共区域

//store.js
import { createStore } from 'redux'
import reducer from './reducer'
const store = createStore({
    reducer
})

创建一个Reducer

纯函数是指给定固定的输入则会有固定的输出且不会有任何副作用
即不可以使用类似日期或异步等会使结果发生变化的动作

//reducer.js
//设置Store的初始状态
const defaultStore = {
    inputValue: '',
    list: []
}
//Reducer必须是一个纯函数
export default (state = defaultStore, action) => {
  if (action.type === ADD_TODO_ITEM) {
      const newState = JSON.parse(JSON.stringify(state))
      newState.list.push(newState.inputValue)
      newState.inputValue = ''
      return newState
  }
    return state
}

ActionCreator

通常在项目中,action会通过函数来创建,这便于我们后续测试

//actionCreatore.js
import {
  //引入定义好的常量
  CHANGE_INPUT_VALUE,
  ADD_TODO_ITEM
  ...
} from "./actionTypes";

export const getInputChangeAction = value => ({
  type: CHANGE_INPUT_VALUE,
  value
})

export const getAddTodoItemAction = () => ({
  type: ADD_TODO_ITEM
})
...
//actionTypes.js
export const CHANGE_INPUT_VALUE = 'change_input_value'
export const ADD_TODO_ITEM = 'add_todo_item'
...

创建一个Component

//TodoList.js
import React, { Component } from 'react'
import {
  getAddTodoItemAction
  ...
} from './store/actionCreator'

class TodoList extends Component {
    constructor(props) {
        super(props)
        this.state = store.getState()
        this.handleAddTodoItem.bind(this)
        ...
        this.handleStoreChange = this.handleStoreChange.bind(this)
        store.subscribe(this.handleStoreChange) //订阅store,当store发生变化时subscribe会被调用
    }
    handleAddTodoItem() {
        const action = getAddTodoItemAction()
        store.dispatch(action)
    }
    ...
    //处理store变化
    handleStoreChange() {
        this.setState(store.getState()) //当store变更时重新设置state
    }
}
export default TodoList
更新于
「redux-thunk」引入redux-thunk
「redux-thunk」引入redux-thunk

0

  1. This post has no comment yet

发表回复