redux

198 阅读2分钟

action

  • Action 本质上是 JavaScript 普通对象。我们约定,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作。多数情况下,type会被定义成字符串常量。当应用规模越来越大时,建议使用单独的模块或文件来存放 action
    • type 字符串常量 命名: 表示要执行的动作
    • 除了 type 字段外,action 对象的结构完全由你自己决定, 参考链接
  • action 创建函数
   const addTodo = text => ({
       type: 'ADD_TODO',
       payload: {
           text
       }
   })
  • 它是 store 数据的唯一来源

  • 一般来说你会通过 store.dispatch() 将 action 传到 store。

  • Redux 中只需把action 创建函数的结果传给 dispatch() 方法,即可发起一次dispatch过程

    • 直接调用
        dispatch(addTodo(text))
    
    • 或者创建一个 被绑定的action创建函数 来自动 dispatch
        const boundAdd = text => dispatch(addTodo(text))
        // 然后直接调用它
        boundAdd(text)
    
  • store 里能直接通过 store.dispatch() 调用 dispatch() 方法

  • 多数情况下你会使用 react-redux 提供的connect() 帮助器来调用。

  • bindActionCreators() 可以自动把多个 action 创建函数 绑定到 dispatch() 方法上


reducer 指定应用状态的变化如何响应actions并发送到store

设计State结构

  • 所有的 state 都被保存在一个单一对象中
    {
        visibilityFilter: 'SHOW_ALL',
        todos: [
            {
                text: 'Consider using Redux',
                completed: true
            },
            {
                text: 'Keep all state in a single tree',
                completed: false
            }
        ]
    }
  • 纯函数 (state, action) => state

  • action 如何把state 转变成下一个 state

  • state 类型可以是基本类型、数组、对象, 并且state变化是需要返回全新的对象。而不是修改传入的参数

⚠️ 不要修改 state 。 使用Object.assign({}, state, {...}),或者ES7的展开运算符{...state, ...newState}, 总之,不要修改state

⚠️ 在 default 情况下返回旧的state

    import { combineReducers } from 'redux'
    import * as reducers from './reducers'
    
    const todoApp = combineReducers(reducers)

store 存放应用状态

    import {createStore} from 'redux'
    
    let store = createStor(// reducers中的纯函数)

页面链接

    const mapStateToProps = state => {
        return {
            todos: getVisibleTodos(state.todos, state.visibilityFilter)
        }
    }

    const mapDispatchToProps = dispatch => {
        return {
            onTodoClick: id => {
              dispatch(toggleTodo(id))
            }
        }
    }
    const VisibleTodoList = connect(
        mapStateToProps,
        mapDispatchToProps
    )(TodoList)

connect

复杂的redux应用可以将connect 从组件中拆分出来,放到一个connect.js中
然后在组件中引用

  • 明显看出代码简洁很多

ps: 项目比较小的时候,没有太多页面间状态共通的时候,尽量不要用redux

2018.8.22

   {
        //执行createStore其实返回的就是这些东东
        dispatch,       //触发action去执行reducer,更新state
        subscribe,     //订阅state改变,state改变时会执行subscribe的参数(自己定义的一个函数)
        getState,      //获取state树
        replaceReducer,       //替换reducer
        [?observable]: observable         
        //redux内部用的,对我们来说没用 
    }

em~就酱~~~