Redux原理

本文探讨了React的工作原理及存在的组件通信问题,然后深入解析Redux的运作方式,包括其保持单一数据源、状态只读以及通过纯函数更新状态的三大原则。Redux通过Store、State、Action、store.dispatch()和Reducer等核心组件实现状态管理,其中Store存储全局状态,Action描述状态变化,Reducer则负责根据Action生成新的状态。
1. React工作原理与缺点

在React中,数据在组件中是单向流动的,数据从一个方向父组件流向子组件(通过props),所以,两个非父子组件之间通信就相对麻烦,redux的出现就是为了解决state里面的数据问题

2. Redux工作原理

Redux是将整个应用状态存储到一个地方上称为store,里面保存着一个状态树store tree,组件可以派发(dispatch)行为(action)给store,而不是直接通知其他组件,组件内部通过订阅store中的状态state来刷新自己的视图。
在这里插入图片描述

3. Redux三大原则
  1. 唯一数据源
  2. 保持只读状态
  3. 数据改变只能通过纯函数来执行

唯一数据源:

整个应用的state都被存储到一个状态树里面,并且这个状态树,只存在于唯一的store中。

保持只读状态:

state是只读的,唯一改变state的方法就是触发action,action是一个用于描述以发生时间的普通对象。

数据改变只能通过纯函数来执行:

使用纯函数来执行修改,为了描述action如何改变state的,需要编写reducers。

4. Redux组成解析
4.1 Store

store就是保存数据的地方,你可以把它看成一个数据,整个应用智能有一个store
Redux提供createStore这个函数,用来生成Store

import {createStore} from 'redux'
const store=createStore(fn);
4.2 State

state就是store里面存储的数据,store里面可以拥有多个state,Redux规定一个state对应一个View,只要state相同,view就是一样的,反过来也是一样的,可以通store.getState( )获取

import {createStore} from 'redux'
const store=createStore(fn);
const state=store.getState()
4.3 Action

state的改变会导致View的变化,但是在redux中不能直接操作state也就是说不能使用this.setState来操作,用户只能接触到View。在Redux中提供了一个对象来告诉Store需要改变state。Action是一个对象其中type属性是必须的,表示Action的名称,其他的可以根据需求自由设置。

const action={
  type:'ADD_TODO',
  payload:'redux原理'
}

在上面代码中,Action的名称是ADD_TODO,携带的数据是字符串‘redux原理’,Action描述当前发生的事情,这是改变state的唯一的方式

4.4 store.dispatch( )

store.dispatch( )是view发出Action的唯一办法

store.dispatch({
  type:'ADD_TODO',
  payload:'redux原理'
})

store.dispatch接收一个Action作为参数,将它发送给store通知store来改变state。

4.5 Reducer

Store收到Action以后,必须给出一个新的state,这样view才会发生变化。这种state的计算过程就叫做Reducer。
Reducer是一个纯函数,他接收Action和当前state作为参数,返回一个新的state

注意:Reducer必须是一个纯函数,也就是说函数返回的结果必须由参数state和action决定,而且不产生任何副作用也不能修改state和action对象

const reducer =(state,action)=>{
  switch(action.type){
    case ADD_TODO:
        return newstate;
    default return state
  }
}
5. Redux源码

里面的注释就是我一步一步的分析,有点懒没有把代码拆分出来给你们看

let createStore = (reducer) => {
    let state;
    //获取状态对象
    //存放所有的监听函数
    let listeners = [];
    let getState = () => state;
    //提供一个方法供外部调用派发action
    let dispath = (action) => {
        //调用管理员reducer得到新的state
        state = reducer(state, action);
        //执行所有的监听函数
        listeners.forEach((l) => l())
    }
    //订阅状态变化事件,当状态改变发生之后执行监听函数
    let subscribe = (listener) => {
        listeners.push(listener);
    }
    dispath();
    return {
        getState,
        dispath,
        subscribe
    }
}
let combineReducers=(renducers)=>{
    //传入一个renducers管理组,返回的是一个renducer
    return function(state={},action={}){
        let newState={};
        for(var attr in renducers){
            newState[attr]=renducers[attr](state[attr],action)

        }
        return newState;
    }
}
export {createStore,combineReducers};
React 中 Redux 的基本原理是一种状态管理框架,主要用于单页面应用 (SPA) 中维护数据流的一致性和可预测性。Redux 主要有以下几个核心组件: 1. **Store**(存储):它是整个应用的数据仓库,保存着全局的状态。Store 是一个单一来源的事实,所有的动作 (Actions) 都会被发送到 Store,然后更新状态。 2. **Reducer**(纯函数):Reducer 是一个接收当前状态和一个 Action,然后返回新状态的函数。它必须满足纯函数的要求,即给定相同的输入,始终返回相同的输出,并且不会修改外部状态。 3. **Action**(动作):是描述应用程序状态变化的不可变对象,通常包含一个 type 和 payload(可选)。通过触发 Action,你可以改变应用的状态。 4. **Dispatcher**(调度器):不是 Redux 内置的一部分,但在实践中通常用于分发 Actions。它是一个简单的中心化发布者,负责将 Actions 发送到感兴趣的组件或 Reducer。 5. **Connect**(连接):React 提供的 Higher-Order Component(HOC),使得组件能够访问 Store 的状态并响应状态的变化。当状态发生变化时,`connect` 会自动重新渲染组件。 Redux 的工作流程通常是这样的: - 用户操作引发 Action。 - Action 被发送到 Dispatcher,传递给 Store。 - Reducer 接收到 Action 和旧状态,计算出新的状态并返回。 - Store 更新了状态,触发 `store.subscribe` 注册的回调(如组件的 `componentDidUpdate`)。 - 通过 React 的 `setState` 或其他类似机制,更新 UI 显示新状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason_LS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值