三元运算符 - React 的条件渲染中是否存在可能的错误?
Ternary Operator - Is there a possible bug in React's conditional rendering?
目前,我正在使用 Node.js 和 React 进行开发,但遇到了一个奇怪的问题,我不确定我是否遗漏了什么,或者它是否是 React 方面的错误。
我想做的是使用三元运算符来呈现条件HTML,如下所示:
...
{
missingTradingSystemNameError
?
<div>
...
</div>
:
duplicateTradingSystemNameError
?
<div>
...
</div>
:
null
}
...
我的 JSX.Element 函数中的两个三元运算符条件都是有状态变量。但是,这样做会导致以下形式的多个错误:
错误:
React Hook "React.useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render
有趣的是,如果我添加第三个(无用的)嵌套条件来代替 null,那么一切都会按预期工作:
...
{
missingTradingSystemNameError
?
<div>
...
</div>
:
duplicateTradingSystemNameError
?
<div>
...
</div>
:
<<condition3>>
?
null
:
null
}
...
condition3 是第三个有状态变量,但如您所见,附加条件什么都不做,因此应该可以省略它。这是一个 React 错误还是我在这里遗漏了一些重要的东西?
(P.S.: 请原谅我代码的异常缩进,但对我来说,这是目前对更复杂的 JSX 代码块最易读的解决方案)
编辑 1:
为了提供更多请求的详细信息,这是我简化的 useEffect() 代码块:
const [missingTradingSystemNameError, setMissingTradingSystemNameError] = React.useState(false);
const [duplicateTradingSystemNameError, setDuplicateTradingSystemNameError] = React.useState(false);
...
React.useEffect(() => {
if (props.tradingSystemDialog && resetTradingSystemDialogOnNextOpen) {
...
setMissingTradingSystemNameError(false);
setDuplicateTradingSystemNameError(false);
...
}
}, [
props.tradingSystemDialog,
resetTradingSystemDialogOnNextOpen,
tickFields,
consolidatedFields
]);
missingTradingSystemNameError 通过 setMissingTradingSystemNameError 设置,duplicateTradingSystemNameError 通过 设置setDuplicateTradingSystemNameError。如您所见,这些有状态变量可能在 useState() 中被更改,但它们不在 useState() 的依赖项中。
最好提供一个最小的可重现示例,但在我的情况下上下文太复杂了。然而,我所做的是删除越来越多的代码来检查是否是一小部分导致了问题。现在我得出结论,文件中其他位置的以下代码片段存在问题,并导致上述代码失败或至少以奇怪的方式运行:
...
{
basicShortSettingsError
?
<div className={classes.error}>
<ErrorOutline
className={classes.errorIcon}
/>
<Typography className={classes.sectionError} variant="body2">
{
parseFloat(positionSizeShort) > parseFloat(maxContractsShort)
?
"Position size > maximum contracts"
:
"Set position size and maximum contracts"
}
</Typography>
</div>
:
null
}
...
出于某种原因,Typography 标记内的条件部分以前可以工作,但如果我在文件中的其他位置扩展代码时会导致错误问题中提到。
澄清一下,这是导致问题的代码片段:
<Typography className={classes.sectionError} variant="body2">
{
parseFloat(positionSizeShort) > parseFloat(maxContractsShort)
?
"Position size > maximum contracts"
:
"Set position size and maximum contracts"
}
</Typography>
positionSizeShort 和 maxContractsShort 也是有状态变量,我不确定为什么代码之前工作得很好,现在却失败了,但至少我现在找到了问题的根源,我可以在那里做一个解决方法。
如果有人更清楚为什么这段代码有问题,非常欢迎在这里分享您的想法,因为我的问题没有真正的答案。
目前,我正在使用 Node.js 和 React 进行开发,但遇到了一个奇怪的问题,我不确定我是否遗漏了什么,或者它是否是 React 方面的错误。
我想做的是使用三元运算符来呈现条件HTML,如下所示:
...
{
missingTradingSystemNameError
?
<div>
...
</div>
:
duplicateTradingSystemNameError
?
<div>
...
</div>
:
null
}
...
我的 JSX.Element 函数中的两个三元运算符条件都是有状态变量。但是,这样做会导致以下形式的多个错误:
错误:
React Hook "React.useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render
有趣的是,如果我添加第三个(无用的)嵌套条件来代替 null,那么一切都会按预期工作:
...
{
missingTradingSystemNameError
?
<div>
...
</div>
:
duplicateTradingSystemNameError
?
<div>
...
</div>
:
<<condition3>>
?
null
:
null
}
...
condition3 是第三个有状态变量,但如您所见,附加条件什么都不做,因此应该可以省略它。这是一个 React 错误还是我在这里遗漏了一些重要的东西?
(P.S.: 请原谅我代码的异常缩进,但对我来说,这是目前对更复杂的 JSX 代码块最易读的解决方案)
编辑 1:
为了提供更多请求的详细信息,这是我简化的 useEffect() 代码块:
const [missingTradingSystemNameError, setMissingTradingSystemNameError] = React.useState(false);
const [duplicateTradingSystemNameError, setDuplicateTradingSystemNameError] = React.useState(false);
...
React.useEffect(() => {
if (props.tradingSystemDialog && resetTradingSystemDialogOnNextOpen) {
...
setMissingTradingSystemNameError(false);
setDuplicateTradingSystemNameError(false);
...
}
}, [
props.tradingSystemDialog,
resetTradingSystemDialogOnNextOpen,
tickFields,
consolidatedFields
]);
missingTradingSystemNameError 通过 setMissingTradingSystemNameError 设置,duplicateTradingSystemNameError 通过 设置setDuplicateTradingSystemNameError。如您所见,这些有状态变量可能在 useState() 中被更改,但它们不在 useState() 的依赖项中。
最好提供一个最小的可重现示例,但在我的情况下上下文太复杂了。然而,我所做的是删除越来越多的代码来检查是否是一小部分导致了问题。现在我得出结论,文件中其他位置的以下代码片段存在问题,并导致上述代码失败或至少以奇怪的方式运行:
...
{
basicShortSettingsError
?
<div className={classes.error}>
<ErrorOutline
className={classes.errorIcon}
/>
<Typography className={classes.sectionError} variant="body2">
{
parseFloat(positionSizeShort) > parseFloat(maxContractsShort)
?
"Position size > maximum contracts"
:
"Set position size and maximum contracts"
}
</Typography>
</div>
:
null
}
...
出于某种原因,Typography 标记内的条件部分以前可以工作,但如果我在文件中的其他位置扩展代码时会导致错误问题中提到。
澄清一下,这是导致问题的代码片段:
<Typography className={classes.sectionError} variant="body2">
{
parseFloat(positionSizeShort) > parseFloat(maxContractsShort)
?
"Position size > maximum contracts"
:
"Set position size and maximum contracts"
}
</Typography>
positionSizeShort 和 maxContractsShort 也是有状态变量,我不确定为什么代码之前工作得很好,现在却失败了,但至少我现在找到了问题的根源,我可以在那里做一个解决方法。
如果有人更清楚为什么这段代码有问题,非常欢迎在这里分享您的想法,因为我的问题没有真正的答案。