欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

React Redux

程序员文章站 2024-01-20 12:43:28
...

学习目标

  • Redux基本知识
  • Redux基本用法

Redux组成

Redux是Flux的脚本库,包含Action,Action生成器、Store、以及用于修改State的Action对象。

Redux对Flux概念进行简化(移除Dispatcher),同时引入Reducer(纯函数)。Reducer 根据当前的State和Action返回一个新的State:(state, action) => newState。

Redux 设计原则
  • 单向数据流
  • 唯一数据源
  • 保持状态可读
  • 组件数据的改变只能通过Reducer完成
Redux 工作流
 
 
React Redux
 
  • store http://cn.redux.js.org/docs/basics/Store.html

    • 形式为 (state, action) => state 的纯函数。

    • 描述了 action 如何把 state 转变成下一个 state。

    • state 的形式取决于你,可以是基本类型、数组、对象

    • 要点:当 state 变化时需要返回全新的对象,而不是修改传入的参数。

    • store方法

      • getState()

      • dispatch(action)

      • subscribe(listener)

      • replaceReducer(nextReducer)

使用之前需要新建仓库,仓库依赖于reducer函数。

const store = createStore(reducer);
  • reducer

Reducer:纯函数,接收2个参数。第一个参数:state(累积对象)。第二个参数:action。Reducer函数根据action.type的不同对旧state进行操作,最后返回新的state。这个state是下一次的累积对象。

  • 形式为 (state, action) => state 的纯函数。
  • 描述了 action 如何把 state 转变成下一个 state。
  • state 的形式取决于你,可以是基本类型、数组、对象
  • 要点:当 state 变化时需要返回全新的对象,而不是修改传入的参数。
const reducer = function(state = {num:0}, action) {
    switch(action.type) {
        case "add":
            state.num++;
            break;
        case "decrement":
            state.num--;
            break;
        default:
            break;
    }
    return {...state}; // 重点(重新结构,创建新的对象) 相当于对象的COPY
    // return state; // 新版本这样写没有问题
}

type是action的必须参数,用来说明操作。state包含数据。

function add() { // 通过仓库方法dispatch 修改数据
    // 修改数据(通过动作修改数据)
    store.dispatch({type:"add", content:{id:1,msg:"helloworld"}})
    console.log(store.getState())
}
function decrement() { // 通过仓库方法dispatch 修改数据
    store.dispatch({type:"decrement"})
    console.log(store.getState())
}

store通过dispatch分发 action。这是触发 state 变化的惟一途径。

 

解决React数据管理(状态管理),用于中大型,数据比较庞大,组件之间数据交互多的情况下使用。如果你不知道是否需要使用Redux,那么你就不需要用它!

  • 解决组件的数据通信。

  • 解决数据和交互较多的应用

Redux只是一种状态管理的解决方案!

  • Store:数据仓库,保存数据的地方。

  • State:state是1个对象,数据仓库里的所有数据都放到1个state里。

  • Action:1个动作,触发数据改变的方法。

  • Dispatch:将动作触发成方法

  • Reducer:是1个函数,通过获取动作,改变数据,生成1个新state。从而改变页面

安装:cnpm install redux --save

实例一 计数器增加/减少

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';


//用于通过动作,创建新的state
const reducer = function(state = {num:0}, action) {
    switch(action.type) {
        case "add":
            state.num++;
            break;
        case "decrement":
            state.num--;
            break;
        default:
            break;
    }
    return {...state}; // 重点(重新结构,创建新的对象) 相当于对象的COPY
    // return state; // 新版本这样写没有问题
}
//创建仓库
const store = createStore(reducer);


function add() { // 通过仓库方法dispatch 修改数据
    // 修改数据(通过动作修改数据)
    store.dispatch({type:"add", content:{id:1,msg:"helloworld"}})
    console.log(store.getState())
}
function decrement() { // 通过仓库方法dispatch 修改数据
    store.dispatch({type:"decrement"})
    console.log(store.getState())
}
//函数计数器
const Counter = function(props) {
    let state = store.getState(); //获取数据
    return (
        <div>
            <h1>计数数量:{state.num}</h1>
            <button onClick={add}>加1</button>
            <button onClick={decrement}>减1</button>
        </div>
    )
}
ReactDOM.render(
    <Counter />,
    document.querySelector('#root')
)
//修改视图(监听数据的变化,重新渲染内容)
store.subscribe(() => { // 监听数据改变,页面会同步改变
    ReactDOM.render(
        <Counter />,
        document.querySelector('#root')
    )
})

React Redux

实例二 Redux简单实例

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore} from 'redux';

const reducer = function(state = {num:1}, action) {
    switch (action.type) {
        case 'add':
           state.num = addNum(state.num)
            break;
        case 'decrement':
            state.num--
            break;
        default:
            break;
    }
    return {...state};
}

const store = createStore(reducer);

function add() {
    store.dispatch({type:"add"})
}
function addNum(n) {
    return n+1;
}
function HandleDecr() {
    const action = {
        type: 'decrement'
    }
    store.dispatch(action)
}

const CounterCom = function () {
    let state = store.getState(); // 获取当前数据
    console.log(state)
    return (
        <div>
            <button onClick={HandleDecr}>-</button>
            <span>{state.num}</span>
            <button onClick={add}>+</button>
        </div>
    )
}

ReactDOM.render(
    <CounterCom/>,
    document.querySelector('#root')
)

store.subscribe(() => {
    ReactDOM.render(
        <CounterCom/>,
        document.querySelector('#root')
    )
})

加、减对应2种写法,减法是标准的写法,加法是通过函数实现,说明可以通过回调函数实现。

相关标签: React react