Redux的实现原理

Redux是将所有的状态进行集中管理,当需要更新状态的时候,仅需要要对在管理集中处理,而不用关心状态是如何分发的每一个组件内部的

       Redux就是一个实现集中管理的容器,遵循三大基本原则:

              单一数据源

              State是只读的

              使用纯函数来执行修改

工作原理:

              Redux要求我们吧数据放在store公共存储空间

              一个组件改变了store里面的数据内容,其它组件都能感知到store的变化,再来取数据,从而间接的实现了这些数据传递的功能

Redux的执行流程如下:

        

        1. 创建Store:首先,需要通过Redux的`createStore`函数来创建一个Store对象。这个函数接受一个reducer作为参数,用于处理不同的action。

        2. 定义Reducer:Reducer是一个纯函数,用于根据当前的state和action来计算新的state。它接受两个参数:当前的state和action,然后返回一个新的state。

        3. 分发Action:通过调用Store对象的`dispatch`方法来分发一个action。action是一个普通的JavaScript对象,它必须包含一个`type`属性,用于指定要执行的操作类型。

        4. 调用Reducer:当一个action被分发后,Redux会自动调用reducer函数,并将当前的state和action传递给它。Reducer根据action的类型来执行相应的操作,并返回一个新的state。

        5. 更新State:Redux会将Reducer返回的新的state保存起来,成为新的当前state。

        6. 通知订阅者:当state发生变化时,Redux会通知所有的订阅者,让它们可以获取到最新的state并进行相应的操作。

        7. 监听State变化:可以通过调用Store对象的`subscribe`方法来注册一个监听函数,以便在state发生变化时得到通知。

        通过这个执行流程,Redux实现了状态的管理和更新。每当需要更新状态时,只需要分发一个action,然后通过Reducer计算得到新的state,最后通知订阅者进行相应的操作。这种单向数据流的设计模式使得状态管理更加可控和可预测

手写redux原理:

let createStore =(reducer)=>{
    let state
    //存放所有的监听函数
    let listeners =[]
    let getState=()=>state
    //提供一个方法供外部调用派发action
    let dispatch =(action)=>{
        //调用管理员reducer得到新的state
        state = reducer(state,action);
        //执行所有的监听函数
        listeners.forEach((l)=>l())
    }
    //订阅状态变化事件,当状态改变发生之后执行监听函数
    let subScribe = (listener)=>{
        listeners.push(listener);
    }
    dispatch({type:'init'})
    return{
        getState,
        dispatch,
        subScribe,
    }

}

export default createStore
import createStore from ".././index";//引入创建的store


const countReducer = function(state=100,action){
    //判断类型 执行指定的操作
    switch (action.type) {
        case 'ADD':
            state =  state + 1
            return state
        case 'CUST':
            state =  state - 1
            return state 
        default:
            return state
    }
}

const store = createStore(countReducer) 

export default store //进行暴露
import React  from 'react'
import store from '../store/cart' //引入store
export default function Index3() {
    const add=()=>{
        store.dispatch({type:'ADD',state:'传递值'})
    }
  return (
    <div>
      {/* store.getState用来获取reducer中state的数据 */}
      {store.getState()} 
      <button onClick={add}>添加</button>
    </div>
  )
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值