美文网首页redux
强大的状态管理器Redex

强大的状态管理器Redex

作者: 又菜又爱分享的小肖 | 来源:发表于2021-10-11 14:09 被阅读0次

    Redux是什么?

    • redux 是一个专门用于做状态管理的JS库(不是react插件库),学过vue框架的应该知道和vuex差不多。
    • 它可以用在reactangularvue等项目中,但基本与react配合使用。
    • 作用: 集中式管理react应用中多个组件共享的功能。

    三大原则

    image.png
    单一数据源
    • 整个应用的state被存储在一个对象树中, 并且这个对象树只存在一个唯一的store
    State是只读的
    • 唯一改变state的方法简书触发action, 让action去修改state, action是一个用于描述已发生事件的普通对象
      这样就确保了视图和网络请求都不能直接的修改state, 让所以的修改都被集中化处理
    使用纯函数来执行修改
    • 为了描述 action 如何改变 state tree ,你需要编写 reducers
      Reducer 只是一些纯函数,它接收先前的 state 和 action,并返回新的 state。刚开始你可以只有一个 reducer,随着应用变大,你可以把它拆成多个小的 reducers,分别独立地操作 state tree 的不同部分,因为 reducer 只是函数,你可以控制它们被调用的顺序,传入附加数据,甚至编写可复用的 reducer 来处理一些通用任务,如分页器。

    Redux成员及数据流

    • actions
      • actions其实是描述操作的对象,我们调用dispatch时需要传入此对象。
    • store
      • store是整个应用的数据存储仓库,把我们全局管理的状态数据存储起来。
    • reducers
      • reducers接收actions并更新store
    Redux数据流的走向
    image.png
    Redux中最核心的API -- createStore

    Store与Reducers建立联系

    • store可以相当于是一个工厂
    • reducers可以相当于是工厂里面干活的机器
    import { createStore } from 'redux';
    const store = createStore(reducers);
    

    通过 createStore方法创建的是一个对象, 他本身包含4个方法.

    • getState(): 获取store中当前的状态
    • dispatch(): 分发一个action, 并返回这个action, 这是唯一能改变store中数据的方式
    • subscribe(listener): 注册一个监听者, 它在store发生变化时被调用
    • replaceReducer(nextReducer): 更新当前store里的reducer, 一般只会在开发模式中调用该方法
    // 导入createStore
    import { createStore } from 'redux';
    
    const firstReducer = (state = 0, action) => {
        switch (action.type) {
            case 'add':
                return state + 1;
            case 'reducer':
                return state - 1;
            default:
                return state;
        }
    }
     // 建立联系
    const store = createStore(firstReducer);
    
    export default store;
    

    使用dispatch & getState

    import React, { Component } from 'react';
    import store from './store'
    class FirstReducer extends Component {
        add = () => {
            store.dispatch({ type: 'add' })
        }
        reducer = () => {
            store.dispatch({ type: 'reducer' })
        }
        render() {
            return (
                <div>
                    总数:{store.getState()}
                    <button onClick={this.add}>加1</button>
                    <button onClick={this.reducer}>减1</button>
                </div>
            );
        }
    }
    
    export default FirstReducer;
    

    react-redux

    • 由于redux的写法太繁琐, 还每次都需要重新调用render, 不太符合我们了解react编程
    • react-redux问世, 安装react-redux: npm install react-redux --save
    • react-redux提供两个api供我们使用
      • Provider 顶级组件, 功能为我们提供数据
      • connect 高阶组件, 功能为提供数据和方法

    通过props的方法来传输数据

    import React, { Component } from 'react'
    import { connect } from 'react-redux';
    
    const mapStateToProps = (state) => {
      return {
        count: state
      }
    }
    
    const mapDispatchToProps = (dispatch) => {
      return {
        add: () => {
          dispatch({type: 'add'})
        },
        reducer: () => {
          dispatch({type: 'reducer'})
        }
      }
    }
    class App extends Component {
      render() {
        return (
          <div>
            App
            {this.props.count}
            <button onClick={() => this.props.add()}>加1</button>
            <button onClick={() => this.props.reducer()}>减1</button>
          </div>
        )
      }
    }
    
    export default connect(mapStateToProps, mapDispatchToProps)(App);
    
    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App';
    import store from './redux/store';
    import { Provider } from 'react-redux';
    ReactDOM.render(
      <Provider store={store}>
          <App/>
     </Provider> , document.querySelector('#root'));
    
    redux中间件
    • 由于redux reducer默认只⽀持同步,实现异步任务或者延时任务
      时,我们就要借助中间件的⽀持了
    • 没使用中间件时的redux数据流


      image.png
    • 使⽤了中间件middleware之后的redux数据流
    image.png
    • redux-thunk 支持我们reducer在异步操作结束后自动执行
    npm i redux-thunk --save
    
    • redux-logger打印日志记录协助本地调试
    npm i redux-logger --save
    
    import { createStore,applyMiddleware } from 'redux'
    import logger from 'redux-logger'
    import thunk from 'redux-thunk'
    const fitstReducer = (state=0,action ) => {
     console.log(action)
     switch(action.type){
     //当传⼊action的type为add的时候给state+1
     case 'add' :
     return state+1;
     //当传⼊action的type为reduce的时候给state-1
     case 'reduce' :
     return state-1;
     //当传⼊的都不是以上的类型是返回旧的state
     default:
     return state;
     }
    }
    //创建数据仓库,把我们编写的reducer作为参数传⼊createStore
    //有⼀个注意点就是logger最好放在最后,⽇志最后输出才不会出
    //bug,因为中间件时按顺序执⾏
    const store=createStore(fitstReducer,applyMiddleware(thunk,logger))
    export default store
    

    相关文章

      网友评论

        本文标题:强大的状态管理器Redex

        本文链接:https://www.haomeiwen.com/subject/jdstgltx.html