javascript - reactjs中的多维状态更新
问题描述
我正在使用 reactjs 中的复杂状态对象,我无法更新状态的特定项目。
state = {
order: {
jobs: [
{
id: "1",
jobId: "31147-02",
services: [
{
id: 18,
price: "100",
},
{
id: 19,
price: "100",
},
{
id: 65,
price: "3200",
},
{
id: 87,
price: "1800",
},
{
id: 88,
price: "1350",
},
{
id: 89,
price: "1350",
},
],
},
{
id: "2",
jobId: "31147-02",
services: [
{
id: 45,
price: ""
},
{
id: 41,
price: "",
},
{
id: 28,
price: "",
},
],
},
],
},
};
并尝试处理删除功能
下面的代码是接收 JOB 的索引和需要从状态中删除以执行删除功能的服务对象。
handleJobServiceDelete = (jobId, service) => {
let jobs = [...this.state.order.jobs[jobId].services];
jobs = jobs.filter((s) => s.id !== service.id);
console.log(jobs);
this.setState({ jobs });
};
但是在从中删除对象后,我无法使用更新的服务数组设置状态。
解决方案
您需要使用this.setState({ order: { jobs } });
,但这不起作用,因为 React 不会完全设置状态,因此需要更多时间。
this.setState((prevState)=>({ order: {...prevState.order, jobs } }));
我通常会像这样管理深度嵌套状态的方式是使用https://github.com/kolodny/immutability-helper,因为它更容易管理。
编辑:使用不变性助手修复了完整的问题。存在与我最初注意到的不同的问题。由于变量名,我没有意识到被更改的数据是作业的服务,因此必须返回到作业的服务而不是替换作业。
import update from 'immutability-helper';
this.setState((prevState) => {
const idx = prevState.order.jobs[jobId].services.findIndex(
(s) => service.id === s.id
);
return {
order: update(prevState.order, {
jobs: { [jobId]: { services: { $splice: [[idx, 1]] } } },
}),
};
});
推荐阅读
- python - 复制数据框后 to_datetime 函数失败
- mongodb - mongodb查找管道阶段内的正则表达式
- node.js - 运行迁移命令时,TypeORM CLI 不打印任何输出
- c# - Blazor WebAssembly 项目,Intellisense 弹出错误:找不到类型或命名空间名称“App”
- c# - 无论如何,是否允许我在 UWP 应用程序中使用 System.IO
- javascript - 使用axios获取api数据时箭头函数不应该返回赋值(Vue.js 2)
- windows - 将多个文件压缩成 bzip2
- nltk - 如何将 nltk.book、common_contexts 函数的输出转换为变量
- snowflake-cloud-data-platform - 授予雪花角色创建仓库的权限,但不起作用
- mvvm - 在 MVVM 结构上需要帮助