reactjs - 使用 useState 来防止重新声明和重新运行
问题描述
在进行任何操作之前,我正在清理控制台中的警告,并且我有一堆非常相似地拼凑在一起(结构)的组件。这些值特定于每个组件。似乎试图在 if 语句中设置 State 并不是一个好主意。
重新声明的原始解决方案:
const [value, setValue] = React.useState({
quoteId: false,
quotePage: false,
quoteExcerpt: false,
quoteComment: false,
});
var allEmpty = true;
if (
value.quoteId &&
value.quotePage &&
value.quoteExcerpt &&
value.quoteComment === false
) {
var quoteSect = false;
var allEmpty = true;
}
if (
value.quoteId ||
value.quotePage ||
value.quoteExcerpt ||
value.quoteComment === true
) {
var allEmpty = false;
var quoteSect = true;
}
关闭,但由于以下原因导致解决方案损坏 Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
:
const [empty, setEmpty] = React.useState(true)
const [value, setValue] = React.useState({
quoteId: false,
quotePage: false,
quoteExcerpt: false,
quoteComment: false,
});
if (
value.quoteId &&
value.quotePage &&
value.quoteExcerpt &&
value.quoteComment === false
) {
var quoteSect = false;
setEmpty(true);
}
if (
value.quoteId ||
value.quotePage ||
value.quoteExcerpt ||
value.quoteComment === true
) {
setEmpty(false);
var quoteSect = true;
}
解决方案
“empty
状态”似乎完全来自value
状态,这意味着它可能不属于状态。渲染循环是由不断在组件主体中设置状态作为无意的副作用引起的。
我认为empty
可以只是为每个渲染周期设置一个局部变量,从当前value
状态值导出。
const [value, setValue] = React.useState({
quoteId: false,
quotePage: false,
quoteExcerpt: false,
quoteComment: false,
});
const empty = (
value.quoteId &&
value.quotePage &&
value.quoteExcerpt &&
!value.quoteComment
) || (
value.quoteId ||
value.quotePage ||
value.quoteExcerpt ||
value.quoteComment
);
如果您需要更稳定empty
的参考,请使用useMemo
挂钩。
const empty = useMemo(() => {
return (
value.quoteId &&
value.quotePage &&
value.quoteExcerpt &&
!value.quoteComment
) || (
value.quoteId ||
value.quotePage ||
value.quoteExcerpt ||
value.quoteComment
);
}, [value]);
推荐阅读
- javascript - 使用 AngularJS 构建步骤向导的最佳方法
- javascript - $('元素').show(); vs $('element').css('visibility', 'visible'):哪个更好用?
- elm - Elm 中声明的 List 类型在哪里?
- ios - UITableView 和消失的行
- node.js - 在树莓派和mongodb之间建立连接
- driver - uboot中的设备驱动
- javascript - AngularJS 在不同模块之间共享存储在控制器中的数据
- bash - ubuntu 函数,在 source 时有效,但不适用于 bash 命令
- javascript - 将 MediaRecorder blob 发送到服务器并在后端构建文件
- jquery - 输入框中只显示小数点到 2 位?