手写一个react-redux,原理一目了然

2023-11-10

react-redux的功能如下:

  1. Provider 为后代组件提供store
  2. connect 为组件提供数据和变更方法
  3. 数据变化时自动更新组件

了解react-redux的功能移步这里

下面我们开始实现react-redux的几个功能:

//my-react-redux.js
import React, {useContext, useReducer, useLayoutEffect} from "react";
const Context = React.createContext(); //创建全局state

//1. 实现Provider组件:为后代组件提供store
export function Provider({store, children}) {
  return <Context.Provider value={store}>{children}</Context.Provider>;
}

//2. 实现connect方法:为组件提供数据和变更方法
export const connect = (
mapStateToProps = state => state,     //默认是一个方法
mapDispatchToProps
) => WrappendComponent => props => {  // WrappendComponent 是受益的组件
  const store = useContext(Context)
  const {dispatch, getState, subscribe} = store
  const stateProps = mapStateToProps(getState()) //获取需要的state
  let dispatchProps = { dispatch }
  // 让函数强制更新的方法
  const [ignored, forceUpdate] = useReducer(x => x + 1, 0);
  //mapDispatchToProps可以是function与object
  if (typeof mapDispatchToProps === "function") {
     dispatchProps = mapDispatchToProps(dispatch)
  } else if (typeof mapDispatchToProps === "object") {
     dispatchProps = bindActionCreators(mapDispatchToProps, dispatch)
  }
  //3. 实现同步副作用 state改变时自动更新组件
  useLayoutEffect(() => {
    //订阅state改变
    const unsubscribe = subscribe(() => {
       forceUpdate() //强制刷新
    })
    //返回一个 注销订阅函数
    return () => {
     if (unsubscribe) {
       unsubscribe()
     }
    }
  }, [store])
  //将state与dispatch映射到组件内 完成connect方法的任务
  return <WrappendComponent {...props} {...stateProps} {...dispatchProps} />
}

function bindActionCreator(creator, dispatch) {
  return (...args) => dispatch(creator(...args))
}
//@connect()装饰器内需要一个bindActionCreators方法
//作用是结构creators,只需写type即可自动实现dispatch方法,让creators写的更简单
function bindActionCreators(creators, dispatch) {
  const obj = {};
  for (let key in creators) {
    obj[key] = bindActionCreator(creators[key], dispatch)
  }
  return obj
}

了解@connect()装饰器移步这里

react-redux hooks API及实现

  1. useSelector 获取store state
  2. useDispatch 获取dispatch
import React, {useCallback} from "react"
import {useSelector, useDispatch} from "react-redux"
export default function ReactReduxHookPage({value}) {
const dispatch = useDispatch()
const add = useCallback(() => {
  dispatch({type: "ADD"})
}, [])
const count = useSelector(({count}) => count);
return (
   <div>
     <h3>{count}</h3>
     <button onClick={add}>add</button>
  </div>
)
}

实现hooks API:

export function useSelector(selector) {
  const store = useStore()
  const {getState, subscribe} = store
  const selectedState = selector(getState())
  const [ignored, forceUpdate] = useReducer(x => x + 1, 0);
  useLayoutEffect(() => {
    const unsubscribe = subscribe(() => {
     forceUpdate()
    });
    return () => {
     if (unsubscribe) {
       unsubscribe()
     }
   };
  }, [store])
  return selectedState
}
export function useDispatch() {
  const store = useStore()
  return store.dispatch
}
export function useStore() {
  const store = useContext(Context)
  return store
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手写一个react-redux,原理一目了然 的相关文章

随机推荐

  • Java 字符流和字符缓冲流

    文章目录 1 字符的编码解码 2 字符流 2 1 字符输出流 写数据 2 2 字符输入流 读数据 2 3 案例 3 字符缓冲流 3 1 字符缓冲输入流 读数据 3 2 字符缓冲输出流 写数据 3 3 案例 4 小结 1 字符的编码解码 wi
  • emWin - BMP图片显示

    BmpCvt exe 用途 利用BMP图片 进行GUI显示 ICON等图标都是小BMP图片 核心是将BMP图片 转成emWin支持的方式 最终显示到TFT屏上 使用BmpCvt exe工具 将各个图片转成相应的C文件 emWin有关的工具
  • 微信小程序练手项目(云开发)

    入门回顾 微信开放社区 https developers weixin qq com community develop doc 000c2e7a3d0c501c95b9c3c935640d 1 小程序 注册 使用 配置 2 小程序的逻辑层
  • Unity5.3资源热更新

    转载自 http blog csdn net l jinxiong article details 50877926 Unity5以下的版本 要导出AssetBundle需要自己写一大坨导出的代码 BuildPipeline 想正确处理好资
  • 教妹学Java(十七):do-while 循环

    大家好 我是沉默王二 一个和黄家驹一样身高 和刘德华一样颜值的程序员 本篇文章通过我和三妹对话的形式来谈一谈 do while 循环 教妹学 Java 没见过这么有趣的标题吧 语不惊人死不休 没错 本篇文章的标题就是这么酷炫 接受不了的同学
  • JS遍历对象的七种方法

    一 for in let obj name cheng sex man Object defineProperty obj age value 18 enumerable true for item in obj console log i
  • 苹果商店上架流程_App上架苹果流程及注意事项

    APP上架是 APP应用从提交审核到上架整个过程 目的是让应用展示在APP Store上获取流量及用户 一 IOS上架整个流程 1 申请开发者账号 2 创建APP ID及申请证书 3 itunes connect 创建APP 4 打包 上传
  • 小程序 video 组件播放本地视频(黑屏无法播放,报错:MEDIA_ERR_SRC_NOT_SUPPORTED)

    小程序播放本地视频 黑屏无法播放 报错 MEDIA ERR SRC NOT SUPPORTED
  • VS9(vs2008) 下 Debug 显示 UTF8 字符串

    默认的 VC调试器只能正常显示ANSI字符串及UNICODE字符串 而UTF 8字符串及其他格式则无法显示 这里无需编写插件及修改配置文件 只需要将要显示的字符串拉到Watch中 并在变量后面添加 s8即可显示 gt 同样类型的功能也应该很
  • Anaconda-tensorflow-keras安装方法学习

    目录 开发工具 Anaconda 下载 安装与配置 Anaconda 下载 Anaconda 安装 Anaconda 安装问题 Anaconda 添加清华镜像源 安装tensorflow 接着安装keras 使用Jupyter notebo
  • FI 总账科目(GL),应付款方(供应商),应收款方(客户)的主要数据库表流向及说明

    学习FI模块也有几天了 今天的视频冲击 现在基本有点模型了 现将整理好的成果依次发布出 首先说下该模块中主要数据流向 BSIK 是供应商的未清项表 BSAK 是供应商的已清项表 BSID 是客户的未清项表 BSAD 是客户的已清项表 BSI
  • CentOS利用expect批量推送ssh public key的脚本

    方法1 bin bash Author Razor QQ 254456122 Date 2021 10 29 FileName sshkey sh URL https blog csdn net mandarin meng spm 1019
  • 使用预训练模型运行DiffusionDetection

    工程链接 https github com ShoufaChen DiffusionDet DIffusionDet需要的基础环境及各种包都配置好了 接下来我们开始用Pre trained Model来运行demo py 1 打包下载工程
  • Shell脚本之read用法

    read 默认接受键盘的输入 回车符代表输入结束 read命令选项 p 打印信息 t 限定时间 s 不回显 n 输入字符个数 bin bash clear echo n e Login read acc read p Login acc e
  • python函数练习题讲解

    自学的知识 用来记录一下 练习 1 写一个打印一条横线的函数 提示 横线是若干个 组成 2 写一个函数 可以通过输入的参数 打印出自定义行数的横线 提示 调用上面的函数 3 写一个函数求三个数的和 4 写一个函数求三个数的平均值 提示 调用
  • va_start和va_end详解

    1 在C中 当无法列出传递函数的所有实参的类型和数目时 可以用省略号指定参数表 例如 void foo void foo parm list 2 函数参数的传递原理 函数参数是以栈的形式存取 从右至左入栈 参数的内存存放格式 参数存放在内存
  • 如何查看海思SDK的版本

    命令 cat proc umap vpss 效果如下 第一行的version就是版本信息
  • html学习——表格标签

    表格 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 table border 1px tr td 1 1 td td 1 2 td td 1 3 td tr tr td 2 1 td td 2 2 td td 2
  • css3直线运动_CSS3实现动画线条运动效果实例集合(一)

    在我们日常的开发中 有时候有的图片 布局块需要加一下边框运动效果 对于这些效果 我们可以使用CSS3动画属性animation 再配合css的一些技巧制作出来 下面是收藏的一些效果实例 1 边框流动效果 html css3效果的内容部分 c
  • 手写一个react-redux,原理一目了然

    react redux的功能如下 Provider 为后代组件提供store connect 为组件提供数据和变更方法 数据变化时自动更新组件 了解react redux的功能移步这里 下面我们开始实现react redux的几个功能 my