React和Redux
两者都需要纯功能和不变性,以可预测的方式运行。
如果您不遵循这两件事,则您的应用程序将存在错误,最常见的错误是React/Redux
无法跟踪更改,并且无法在state/prop
更改时重新呈现。
关于React,请考虑以下示例:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
状态由仅添加了属性的状态对象保存。此应用程序呈现应用程序属性。它不应该总是在发生任何事情时呈现状态,而应该检查状态对象中是否发生了更改。
像这样,我们有一个effect函数,pure function
我们用它来影响状态。您会看到,当要更改状态时它将返回新状态,而在不需要修改时将返回相同状态。
我们还有一个shouldUpdate
函数,该函数使用===运算符检查旧状态和新状态是否相同。
要在React方面犯错误,您实际上可以执行以下操作:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
您也可以通过直接设置状态而不使用effects
功能来犯错。
function doMistake(newValue) {
this.state = newValue
}
不应执行上述操作,而effects
应仅使用函数来更新状态。
就React而言,我们effects
称为setState
。
对于Redux:
- Redux的
combineReducers
实用程序检查参考更改。
- React-Redux的
connect
方法生成用于检查根状态和mapState
函数返回值的引用更改的组件,以查看包装后的组件是否确实需要重新渲染。
- 时间旅行调试要求减速器
pure functions
无副作用,以便您可以在不同状态之间正确跳转。
通过使用不纯函数作为归约器,可以轻松违反以上三个条件。
以下内容直接来自redux文档:
之所以称为简化器,是因为它是传递给的函数的类型Array.prototype.reduce(reducer, ?initialValue)
。
减速器保持纯净非常重要。在减速器中永远不应该做的事情:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
给定相同的参数,它应该计算下一个状态并返回它。没什么好奇怪的 没有副作用。没有API调用。没有突变。只是计算而已。
window.getElementById
使具有相同参数的相同功能运行会产生不同的结果,具体取决于副作用。这是redux失败的地方。