所以我们需要手动在重新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前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
最后
小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:
凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。
入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。
整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。
都能在最短时间内掌握校招常见的算法及解题思路。**
整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
而对于有时间的同学,作者还给出了他结合众多数据结构算法书籍,挑选出的一千多道题的解题思路和方法,以供有需要的同学慢慢研究。