Redux 源码解析系列(一) -- Redux的实现思想,差点挂在第四面

所以我们需要手动在重新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

}

let appState = {

title: {

text: ‘React.js’,

color: ‘red’,

},

content: {

text: ‘React.js内容’,

color: ‘blue’

}

}

// stateChanger 实际就是我们的reducer

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

}

}

const store = createStore(appState, stateChanger)

// 监听数据变化,每次数据改变都会自动执行renderApp

store.subscribe(() => renderApp(store.getState()))

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

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

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

这样,我们的renderApp 就会监听状态变化,每当dispatch一次action,它都会被自动执行。

流程图如下:

到这一步,一个APP就已经可以无压力的跑起来啦,最后一步,当然是关注性能,我们这个app 还是有严重性能问题的,因为每一次的dispatch 一次action,不管数据有没有变化,组件都会被重新渲染,这当然是不必要的。

为什么reducer是纯函数


所以就需要对reducer产生的前后appState进行一个对比,这就要求reducer必须是一个纯函数,返回的是一个新的object,这样才能够对比可以通过对比前后的state是否相等,来决定是否re-render

// reducer用来管理状态变化

function reducer (state, action) {

switch (action.type) {

case ‘CHANGE_TITLE’:

return {

…state,

title: {

…state.title,

text: action.text

}

}

case ‘CHANGE_CONTENT’:

return {

…state,

content: {

…state.content,

color: action.color

}

}

}

}

function createStore(state, reducer) {

let appState = state;

const getState = () => appState;

const listeners = [];

const subscribe = (listener) => {

listeners.push(listener)

}

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

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:

凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。

入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。

整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。

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

而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。

都能在最短时间内掌握校招常见的算法及解题思路。**

整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。

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

而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值