gpt4 book ai didi

javascript - 从 React.js 中的递归渲染组件更新状态

转载 作者:行者123 更新时间:2023-11-28 03:06:29 24 4
gpt4 key购买 nike

我需要从递归渲染的组件更新 React 状态下的深层嵌套对象。这些项目看起来像这样并且可以动态嵌套:

const items = [
{
id: "1",
name: "Item 1",
isChecked: true,
children: []
},
{
id: "3",
name: "Item 3",
isChecked: false,
children: [
{
id: "3.1",
name: "Child 1",
isChecked: false,
children: [
{
id: "3.1.1",
name: "Grandchild 1",
isChecked: true,
children: []
},
{
id: "3.1.2",
name: "Grandchild 2",
isChecked: true,
children: []
}
]
},
{
id: "3.2",
name: "Child 2",
isChecked: false,
children: []
}
]
}
]

我在弄清楚如何从深层嵌套组件内更新顶级状态时遇到问题,因为它只“了解”自身,而不是整个数据结构。

class App extends React.Component {
state = {
items
};

recursivelyRenderItems(items) {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name}
<input type="checkbox" checked={item.isChecked} onChange={(event) => {
// TODO: Update the item's checked status
}} />
{this.recursivelyRenderItems(item.children)}
</li>
))}
</ul>

)
}

render() {
return (
<div>
{this.recursivelyRenderItems(this.state.items)}
</div>
);
}
}

请问我怎样才能实现这个目标?

最佳答案

这适用于您发布的 fiddle 。

基本上,每个组件都需要了解其 item.isChecked 及其父组件的 isChecked。因此,创建一个带有 2 个 props 的组件,itemparentChecked,其中后者是来自父级的 bool 值,前者成为构造函数中的可变状态变量。

然后,组件只需在事件处理程序中更新其选中状态,然后所有内容都会在渲染方法中向下流动:

import React from "react";
import { render } from "react-dom";
import items from "./items";

class LiComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
item: props.item
}
}

render() {
var t = this;
return (
<ul>
<li key={t.state.item.id}>
{t.state.item.name}
<input
type="checkbox"
checked={t.state.item.isChecked || t.props.parentChecked}
onChange={event => {
t.setState({item: {...t.state.item, isChecked: !t.state.item.isChecked}})
}}
/>
</li>
{t.state.item.children.map(item => (
<LiComponent item={item} parentChecked={t.state.item.isChecked}/>
))}
</ul>
);
}
}
class App extends React.Component {
state = {
items
};

render() {
return (
<div>
{this.state.items.map(item => (
<LiComponent item={item} parentChecked={false} />
))}
</div>
);
}
}

render(<App />, document.getElementById("root"));

https://codesandbox.io/s/treelist-component-ywebq

关于javascript - 从 React.js 中的递归渲染组件更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60566919/

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