gpt4 book ai didi

javascript - react 减少 : Update value in deep nested object

转载 作者:行者123 更新时间:2023-11-30 06:22:16 24 4
gpt4 key购买 nike

我正在尝试更新存储在深层嵌套对象中的值。它包含许多信息,并且模式是固定的。我正在尝试复制对象,然后从输入返回具有更新值 onChange 的对象。但是,我无法成功地正确复制完整的树并返回更新后的内容。

演示:https://codesandbox.io/s/4j7x8jlk9w

对象看起来像:

content: {
label: "Label",
templates: [
{
name: "example",
type: "the type",
items: [
{
key: "key1",
properties: {
text: {
label: "The Label 1",
value: "The Value 1"
},
color: {
label: "Color",
value: "#123"
}
}
},
{
key: "key2",
properties: {
text: {
label: "The Label 2",
value: "The Value 2"
},
color: {
label: "Color",
value: "#456"
}
}
}
]
}
]
}

reducer :

case "UPDATE_VALUE":
const content = state.content.templates[state.templateKey].items[
state.itemKey
].properties.text.value =
action.value;

return { ...state, content };

default:
return state;
}

组件:

import React, { PureComponent } from "react";
import { connect } from "react-redux";

import { updateValue } from "./actions";

class Page extends PureComponent {
render() {
const { content, templateKey, itemKey } = this.props;

return (
<div>
<h1
style={{
color:
content.templates[templateKey].items[itemKey].properties.color
.value
}}
>
{content.templates[templateKey].items[itemKey].properties.text.value}
</h1>
<input
name={content.templates[templateKey].items[itemKey].key}
value={
content.templates[templateKey].items[itemKey].properties.text.value
}
onChange={e => this.props.updateValue(e.target.name, e.target.value)}
/>
</div>
);
}
}

const mapStateToProps = state => ({
content: state.content,
templateKey: state.templateKey,
itemKey: state.itemKey
});

const mapDispatchToProps = dispatch => ({
updateValue: (key, value) => dispatch(updateValue(key, value))
});

export default connect(
mapStateToProps,
mapDispatchToProps
)(Page);

最佳答案

对于像这样深度嵌套的数据,您可以在树的每个深度使用展开语法,直到找到您想要更改的内容。对于数组,您可以使用 slice 创建数组的副本而不改变它。

https://redux.js.org/recipes/structuringreducers/immutableupdatepatterns#correct-approach-copying-all-levels-of-nested-data

https://redux.js.org/recipes/structuringreducers/immutableupdatepatterns#inserting-and-removing-items-in-arrays

将是帮助您更好地理解这一点的资源。

假设您的 reducer 获得了要更新的模板的索引,以及该模板中要更新的项目的索引。您的代码可能如下所示:

return {
...state,
templates: [
...state.templates.slice(0, templateIndex),
{
...state.templates[templateIndex],
items: [
...state.templates[templateIndex].items.slice(0, itemIndex),
{
...state.templates[templateIndex].items[itemIndex],
value: action.value
},
...state.templates[templateIndex].items.slice(itemIndex)
]
},
...state.templates.slice(templateIndex)
]
}

如您所见,当您处理这样的嵌套数据时,它会变得非常困惑。建议您对嵌套数据进行规范化,以使您的缩减程序只需做更少的工作即可找到要更改的内容。

这是您更新后的代码和框:https://codesandbox.io/s/w77yz2nzl5

关于javascript - react 减少 : Update value in deep nested object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com