泛说Redux

一、Redux

什么时候才会需要用到Redux

Redux 是负责组织 state 的工具,但你也要考虑它是否适合你的情况。不要因为有⼈告诉你要用 Redux 就去用,花点时间好好想想使用了 Redux 会带来的好处或坏处。

在下面的场景中,引入 Redux 是⽐较明智的:

1.你有着相当⼤量的、随时间变化的数据;

2.你的 state 需要有一个单一可靠数据来源;

3.你觉得把所有 state 放在最顶层组件中已经⽆法满足需要了;

4.某个组件的状态需要共享;

redux 是 JavaScript应用的状态容器,提供可预测化的状态管理。它保证程序行为一致性且易于测试。


如何安装Redux

npm install redux --save

Redux举例

用一个累加器举例

1. 需要⼀个store来存储数据

2. store里的reducer初始化state并定义state修改规则

3. 通过dispatch⼀个action来提交对数据的修改

4. action提交到reducer函数里,根据传入的action的type,返回新的state

ReduxPage.js文件内容如下:

import React, { Component } from "react";

import store from "../store";

export default class ReduxPage extends Component {

    componentDidMount() {

        store.subscribe(() => {

            console.log("state发生了变化");

            this.forceUpdate();

        })

    }

    add = () => {

        store.dispatch({type: "ADD"})

    }

    minus = () => {

        store.dispatch({type: "MINUS"})

    }

    render() {

        console.log("store", store);

        return (

            <div>

                <h3>ReduxPage</h3>

                <p>{store.getState()}</p>

                <button onClick={this.add}>add</button>

                <button onClick={this.minus}>minus</button>

            </div>

        )

    }

}

store文件夹下面的index.js文件内容如下:

import { createStore } from "redux";

// 定义state初始化和修改规则,reducer是一个纯函数

function counterReducer(state = 0, action) {

    console.log("state", state);

    switch(action.type) {

        case "ADD":

            return state + 1;

        case "MINUS":

            return state - 1;

        default:

            return state;

    }

}

const store = createStore(counterReducer);

export default store;

如果点击按钮不能更新,因为没有订阅(subscribe)状态变更

检查点

1. 通过createStore 创建store

2. reducer 初始化、修改状态函数

3. getState 获取状态值

4. dispatch 提交更新

5. subscribe 变更订阅

二、react-redux

如何安装react-redux

npm install react-redux --save

如何使用react-redux

react-redux提供了如下两个api:

Provider 为后代组件提供store

connect 为组件提供数据和变更⽅法

全局提供store

index.js文件内容如下:

import React from 'react';

import ReactDOM from 'react-dom/client';

import App from './App';

import store from './store';

import { Provider } from 'react-redux'

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(

  <Provider store={store}>

    <App />

  </Provider>

);

App.js文件内容如下:

import ReactReduxPage from './pages/ReactReduxPage';

function App() {

  return (

    <div>

      <ReactReduxPage />

    </div>

  );

}

export default App;

store文件夹下面的index.js文件内容如下:

import { createStore } from "redux";

// 定义state初始化和修改规则,reducer是一个纯函数

function counterReducer(state = 0, action) {

    console.log("state", state);

    switch(action.type) {

        case "ADD":

            return state + 1;

        case "MINUS":

            return state - 1;

        default:

            return state;

    }

}

const store = createStore(counterReducer);

export default store;

connect中的参数:state映射和事件映射

ReactReduxPage.js文件内容如下:

方案1:

import React, { Component } from "react";

import { connect } from "react-redux"

export default connect(

    // mapStateToProps把state映射到props

    state => ({ num: state })

)

(class ReactReduxPage extends Component {

    render() {

        const { num, dispatch } = this.props;

        console.log("props", this.props); // {num: 0, dispatch: f}

        return (

            <div>

                <h3>ReactReduxPage</h3>

                <p>{num}</p>

                <button onClick={() => dispatch({type: "ADD"})}>add</button>

                <button onClick={() => dispatch({type: "MINUS"})}>minus</button>

            </div>

        )

    }

})

方案2:

import React, { Component } from "react";

import { connect } from "react-redux"

class ReactReduxPage extends Component {

    render() {

        const { num, add, minus } = this.props;

        console.log("props", this.props); // {num: 0, add: f, minus: f}

        return (

            <div>

                <h3>ReactReduxPage</h3>

                <p>{num}</p>

                <button onClick={add}>add</button>

                <button onClick={minus}>minus</button>

            </div>

        )

    }

}

// mapStateToProps把state映射到props

const mapStateToProps = state => ({ num: state })

// mapDispatchToProps把dispatch映射到props

const mapDispatchToProps = {

    add: () => ({ type: "ADD" }),

    minus: () => ({ type: "MINUS" })

}

export default connect(

    mapStateToProps, // 状态映射

    mapDispatchToProps // 派发事件映射

)(ReactReduxPage);

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、什么情况需要redux? 1、用户的使用方式复杂 2、不同身份的用户有不同的使用方式(比如普通用户和管...
    初晨的笔记阅读 6,263评论 0 11
  • 一. 概述 React与Vue是我们熟悉的两大前端主流框架,来自官方的解释,Vue是一套用于构建用户界面的渐进式框...
    QiShare阅读 5,543评论 0 2
  • Redux进阶 1 Redux-thunk 中间件 GIthub地址: Redux-thunk 对Redux-th...
    ChuckieWIll阅读 1,832评论 0 0
  • (1) redux简介 reducer reducer 是一个计划函数,接收旧的 state 和 action,生...
    shelhuang阅读 3,535评论 0 0
  • 一. 纯原生 redux 的使用 Redux 是常用的状态管理容器,能够帮助我们对一些全局变量进行有效管理。首先,...
    林木木road阅读 6,169评论 0 2

友情链接更多精彩内容