【发布时间】:2022-11-27 10:03:36
【问题描述】:
我在 StackOverflow 上经历过许多类似的 QnA,但我仍然对为什么它对我不起作用感到困惑。我知道状态更新不是同步的。我也没有执行任何 DOM 操作。
完整的工作演示在这里演示了这个问题 - https://codesandbox.io/s/falling-pine-kljujf?file=/src/Tabs.js
在这个例子中,我渲染了几个标签。一个新选项卡最初会显示 DB“表”名称列表(此演示已修复)。选择表格名称时,列表将替换为表格的内容。
问题是当您关闭打开的选项卡时,currentTab 状态不会更新到我设置的(打开)选项卡。因此,在我手动单击打开的选项卡名称之前,选项卡的详细信息区域保持空白。
在上图中,我关闭了第三个选项卡。期望选项卡选择应该自动更改为第二个选项卡,但事实并非如此。相同的代码如下。
function removeTab(id) {
const ntl = tabsList;
const idx = ntl.findIndex((v) => v.id === id);
if (idx !== -1) {
ntl.splice(idx, 1);
if (ntl.length) {
let t = ntl[idx];
console.log("------", t, idx);
if (!t) {
t = ntl[0];
}
console.log("++++++1", t, t.id);
setCurrentTab(t.id);
setTabsList([...ntl]);
} else {
const t = newTab();
console.log("++++++2", t, t.id);
setCurrentTab(t.id);
setTabsList([t]);
}
}
}
在传递的id 上方是第三个选项卡。 tabsList 状态包含一个包含每个选项卡数据的数组。 currentTab 仅包含当前选项卡的id。根据上面的 console.log 语句,传递了正确选项卡的 id,但 currentTab 永远不会更新。即使我输入如下代码。
useEffect(() => { console.log('------------>', currentTab) }, [currentTab]);
在这种情况下它永远不会触发。
removeTab 方法是从 JSX 调用的,如下所示。
{tabsList.map((t) => (
<a
key={t.id + ""}
className={
"tab tab-bordered " + (currentTab === t.id ? "tab-active" : "")
}
onClick={() => {
setCurrentTab(t.id);
}}
>
{t.name}
<button
onClick={() => {
removeTab(t.id); // On clicking X button we remove tab
}}
>
X
</button>
</a>
))}
【问题讨论】:
标签: javascript reactjs react-hooks