阅读react-redux源码 - 零

  • 阅读react-redux源码 - 零
  • 阅读react-redux源码 - 一
  • 阅读react-redux源码(二) - createConnect、match函数的实现

react的技术栈一定会遇到redux,而在react中使用redux需要使用react-redux,那么react-redux是怎么包装redux已适用react的呢?

react-redux的原理是什么呢?

带着这些问题,翻看了react-redux的源码,小有收获,写博客以记,方便以后翻阅。

0. 准备

在继续之前先回顾一些redux、react和react-redux必要的知识。

redux

redux用于管理状态,可以响应状态的变化,简单描述下:

redux的createStore函数需要一个返回state的函数作为入参,这个函数被称作reducer。

调用createStore就能够得到一个store。这个store中就存储着state(reducer的返回值),并且可以通过store的subscribe方法来监听state的变化,当然也可以通过store提供的dispatch方法类修改state。

具体API如下:

// store.js
import { createStore } from 'redux'// 3. 下面store每dispatch一次reducer就会重新执行并计算一次state
function reducer(state = {a: 1}, action) {const { type, payload } = actionreturn payload
}// 0. 创建一个store
const store = createStore(reducer)// 1. 监听store中state的变更
store.subscribe((state) => {console.log(state)
})// 2. 发送一个action来通知reducer修改state
// {type: 'type1', payload: 1} 就是一个ation
store.dispatch({type: 'type1',payload: {a: 2}
})

react

react组件的更新原因可能是组件自身的state更新,组件的props更新,组件依赖的context更新导致的。但是放眼整个react应用的话,组件更新原因只有一个,就是祖先组件或者当前组件的state更新导致的。

react-redux

// App.js
import React, { Component } from 'react'
import { connect } from 'react-redux'class Example extends Component {render() {return <div onClick={this.props.dispatchA}>{this.props.a}</div>}
}function mapStateToProps(state) {return {...state}
}function mapDispatchToProps(dispatch) {return {dispatchA() => {dispatch({type: 'type', payload: {a: 10}})}}
}export default connect(mapStateToProps, mapDispatchToProps)(Example)

上面connect函数的调用返回了一个高阶组件,用高阶组件包裹Example组件之后就完成组件到redux的连接。

入口文件

// index.js
import { Provider } from 'react-redux'
import store from './store'
import App from './App.js'ReactDOM.render(<Privider store={store}><App /></Provider>)

可以看出来组件Example的props来自于父组件和store,再细分有父组件传给他的props和store的dispatch还有store的state。

小结

到这里我们有了一个redux的store,这个store会通过某些方法通知外部内部state的变化。

我们知道state的变化props的变化都会引起一个react组件的更新。

那么我们可以在store中state变化的时候通过设置组件state某个属性来通知组件有数据更新,然后组件更新的时候从store中拿到最新的数据用于render,理论上就可以实现在react应用中使用redux了。

1. 了解源码目录结构

在这里插入图片描述

该目录结构是react-redux@7.2.0版本的,其中我们主要关注connect文件夹和components文件夹下内容。connect目录下主要实现了connect方法,而component目录下则是用到的相关React组件,例如Provider和connect方法返回的高阶组件。

hooks目录则是redux的hooks用法的实现,utils则是用到的一些工具方法。

后面将重点阅读connect目录和componet目录下代码。

  • 阅读react-redux源码 - 零
  • 阅读react-redux源码 - 一
  • 阅读react-redux源码(二) - createConnect、match函数的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CORS(跨域资源共享)

CORS&#xff08;跨域资源共享&#xff09;使用额外的HTTP头部来告诉浏览器&#xff0c;允许运行在origin(domain)上的Web应用访问来自不同源服务器上的指定资源。 浏览器访问一个web应用&#xff0c;这个web应用会发很多的跨域请求&#xff0c;例如加载不同源的JS/CSS脚本&am…

[转]jQuery设计思想

转自&#xff1a;http://kb.cnblogs.com/page/109875/ jQuery是目前使用最广泛的javascript函数库。 据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。微软公司甚至把jQuery作为他们的官方库。 对于网页开发者来说&#xff…

敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...

这是敏捷开发绩效管理的第四篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff09;最近在看德鲁克的书&#xff0c;发现其中很明确地写着“企业的绩效只存在于外部&#xff0c;而企业内部只有成…

【K8S in Action】服务:让客户端发现pod 并与之通信(2)

一 通过Ingress暴露服务 Ingress (名词&#xff09; 一一进入或进入的行为&#xff1b;进入的权利&#xff1b;进入的手段或地点&#xff1b;入口。一个重要的原因是每个 LoadBalancer 服务都需要自己的负载均衡器&#xff0c; 以及 独有的公有 IP 地址&#xff0c; 而 Ingres…

一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导

警告&#xff1a;我不是Spring Boot的专家。 我发现很多事情对此非常有趣&#xff0c;并且当然可以真正改善您的日常工作。 而且&#xff0c;我对Spring Boot没有任何反对&#xff0c;也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前&#xff0c;我开始收到很多…

iview-admin框架运行步骤

第一步&#xff1a; 前往github下载整个iview-admin框架的全部源码 github地址&#xff1a; https://github.com/iview/iview-admin 第二步&#xff1a; 点击Clone or download绿色按钮。下载整个压缩包 第三步&#xff1a; 解压至D盘&#xff0c;在根目录中按 1、前往github下…

.net 垃圾回收学习[How To: Use CLR Profiler][翻译学习]【2】

http://msdn.microsoft.com/zh-cn/library/ms979205 注意&#xff1a;内容可能已经过期了。 注意&#xff1a;CLR Profiler最新版本&#xff1a;http://www.microsoft.com/download/en/details.aspx?id16273 Identifying Common Garbage Collection Issues 可以使用CLR Profil…

JavaOne 2014:会议与合同利益冲突

杜克街咖啡馆&#xff0c;工程师可以在街上进行走廊交谈 。 与签约不兼容 我的第11届JavaOne会议&#xff08;2004年至2014年为11 10 1&#xff09;非常出色。 值得参加此活动并结识社区中所有参与的人。 现在&#xff0c;这里是绅士的&#xff0c;但 。 除了经济上的明显优…

JQuery(三)-- AJAX的深入理解以及JQuery的使用

HTTP HTTP http: 超文本传输协议。特点&#xff1a; 简单、快速、灵活、无状态、无连接 URL&#xff1a; 统一资源定位符。 组成&#xff1a;协议名://主机IP&#xff1a;端口号/项目资源地址&#xff1f;传递参数的键值对#锚点 ①ip地址在同一个网段是唯一的。如果是在公…

JSF的工作方式和调试方式–可以使用polyglot吗?

JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架&#xff0c;尤其是在初次遇到时。 在这篇文章中&#xff0c;让我们继续探讨为什么会出现这种情况&#xff0c;并提供一些JSF调试技术。 我们将讨论以下主题&#xff1a; JSF不是我们经常想到的 JSF调试的难…

React组件实现越级传递属性

如果有这样一个结构&#xff1a;三级嵌套&#xff0c;分别是&#xff1a;一级父组件、二级子组件、三级孙子组件&#xff0c;且前者包含后者&#xff0c;结构如图&#xff1a; 如果把一个属性&#xff0c;比如color&#xff0c;从一级传递给三级&#xff0c;一般做法是使用prop…

尝试Office 2003 VSTO的开发、部署

背景&#xff1a;一年前&#xff0c;某项目需要使用到Excel进行数据录入&#xff0c;考虑到很多用户还是使用XPOffice 2003&#xff0c;所以开发的时候直接使用Excel 2003版本进行VBA开发。也许很多人都会说&#xff0c;Win10都出了&#xff0c;微软的Office都要免费了&#xf…

初级开发人员在编写单元测试时常犯的错误

自从我编写第一个单元测试以来已经有10年了。 从那时起&#xff0c;我不记得我已经编写了成千上万的单元测试。 老实说&#xff0c;我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中&#xff0c;我与多个开发团队合作…

OpenDaylight开发hello-world项目之开发工具安装

OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码框架搭建 在ODL开发之前&#xff0c;要安装好开发环境。ODL使用java语言开发&#xff0c;所以要安装好java。ODL的代码框架是有maven这个…

Google Chrome 扩展程序开发

根据公司的规定&#xff0c;每月八小时&#xff0c;弹性工作制。所以大家平时来的不太准时&#xff0c;如果有事&#xff0c;下班也就早些回去了。所以一个月下来工作时间可能不够&#xff0c;但是公司的考勤日历是这样的&#xff1a; 除了请假和法定节假日外&#xff0c;其他样…

[Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现

本文说说ViewModel的这个INotifyPropertyChanged接口可以用来做啥&#xff1f; 举例1&#xff1a;我有个TabControl&#xff0c;里面放了很多View&#xff0c;每个由ViewModel控制&#xff0c;我想是想TabSelectionChanged就打开相应的ViewModel&#xff0c;怎么做&#xff1f;…

[读书笔记]TCP/IP详解V1读书笔记-4 5

IP地址与以太网地址之间的关系 R P发送一份称作A R P请求的以太网数据帧给以太网上的每个主机。这个过程称作广播&#xff0c;在32 bit的I P地址和采用不同网络技术的硬件地址之间提供动态映射 ----------------------------------------- arp以太网帧的类型字段为x 0 8 0 6&am…

未来是Apache Karaf上的微服务架构

这是Jamie Goodyear的客座博客文章&#xff08; 博客 &#xff0c; icbts &#xff09;。 他是Savoir Technologies的开源倡导者&#xff0c;Apache开发人员和计算机系统分析师&#xff1b; 他为全球大型组织设计&#xff0c;批判和支持了体系结构。 他拥有纽芬兰纪念大学的计…

使用内存回流的方法来实现将image的内容转换为 byte[]

在今天的开发中老大不知道怎么突发奇想&#xff0c;要使用Image的Byte数据。当时使用老几种方式效果均不理想&#xff0c;最后发现其实可以使用内存回流的方式来实现。多的不说老&#xff0c;马上贴上代码&#xff1a;/**//// <summary> /// 将byte[]转换为Image…

通过设计国际象棋游戏来了解策略模式

今天&#xff0c;我们将借助一个示例来尝试了解策略模式。 我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式&#xff0c;而不是构建全面的国际象棋游戏解决方案。 策略模式&#xff1a;策略模式被称为行为模式-用于管理对象之间的算法&#xff0c;关系和职责。 策…