【发布时间】:2020-10-23 23:08:26
【问题描述】:
我正在审查我的代码,我发现自从我开始使用 react hooks 以来,我遇到了一些我不能说的“问题”,但它不够干净。所以基本上我想清理一下我对这个问题的处理方法。我想在 useEffect 和 setSomething() 内部使用 if 语句。
所以基本上我想显示一条关于状态条件的消息。
当前:
const [displayFeedbackMessage, setDisplayFeedbackMessage ] = useState(undefined);
...
useEffect(() => {
setDisplayFeedbackMessage(
<div>
{
displaySelectionResult &&
selected > 0 &&
<div className={classes.dnaTableFeedbackMessageDiv}>
<b>{Pluralize("document", selected, true)}</b>
{" "}selected out of{" "}
<b>{Pluralize("document", available, true)}</b>
{" "}available.
</div>
}
{
displayActionResult &&
<div className={classes.dnaTableFeedbackMessageDiv}>
<b>{Pluralize("document", actioned, true)}</b>
{" "} downloaded out of{" "}
<b>{Pluralize("document", requested, true)}</b>
{" "}requested.
</div>
}
</div>
)
},[selected, displaySelectionResult, displayActionResult])
...
return (
<Paper>{displayFeedbackMessage}</Paper>
)
它工作正常,没有任何问题。但是当我尝试这样切换它时:
期望:
useEffect(() => {
setDisplayFeedbackMessage(
if(displaySelectionResult && selected > 0) {
<b>{Pluralize("document", selected, true)}</b>
{" "}selected out of{" "}
<b>{Pluralize("document", available, true)}</b>
{" "}available.
} else if (displayActionResult) {
<b>{Pluralize("document", actioned, true)}</b>
{" "} downloaded out of{" "}
<b>{Pluralize("document", requested, true)}</b>
{" "}requested.
}
)
},[selected, displaySelectionResult, displayActionResult])
结论是我想减少 useEffect 内部的 jsx 表达式,但它似乎不起作用。有人可以帮我看看我做错了什么吗?
【问题讨论】:
-
if-else语句在 JSX 中不起作用。这是因为 JSX 只是函数调用和对象构造的语法糖。 -
也许您可以将这两个 JSX 设置为两个不同的变量,然后将其与条件一起使用?也将条件放在
setDisplayFeedbackMessage之外。您可能需要在这些 JSX 块周围使用Fragment -
我不会将 JSX 存储在状态中,只是将所需的数据存储在状态中并根据该状态返回,这使它更具可读性,实际上正如上面的评论你需要将 JSX 包装成这样的片段:{your JSX}>
标签: reactjs react-hooks jsx use-effect