state中如何使用setState拼接成数组?
How to use setState to splice into an array in the state?
我的 state.events 在由组件实例组成的数组中:EventContainer。
我希望我的 setState 在 state.events 数组中放置一个新的 EventContainer。但是,我希望 EventContainer 在调用 setState 的特定 EventContainer 之后立即进入索引。
我正在寻求帮助以对我的方法进行必要的调整,或者,如果我的整个方法都不好,我正在寻求有关如何解决此问题的建议。非常感谢。
我正在开发一个行程生成器,它由 rows/EventContainers 组成,代表给定日期的 activity。
每个 EventContainer 都有一个按钮,需要让用户能够在该 EventContainer 之后立即单击附加行。
class DayContainer extends React.Component {
constructor(props){
super(props);
this.state = {
events: [],
};
this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
}
pushNewEventContainerToState (index){
let newEvent = <EventContainer />;
this.setState(prevState => {
const events = prevState.events.map((item, j) => {
if (j === index) {
events: [...prevState.events.splice(index, 0, newEvent)]
}
})
})
}
render(){
return (
<>
<div>
<ul>
{
this.state.events === null
? <EventContainer pushNewEventContainerToState= .
{this.pushNewEventContainerToState} />
: <NewEventButton pushNewEventContainerToState={this.pushNewEventContainerToState} />
}
{this.state.events.map((item, index) => (
<li
key={item}
onClick={() =>
this.pushNewEventContainerToState(index)}
>{item}</li>
))}
</ul>
</div>
</>
)
}
}
我在 setState 中的目标是将 newEvent 拼接到 this.state.events 紧跟在索引(pushNewEventContainerToState 函数中的参数)之后。
我遇到了这个错误,但我猜还有更多的事情发生:第 23:22 行:需要一个赋值或函数调用,但却看到了一个表达式 no-unused-expressions。
我发现代码至少有 2 个问题。
- Splice 将原地改变数组
- 您没有返回更新后的状态。
您可以改为使用 slice
来构建新数组。
pushNewEventContainerToState(index) {
let newEvent = < EventContainer / > ;
this.setState(prevState => {
const updatedEvents = [...prevState.events.slice(0, index], newEvent, ...prevState.events.slice(index + 1];
return {
events: updatedEvents
})
})
}
由于我对编码还很陌生,所以花了我一段时间,但我能够编译完整的答案。下面是代码。在此之下,我将逐点解释问题所在以及更新后的代码如何解决该问题。
class DayContainer extends React.Component {
constructor(props){
super(props);
this.state = {
events: [{key:0}],
};
this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
}
pushNewEventContainerToState(index) {
let newEvent = {key: this.state.events.length};
this.setState(prevState => {
let updatedEvents = [...prevState.events.slice(0, index + 1), newEvent, ...prevState.events.slice(index + 1)];
return {
events: updatedEvents
};
})
}
render(){
return (
<>
<div>
<ul>
{this.state.events.map((item, index) => (
<li key={item.key}>
< EventContainer pushNewEventContainerToState={() => this.pushNewEventContainerToState(index) } / >
</li>
))}
</ul>
</div>
</>
)
}
}
设置
从 state.events 开始,而不是从一个空数组开始,我从一个 object,包括一个从 0 开始的键,因为我总是希望用户从一个 EventContainer 开始。
关于 pushNewEventContainerToState,@Sushanth 提出了很好的建议。请直接参考我最新代码中的那个函数。我所做的改进与我将传递给它的 EventContainer 分开的方式有关。state.events。我已将 EventContainer 从 pushNewEventContainerToState 向下移动到 render() 元素。我给了它一个 key={item.key} 的 prop 并将组件实例包装在一个 li 中。第一个 EventContainer 的键值为 0(参见 state.events[0])。现在,每个传递给 state.events 的新 EventContainer 都有一个基于 state.events 数组的最新 .length() 的键(请参阅 pushNewEventContainerToState 中 let newEvent 变量的最新值)。
所有这些让我解决了我面临的一个大问题:我需要将最新的 EventContainer 放在索引中,紧跟在调用 pushNewEventContainerToState 的 EventContainer 的索引之后。发生这种情况的主要原因是我没有正确地将索引传递给 render() 内部的 EventContainer。现在我有了实际的 EventContainer,我可以以正确的方式向它传递一个 prop(请在渲染中参考 EventContainer 的 prop)。现在我用正确的索引调用 pushNewEventContainerToState。
我的 state.events 在由组件实例组成的数组中:EventContainer。
我希望我的 setState 在 state.events 数组中放置一个新的 EventContainer。但是,我希望 EventContainer 在调用 setState 的特定 EventContainer 之后立即进入索引。
我正在寻求帮助以对我的方法进行必要的调整,或者,如果我的整个方法都不好,我正在寻求有关如何解决此问题的建议。非常感谢。
我正在开发一个行程生成器,它由 rows/EventContainers 组成,代表给定日期的 activity。
每个 EventContainer 都有一个按钮,需要让用户能够在该 EventContainer 之后立即单击附加行。
class DayContainer extends React.Component {
constructor(props){
super(props);
this.state = {
events: [],
};
this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
}
pushNewEventContainerToState (index){
let newEvent = <EventContainer />;
this.setState(prevState => {
const events = prevState.events.map((item, j) => {
if (j === index) {
events: [...prevState.events.splice(index, 0, newEvent)]
}
})
})
}
render(){
return (
<>
<div>
<ul>
{
this.state.events === null
? <EventContainer pushNewEventContainerToState= .
{this.pushNewEventContainerToState} />
: <NewEventButton pushNewEventContainerToState={this.pushNewEventContainerToState} />
}
{this.state.events.map((item, index) => (
<li
key={item}
onClick={() =>
this.pushNewEventContainerToState(index)}
>{item}</li>
))}
</ul>
</div>
</>
)
}
}
我在 setState 中的目标是将 newEvent 拼接到 this.state.events 紧跟在索引(pushNewEventContainerToState 函数中的参数)之后。
我遇到了这个错误,但我猜还有更多的事情发生:第 23:22 行:需要一个赋值或函数调用,但却看到了一个表达式 no-unused-expressions。
我发现代码至少有 2 个问题。 - Splice 将原地改变数组 - 您没有返回更新后的状态。
您可以改为使用 slice
来构建新数组。
pushNewEventContainerToState(index) {
let newEvent = < EventContainer / > ;
this.setState(prevState => {
const updatedEvents = [...prevState.events.slice(0, index], newEvent, ...prevState.events.slice(index + 1];
return {
events: updatedEvents
})
})
}
由于我对编码还很陌生,所以花了我一段时间,但我能够编译完整的答案。下面是代码。在此之下,我将逐点解释问题所在以及更新后的代码如何解决该问题。
class DayContainer extends React.Component {
constructor(props){
super(props);
this.state = {
events: [{key:0}],
};
this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
}
pushNewEventContainerToState(index) {
let newEvent = {key: this.state.events.length};
this.setState(prevState => {
let updatedEvents = [...prevState.events.slice(0, index + 1), newEvent, ...prevState.events.slice(index + 1)];
return {
events: updatedEvents
};
})
}
render(){
return (
<>
<div>
<ul>
{this.state.events.map((item, index) => (
<li key={item.key}>
< EventContainer pushNewEventContainerToState={() => this.pushNewEventContainerToState(index) } / >
</li>
))}
</ul>
</div>
</>
)
}
}
设置
从 state.events 开始,而不是从一个空数组开始,我从一个 object,包括一个从 0 开始的键,因为我总是希望用户从一个 EventContainer 开始。
关于 pushNewEventContainerToState,@Sushanth 提出了很好的建议。请直接参考我最新代码中的那个函数。我所做的改进与我将传递给它的 EventContainer 分开的方式有关。state.events。我已将 EventContainer 从 pushNewEventContainerToState 向下移动到 render() 元素。我给了它一个 key={item.key} 的 prop 并将组件实例包装在一个 li 中。第一个 EventContainer 的键值为 0(参见 state.events[0])。现在,每个传递给 state.events 的新 EventContainer 都有一个基于 state.events 数组的最新 .length() 的键(请参阅 pushNewEventContainerToState 中 let newEvent 变量的最新值)。
所有这些让我解决了我面临的一个大问题:我需要将最新的 EventContainer 放在索引中,紧跟在调用 pushNewEventContainerToState 的 EventContainer 的索引之后。发生这种情况的主要原因是我没有正确地将索引传递给 render() 内部的 EventContainer。现在我有了实际的 EventContainer,我可以以正确的方式向它传递一个 prop(请在渲染中参考 EventContainer 的 prop)。现在我用正确的索引调用 pushNewEventContainerToState。