Redux学习笔记(一)

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。

使用Redux应该遵循一下原则:

  1. 整个应用共享的state应该存储在store的状态树中,store是唯一的;
  2. state不能直接修改,只能通过action表达修改的意图,调用dispatch()修改state;
  3. state的修改规则reducers必须是一个纯函数,不能有副作用。

Redux提供的API

createStore

createStore方法的作用就是创建一个 Redux store 来以存放应用中所有的 state。

createStore(reducer, [preloadedState], [enhancer])

createStore方法接受三个参数 ,后面两个是可选参数:

reducer :参数的类型必须是 function。

preloadedState : 这个参数代表初始化的state(initState),可以是任意类型的参数。

enhancer : 这个参数代表添加的各种中间件,参数的类型必须是function。

中间的preloadedState参数可以直接省略不写,redux已经对这种情况做了处理:

/*
*如果第二参数preloadedState 是function,且第三个参数enhancer 省略,
*把第二个参数赋值给enhancer
*/
if (typeof preloadedState === ‘function‘ && typeof enhancer === ‘undefined‘) {
    enhancer = preloadedState
    preloadedState = undefined
} 

createStore提供的方法:

getState() :

返回当前的state,利用闭包获得currentState。

subscribe(listener) :

订阅事件,传入的参数listener必须是一个函数。主要作用是当state发生改变的时候,能够得到通知,通过subscribe,传入的监听函数在dispatch函数中会全  部执行一次。

返回值是一个函数,执行返回的函数会从listeners中移除当前的listener。这里也是利用了闭包。

  function subscribe(listener) {   //判断listenner是不是一个函数
    if (typeof listener !== ‘function‘) {
      throw new Error(‘Expected listener to be a function.‘)
    }
    //定义这个变量是防止已经从listeners中移除的listener再次取消订阅
    let isSubscribed = true

    ensureCanMutateNextListeners()
    nextListeners.push(listener)
    //利用闭包,取消订阅
    return function unsubscribe() {
      if (!isSubscribed) {
        return
      }

      if (isDispatching) {
        throw new Error(
          ‘You may not unsubscribe from a store listener while the reducer is executing. ‘ +
            ‘See http://redux.js.org/docs/api/Store.html#subscribe for more details.‘
        )
      }

      isSubscribed = false

      ensureCanMutateNextListeners()
      const index = nextListeners.indexOf(listener)
      nextListeners.splice(index, 1)
    }
  }

dispatch(action) :

参数action必须是一个对象,且必须含有type字段;

作用:执行reducer,修改store里面的数据;执行订阅函数。

  function dispatch(action) {   //检查传入的action是不是一个对象
    if (!isPlainObject(action)) {
      throw new Error(
        ‘Actions must be plain objects. ‘ +
          ‘Use custom middleware for async actions.‘
      )
    }
  //检查传入action是否有type字段
    if (typeof action.type === ‘undefined‘) {
      throw new Error(
        ‘Actions may not have an undefined "type" property. ‘ +
          ‘Have you misspelled a constant?‘
      )
    }

    if (isDispatching) {
      throw new Error(‘Reducers may not dispatch actions.‘)
    }
    //执行reducer
    try {
      isDispatching = true
      currentState = currentReducer(currentState, action)
    } finally {
      isDispatching = false
    }
    //执行订阅函数
    const listeners = (currentListeners = nextListeners)
    for (let i = 0; i < listeners.length; i++) {
      const listener = listeners[i]
      listener()
    }

    return action
  }

replaceReducer(nextReducer) :

动态的替换当前的reducer

  function replaceReducer(nextReducer) {
    if (typeof nextReducer !== ‘function‘) {
      throw new Error(‘Expected the nextReducer to be a function.‘)
    }

    currentReducer = nextReducer
    dispatch({ type: ActionTypes.REPLACE })
  }

observable():

这个方法查阅其他资料解释的是配合其他特点的框架或编程思想来使用的,如rx.js,一般用不到

这个方法我也不太懂 - -#,官方推荐的学习渠道 https://github.com/tc39/proposal-observable

  function observable() {
    const outerSubscribe = subscribe
    return {
      subscribe(observer) {
        if (typeof observer !== ‘object‘) {
          throw new TypeError(‘Expected the observer to be an object.‘)
        }

        function observeState() {
          if (observer.next) {
            observer.next(getState())
          }
        }

        observeState()
        const unsubscribe = outerSubscribe(observeState)
        return { unsubscribe }
      },

      [$$observable]() {
        return this
      }
    }
  }

createStore总共暴露了五个API:

  • dispatch
  • subscribe
  • getState
  • replaceReducer
  • [$$observable]: observable

前三个是常用的API

时间: 2024-08-03 13:55:27

Redux学习笔记(一)的相关文章

React+Redux学习笔记:React+Redux简易开发步骤

前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文章:Redux学习笔记:Redux简易开发步骤 而React+Redux是以上两部分结合起来,方便在React中使用Redux,专用库为React-Redux.js.React-Redux.js新增了一些新方法: Provider:容器跟组件,可直接把外部的state传递给所有子组件和UI组件: m

React Redux学习笔记

React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性概览 ant ant.design rekit 先记录两篇博文,等有时间,整理一篇

Redux学习笔记(二) Reducer

Action只是描述了有事情发生了这一事实,并没有指明应用如何更新 state.这是 reducer 要做的事情. reducer 就是一个函数,接收旧的 state 和 action,返回新的 state. function todos(state = [], action) { switch (action.type) { case ADD_TODO: return [...state, { text: action.text, completed: false }];default: re

Redux学习笔记------数据流

严格的单向数据流-----核心 单向的数据流使得应用中的数据遵循相同的生命周期 redux的生命周期 1.调用 store.dispatch(action). 2.Redux store 调用传入的 reducer 函数. Store 会把两个参数传入 reducer: 当前的 state 树和 action. 3.根 reducer 应该把多个子 reducer 输出合并成一个单一的 state 树. combinReducer() let todoApp = combineReducers(

redux学习笔记

3.6 Reducer Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化.这种 State 的计算过程就叫做 Reducer. Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State. 3.3 Action State 的变化,会导致 View 的变化.但是,用户接触不到 State,只能接触到 View.所以,State 的变化必须是 View 导致的.Action 就是 View 发出的通知,表

Redux学习笔记-基础知识

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Helvetica Neue"; color: #404040 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #737373 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "

redux异步操作学习笔记

摘要: 发觉在学习react的生态链中,react+react-router+webpack+es6+fetch等等这些都基本搞懂的差不多了,可以应用到实战当中,唯独这个redux还不能,学习redux还学的挺久的. 其中困扰我最久的就是redux的异步数据流的处理.难点主要是概念太多,接触的词太多,而且网上的案例看的头都疼,很容易晕,已经晕了好多次了.后来被我简化之后,终于搞懂了,哈哈.!来来来,今天总结一下,希望对大家有所帮助.不过本人主要是介绍redux的异步操作,如果对redux不是很熟

udacity android 学习笔记: lesson 4 part b

udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文採用下面协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Mar

redux-form的学习笔记

redux是一种常用的与react框架搭配的一种数据流架构,而伴随着redux的出现,也出现了许多基于redux开源的第三方库,而redux-form就是其中之一的开源组件库,到今天我写下这篇笔记为止,在github上获得了5580颗star和654颗的fork数,今天就写一下我的redux-form的学习笔记吧 左转redux-form的api文档地址:http://redux-form.com/6.5.0/docs/api/ 1第一件要做的事当然是安装依赖啦,通过终端进入项目所在目录,写入n