reactjs - 如何在使用状态挂钩更新状态时覆盖具有相同键的对象
问题描述
我想在选择新过滤器时更新状态。初始状态显示我瞄准的对象结构。例如,我添加了一个过滤器选择(例如“f2”),每个过滤器的标签是固定的,所以我们可以忽略它,但值可能是“va”。这很好,但是当我想将“f2”的值更改为“vb”时,我现在在我的状态 {“f2”:“va”} 和 {“f2”:“vb”} 中有两个条目,而我宁愿第一个被第二个覆盖。
const [filterValues, setFilterValues] = useState([{"f1":["l","v"]}]);
const handleChange = (filter, label, value) => {
setFilterValues([
...filterValues,
{[filter]: [label, value]}
]);
};
我尝试调用 setFilterValues 两次(一次将条目映射到我的条件)来解决问题,但后来我什至根本没有更新状态:
const handleChange = (filter, label, value) => {
setFilterValues([
...filterValues,
{[filter]: [label, value]}
]);
let key = filter
setFilterValues(
filterValues.map(
el => el.key == key? { [key]: [label, value] } : el
)
)
};
我对反应有点陌生,所以也许我没有得到更新功能组件状态的基本知识。有人可以帮我吗?谢谢你!
解决方案
这样做的方法是在设置状态之前找到正确的对象并更改其值:
const handleChange = (filter, label, value) => {
const currentFilters = [...filterValues] // A new copy of the state.
const newFilters = currentFilters.map(stateFilter => stateFilter[filter] ? {[filter]: [label, value]} : stateFilter)
setFilterValues(newFilters);
};
虽然我相信这可以解决您的问题,但我认为将过滤器存储在数组中会更好,这意味着对象结构为:
[[l1,v1], [l1, v2]]
这样,过滤器一只是过滤器数组上的索引 0,依此类推。所以要做你想做的事,你将有一个接收过滤器编号、标签和值的函数:
const handleChange = (filter, label, value) => {
let newFilters = [...filterValues] // A new copy of the state.
newFilters[filter - 1] = [label, value];
setFilterValues(newFilters);
};
请注意,如果您收到过滤器编号 1,表示第一个过滤器,您希望访问过滤器数组上的位置 0。
推荐阅读
- vb.net - 为什么我总是找不到一些 .cs 文件?
- java - io.realm.exceptions.RealmIOException: 无法打开 3
- elasticsearch - ElasticSearch - 如果文档不存在,部分更新是否会创建新文档?
- c# - SynFusion 错误:无法加载文件或程序集 Syncfusion.Pdf.Base,版本 = 16.4450.0.54
- python - pandas for循环导出文件包括所有条件
- hibernate - java.lang.NoClassDefFoundError 当我尝试启动我的服务器时
- javascript - Window.open 关闭时触发事件
- django - 如何使用 Django allauth 将 Linkedin 登录添加到我的网站?
- ssrs-2012 - 隐藏tablix时SSRS参数隐藏表达式错误
- javascript - 创建 Shopify 动态部分时出错