【发布时间】:2021-11-03 22:51:35
【问题描述】:
来自反应文档
从文档 (https://reactjs.org/docs/handling-events.html) 我可以看到通过箭头功能处理开关按钮更改,例如:
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
这里(对我来说)重要的是,新的状态值是从其先前的状态值导出的。 如果我是对的,则行为与(没有箭头功能)相同:
handleClick() {
this.setState(function (prevState){
return {isToggleOn: !prevState.isToggleOn}
});
}
甚至完全没有功能:
handleClick() {
this.setState({isToggleOn: this.state.isToggleOn ?
false : true});
}
1) 这些除了代码风格有什么不同吗? 所有方法似乎都对我有用,我找不到任何区别(可读性除外)。
2) 我想,this.setState 只是“setter”,如何将“prevState”传递给那个函数?
3)这样写代码是不是错了(第三种方法)?我是从“老派”变成了5年多没有开发,现在我回到了慢慢开发。第一个例子对我来说很难理解(因为箭头函数和匿名函数),第二个更清楚一点,但最后一个对我来说是最不言自明的。
现实生活中的例子
“真正的学习(生活)”示例我现在正在努力: 在我学习的过程中,我正在尝试编写自己的计算器(从基本功能开始)。由于糟糕的“设计”(我发现使用一些数组、字段、列表而不是仅使用“variableA、variableB”会更好,但绝不会更少......)。 我的应用结构是:
- 计算器
- 结果头
- 输入(用于结果)
- 输入(用于打印方程式)
- 计算按钮 (0)
- 按钮
- ...
- 计算按钮 (X)
- 按钮
- 结果头
CalcButton 包含其值的道具([0...9]、x、/、+、-、C、...)和事件处理程序(numberClick、operatorClick)。当按下数字按钮时,它会将其状态提升到计算器,它将数字添加到 valueA 或 valueB,这取决于“isFirst”的状态。 operatorClick 包含其自身功能的开关,如果按下 x、/、+、-,它将 isFirst 设置为 false,用户可以继续使用第二个数字 (valueB)。现在这个处理程序的代码:
onNumberClick(e) {
function appendA() {
return {valueA: this.state.valueA + e};
}
function appendB() {
return {valueB: this.state.valueB + e};
}
this.setState(this.state.isFirst ? appendA : appendB);
/*
if(this.state.isFirst) {
this.setState({valueA: this.state.valueA + e});
} else {
this.setState({valueB: this.state.valueB + e});
}
*/
}
注释代码与第三个示例基本相同,即使是未注释的变体,只是有一些“可读性”改进。过去 2 天,如果有可能使用一些匿名箭头函数,我会被卡住,所以我不需要复制代码(一次用于 valueA,一次用于 valueB)。由于 javascript 及其缺乏对象引用,我能想到的唯一解决方案是通过字符串 ("valueA" || "valueB") 传递参数,但我认为这不是一个好的解决方案。这里重要的是(如顶部的示例),新状态值是从其先前值派生的(这就是为什么我仍在考虑使用箭头匿名函数的原因)。
有人可以告诉我一些如何实现这一目标的例子吗?这里是否需要箭头函数(甚至可以通过箭头函数来做到这一点?)还是这个“代码”很好,我发现没有问题?
【问题讨论】:
-
向 setter 传递一个函数是保证您不会获得陈旧值的唯一方法。
标签: javascript reactjs arrow-functions readability state-management