Web前端之路

回顾总结React-Redux——给当年初次了解Redux的自己

2019-10-14  本文已影响0人  虚拟J

初次了解Redux的时候,看Redux中文文档有点懵。到之后看的书多了后,重新回顾文档感觉很简单,只是当初思路没有理顺,现在重新整理一下————给当年初次了解Redux的自己

如果你不知道是否需要 Redux,那就是不需要它。只有遇到 React 实在解决不了的问题,你才需要 Redux 。

一.Flux架构:

Flux是由Facebook开发的用于React应用程序数据流的架构模式。FLux的主旨是单向数据流,消除MVC类似模式的复杂性。

Flux架构使数据单向流向(从数据储存到视图),从而简化了数据流

单向数据流可以更好地进行测试和调试。

二.Redux:

2015年,Redux 由 Flux 演变而来,但受 Elm 的启发,避开了 Flux 的复杂性,是Flux架构最流行的实现之一——JavaScript应用程序的可预测状态容器。

Redux的核心概念是:数据state不能随意修改,唯一改变state的方法是必须发起一个action(一个描述发生了什么事的对象),声明描述所要进行的变化(这样子的好处是可以清晰地知道应用中到底发生了什么)。reducer 只是一个接收先前 state 和 action,并返回新 state 的一个纯函数。

reducer保持纯净非常重要,永远不要在 reducer 里做这些操作:
1.修改传入参数。
2.执行有副作用的操作,如 API 请求和路由跳转。
3.调用非纯函数,如 Date.now() 或 Math.random()。

import { reducers1} from 'reducers1'
import { combineReducers } from 'redux'
const reducers = combineReducers({
      reducers1,
    // more reducers
})
export default reducers

随着应用的膨胀,可以将reducer 拆分放到不同的文件中, 以保持其独立性并用于专门处理不同的数据域。用combineReducers辅助函数,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore 方法。( 注意每个 reducer 只负责管理全局 state 中它负责的一部分。每个 reducer 的 state 参数都不同,分别对应它管理的那部分 state 数据。)

下面关键点再理一下:

import { createStore } from 'redux'

const action= {
  type : ADD_DATA  , 
  data : 'Add a data'
}

function reducers ( state={}, action ) {
    switch (action.type) {
      case ADD_DATA:
        return { ...state, data:action.data}
      default:
        return state
     }
}

const store= createStore(reducers);
// dispatch 一个 action 到 Store
store.dispatch( action )

三.React-Redux

React-Redux 是 Redux官方提供的 React 绑定库。提醒一下:Redux 和 React 之间没有关系。Redux 支持 React、Angular、Ember、jQuery 甚至纯 JavaScript。

下面React应用中使用Redux时涉及的一些主要模块:

启用Redux:

import React from 'react'
import { render } from 'react-dom'
import { Provider } from'react-redux'
import { createStore } from'redux'
import reducers from './reducers'
import App from './components/App'

render(
  <Provider store={createStore(reducers)}>
    <App/>
  </Provider>,
  document.getElementById('root')
)

<Provider>作为顶层组件意味着所有的子节点都可以访问数据存储。里面大概用到了React 的一个api:Context。Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

将数据连接到数据存储:

Provider有将数据带入组件的功能,但要访问数据,需要明确地将组件连接到数据存储。使用connect(),记住state是connect()的第一个参数。

import { connect } from 'react-redux'

export default const APP= connect (
    ( state ) =>({ ...state }),
  ) (APP)

connect是一个高阶组件(HOC),是将组件转换为另一个组件,是 React 中用于复用组件逻辑的一种技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。

分发操作:

要修改数据存储中的数据,需要分发操作。一旦将组件连接到数据存储,就可以收到已经映射到某些应用状态的属性,而且还会收到dispatch属性。

//在你需要的事件中触发就好了
this.props.dispatch({
    type : ADD_DATA  ,
    data :  'Add a data'
})

也可以使用connect()函数的第二个参数作为方法传递,通过属性来引用,这样就不必使用dispatch( )来传递操作。

上面的目前只是同步操作,每当 dispatch action 时,state 会被立即更新。那Redux 究竟是如何处理异步数据流的呢?——Redux 中间件redux-sagas(正在梳理中)

上一篇 下一篇

猜你喜欢

热点阅读