如何使用 React Hooks 设置多个状态
How to set multiple states using react hooks
我在我的一个 React 组件中设置多个状态时遇到问题。我的最终目标是:我首先要设置我的 'casesData' 状态(见下文),以便 'selected' 的值可以设置为 'true' 或 'false' 在每个后续点击事件。然后我想通过 'casesData' 映射找到 'selected: true' 的位置,然后将 'case' 的值添加到 'chosenCases'。所以最后 'chosenCases' 可能看起来像: ['case1', 'case2'] 只要它们各自在 'casesData' 中的对象等于 'selected: true'.
我的初始状态是这样设置的:
const [chosenCases, setChosenCases] = useState([]);
const [casesData, setCasesData] = useState([
{
case: 'Case1',
description: 'some description',
selected: false,
},
{
case: 'Case2',
description: 'some description',
selected: false,
},
]);
我通过 'casesData' 状态映射将内容渲染到屏幕上。然后我从 onClick 调用一个函数来开始更新我的状态:
return (
<>
{casesData.map(
(
casex // casex because 'case' is a reserved word
) => {
return (
<span
onClick={selectCase}
data-case={casex.case}
>
<p>{casex.case}</p>
<p>{casex.description}</p>
</span>
);
}
)}
</>
);
这是应该更新我的两个状态的函数。
const selectCase = (event) => {
console.log(event.target.getAttribute('data-case')); // e.g. 'case2'
setCasesData(
[...casesData].map((object) => {
if (
object.case.toLowerCase() ===
event.target.getAttribute('data-case').toLowerCase()
) {
return {
...object,
selected: !object.selected,
};
} else return object;
})
);
let newArray = [];
casesData.map((object) => {
if (object.selected === true) {
newArray.push(object.case.toLowerCase());
}
});
setChosenCases(newArray);
};
如果我在 运行 执行上述功能后将我的状态记录到控制台,我会看到 'casesData' 得到正确更新,但 'chosenCases' 总是落后一步。例如,'chosenCases' 在函数的第一个 运行 上保持为空,但随后在第二个 运行 上设置(例如 ['case2'] 但数据将反映前一个函数调用)。
如有任何帮助,我们将不胜感激。我想知道最合适的设置方法。
最简单的做法是将新的 casesData
存储在一个变量中,这样您就不必等待新的渲染就可以看到新的状态:
const selectCase = (event) => {
console.log(event.target.getAttribute('data-case')); // e.g. 'case2'
const newCasesData = casesData.map((object) =>
(object.case.toLowerCase() === event.target.getAttribute('data-case').toLowerCase())
? {
...object,
selected: !object.selected,
}
: object
)
setCasesData(newCasesData);
setChosenCases(
newCasesData
.filter(obj => obj.selected)
.map(obj => obj.case.toLowerCase())
);
};
您可能还想重新考虑是否需要像 chosenCases
这样的派生状态,并在渲染时注意确定选定的情况。这将使您的代码更易于推理,因为您不必担心两个状态的配置。
我在我的一个 React 组件中设置多个状态时遇到问题。我的最终目标是:我首先要设置我的 'casesData' 状态(见下文),以便 'selected' 的值可以设置为 'true' 或 'false' 在每个后续点击事件。然后我想通过 'casesData' 映射找到 'selected: true' 的位置,然后将 'case' 的值添加到 'chosenCases'。所以最后 'chosenCases' 可能看起来像: ['case1', 'case2'] 只要它们各自在 'casesData' 中的对象等于 'selected: true'.
我的初始状态是这样设置的:
const [chosenCases, setChosenCases] = useState([]);
const [casesData, setCasesData] = useState([
{
case: 'Case1',
description: 'some description',
selected: false,
},
{
case: 'Case2',
description: 'some description',
selected: false,
},
]);
我通过 'casesData' 状态映射将内容渲染到屏幕上。然后我从 onClick 调用一个函数来开始更新我的状态:
return (
<>
{casesData.map(
(
casex // casex because 'case' is a reserved word
) => {
return (
<span
onClick={selectCase}
data-case={casex.case}
>
<p>{casex.case}</p>
<p>{casex.description}</p>
</span>
);
}
)}
</>
);
这是应该更新我的两个状态的函数。
const selectCase = (event) => {
console.log(event.target.getAttribute('data-case')); // e.g. 'case2'
setCasesData(
[...casesData].map((object) => {
if (
object.case.toLowerCase() ===
event.target.getAttribute('data-case').toLowerCase()
) {
return {
...object,
selected: !object.selected,
};
} else return object;
})
);
let newArray = [];
casesData.map((object) => {
if (object.selected === true) {
newArray.push(object.case.toLowerCase());
}
});
setChosenCases(newArray);
};
如果我在 运行 执行上述功能后将我的状态记录到控制台,我会看到 'casesData' 得到正确更新,但 'chosenCases' 总是落后一步。例如,'chosenCases' 在函数的第一个 运行 上保持为空,但随后在第二个 运行 上设置(例如 ['case2'] 但数据将反映前一个函数调用)。
如有任何帮助,我们将不胜感激。我想知道最合适的设置方法。
最简单的做法是将新的 casesData
存储在一个变量中,这样您就不必等待新的渲染就可以看到新的状态:
const selectCase = (event) => {
console.log(event.target.getAttribute('data-case')); // e.g. 'case2'
const newCasesData = casesData.map((object) =>
(object.case.toLowerCase() === event.target.getAttribute('data-case').toLowerCase())
? {
...object,
selected: !object.selected,
}
: object
)
setCasesData(newCasesData);
setChosenCases(
newCasesData
.filter(obj => obj.selected)
.map(obj => obj.case.toLowerCase())
);
};
您可能还想重新考虑是否需要像 chosenCases
这样的派生状态,并在渲染时注意确定选定的情况。这将使您的代码更易于推理,因为您不必担心两个状态的配置。