Redux 源码解析系列(一) -- Redux的实现思想,web架构师

==

最近有同学问我Redux的一些知识,所以我又把我以前写的源码分析的文章搬出来啦,redux的源码都很简单,很适合初学者学习。

虽然最近hooks已经出来了,但是在它真的能替代redux之前,我们还是要好好学习redux,顺便大家可以了解为啥需要redux这样的状态管理工具,对分析比较hooksredux也是有好处的。

下面我们就开始吧(PS:这些都是我刚入职写的文章,若有问题,欢迎随时提出纠正

作者:daisy,原文:https://zhuanlan.zhihu.com/p/57209324

Redux简介


Redux 其实是用来帮我们管理状态的一个框架,它暴露给我们四个接口,分别是:

  • createStore

  • combineReducers

  • bindActionCreators

  • applyMiddleware

  • compose

源码系列里会分别对这五个接口进行解析。

在对Redux 的源码解析系列开篇之前,先来了解一下它的实现思想。

为什么要有dispatch


假设一种场景下,app里每个组件都需要拿到appState{title: 'redux', color: 'red' }的一部分进行渲染。

但是这里存在一个风险就是,谁都可以修改appState的值。换句话说,有一天当appState变了你都不知道是谁改的,所以我们需要有一个管理员来帮我们管理我们的状态,这时候引入了dispatch函数,来专门负责修改数据,哪个组件需要改数据都要经过它。

function dispatch (action) {

switch (action.type) {

case ‘UPDATE_TITLE_TEXT’:

appState.title.text = action.text

break

case ‘UPDATE_TITLE_COLOR’:

appState.title.color = action.color

break

default:

break

}

}

解决问题:既可以解决组件共享问题,同时不会有数据可以被任意修改的问题。

为什么要有createStore


现在我们有了状态,又有了dispatch,这时候我们需要一个高层管理者store,帮我们管理好他们,

所以我们就有了createStore这个函数帮我们生成store, 这样再用的时候就可以直接store.getState, store.dispatch的方式获取和更改组件状态

function createStore(state, stateChanger) {

const getState = () => state;

const dispatch = (action) => stateChanger(state, action)

return {getState, dispatch}

}

createStore 接受两个参数,一个是表示app的 state。另外一个是 stateChanger,它来描述应用程序状态会根据 action 发生什么变化,其实就是相当于本节开头的 dispatch 代码里面的内容,我们后来会将它命名为reducer。

到了这一步,每当我想状态发生改变的时候,我就dispatch一个action来改变组件当前的状态。

但是这里还有一个问题,就是store里的数据发生改变之后,react是感知不到的。

如图:

所以我们需要手动在重新render一次APP。

整个过程如下:

let appState = {

title: {

text: ‘React.js’,

color: ‘red’,

},

content: {

text: ‘React.js内容’,

color: ‘blue’

}

}

function stateChanger (state, action) {

switch (action.type) {

case ‘UPDATE_TITLE_TEXT’:

state.title.text = action.text

break

case ‘UPDATE_TITLE_COLOR’:

state.title.color = action.color

break

default:

break

}

}

function createStore(state, stateChanger) {

const getState = () => state;

const dispatch = (action) => stateChanger(state, action)

return {getState, dispatch}

}

const store = createStore(appState, stateChanger)

renderApp(store.getState()) // 首次渲染页面

store.dispatch({ type: ‘UPDATE_TITLE_TEXT’, text: ‘《Redux》’ }) // 修改标题文本

store.dispatch({ type: ‘UPDATE_TITLE_COLOR’, color: ‘blue’ }) // 修改标题颜色

// 注意:这里需要我们手动重新render

renderApp(store.getState()) // 把新的数据渲染到页面上

这时候就需要观察者模式,react订阅store数据的改变,然后自动调用renderApp。我们的把这个功能加入在store里,所以createStore功能又强大啦~

function createStore(state, reducer) {

const getState = () => state;

const listeners = [];

// 订阅函数

const subscribe = (listener) => {

listeners.push(listener)

}

const dispatch = (action) => {

reducer(state, action);

// 数据已发生改变就把所有的listener跑一遍

listeners.forEach((listener) => {

listener()

})

}

return {getState, dispatch, subscribe}

}

接着,我们就可以这样使用

function createStore (state, stateChanger) {

const listeners = []

const subscribe = (listener) => listeners.push(listener)

const getState = () => state

const dispatch = (action) => {

stateChanger(state, action)

listeners.forEach((listener) => listener())

}

return { getState, dispatch, subscribe }

}

function renderApp (appState) {

renderTitle(appState.title)

renderContent(appState.content)

}

function renderTitle (title) {

const titleDOM = document.getElementById(‘title’)

titleDOM.innerHTML = title.text

titleDOM.style.color = title.color

}

function renderContent (content) {

const contentDOM = document.getElementById(‘content’)

contentDOM.innerHTML = content.text

contentDOM.style.color = content.color

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-S8tqHFd2-1711718244385)]

更多面试题

**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-859BVJWQ-1711718244386)]

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值