使用 React useState 更改 objects 的数组
Changing an array of objects with React useState
我有一个日历应用程序,它使用 objects:
数组呈现其事件
const [events, setEvents] = useState([
{
title: "Werk",
start: moment().toDate(),
end: moment(),
allDay: false,
},
])
我正在尝试允许用户使用页面上的输入添加新事件。
到目前为止,我只是想用这段代码更改事件的标题
<input
placeholder="Name"
onChange={(e) =>
setEvents([{ ...events, title: e.target.value }, console.log(events.title)])
}
required
></input>
当我 console.log(e.target.value)
时,它给出了我输入的内容,但 (events.title)
给出了未定义的内容。
我的最终目标是让用户使用以下格式的输入添加新事件。如果我走错了路,或者你知道更好的方法,我很乐意听到。
const [events, setEvents] = useState([
{
title: "Werk",
start: moment().toDate(),
end: moment(),
allDay: false,
},
// this is what the user will add
{
title: "Example",
start: Number,
end: Number
}
])
提前谢谢你,我的完整代码是Here And here is a codesandbox: https://codesandbox.io/embed/gracious-minsky-pp1w5?codemirror=1
我认为 console.log
放错了地方,您不应该在数组赋值中调用该函数。即使你在下面调用它,setEvents 函数也不会给你标题,因为 useState
的 set 函数是异步的。另外我认为你没有正确地将事件分配到你的数组中。
这一行:
setEvents([{ ...events, title: e.target.value }, console.log(events.title)])
您正在将事件散布在一个新数组中,然后添加标题,留下类似于这样的结构:
[{
"0": {
"title": "Werk",
"start": "2020-12-05T05:12:57.931Z",
"end": "2020-12-05T05:12:57.931Z",
"allDay": false
},
"title": "myNewTitle"
}]
并为输入中的每个更改嵌套此标题。
对于您想要实现的结构,您必须将一个新条目推送到一个已经包含您之前事件的数组中,然后更新状态。喜欢:
//I think the best approach is calling this in a submit or button click event
const buttonClick = () => {
const newEvents = [...events]; //This spreads every element inside the events array into a new one
newEvents.push({
title: eventTitleState, //You also need a useState for the title
start: moment().toDate(),
end: moment(),
});
setEvents(newEvents);
}
你可以在这里看到这个想法:https://codesandbox.io/s/green-cherry-xuon7
您更改标题的方法不正确。由于它是 object 的数组,您需要找到特定的 object,然后更改特定的标题。在您的情况下,用您的代码替换此代码有助于更改 0 索引的标题。
<input
placeholder="Name"
onChange={(e) =>{
let tempArr = [...events];
tempArr[0].title = e.target.value;
setEvents(tempArr)
}}
required
>
如果您还想添加新的 objects,请在某些事件上将其推送到 tempArr 并更新 setEvents。
我有一个日历应用程序,它使用 objects:
数组呈现其事件const [events, setEvents] = useState([
{
title: "Werk",
start: moment().toDate(),
end: moment(),
allDay: false,
},
])
我正在尝试允许用户使用页面上的输入添加新事件。 到目前为止,我只是想用这段代码更改事件的标题
<input
placeholder="Name"
onChange={(e) =>
setEvents([{ ...events, title: e.target.value }, console.log(events.title)])
}
required
></input>
当我 console.log(e.target.value)
时,它给出了我输入的内容,但 (events.title)
给出了未定义的内容。
我的最终目标是让用户使用以下格式的输入添加新事件。如果我走错了路,或者你知道更好的方法,我很乐意听到。
const [events, setEvents] = useState([
{
title: "Werk",
start: moment().toDate(),
end: moment(),
allDay: false,
},
// this is what the user will add
{
title: "Example",
start: Number,
end: Number
}
])
提前谢谢你,我的完整代码是Here And here is a codesandbox: https://codesandbox.io/embed/gracious-minsky-pp1w5?codemirror=1
我认为 console.log
放错了地方,您不应该在数组赋值中调用该函数。即使你在下面调用它,setEvents 函数也不会给你标题,因为 useState
的 set 函数是异步的。另外我认为你没有正确地将事件分配到你的数组中。
这一行:
setEvents([{ ...events, title: e.target.value }, console.log(events.title)])
您正在将事件散布在一个新数组中,然后添加标题,留下类似于这样的结构:
[{
"0": {
"title": "Werk",
"start": "2020-12-05T05:12:57.931Z",
"end": "2020-12-05T05:12:57.931Z",
"allDay": false
},
"title": "myNewTitle"
}]
并为输入中的每个更改嵌套此标题。
对于您想要实现的结构,您必须将一个新条目推送到一个已经包含您之前事件的数组中,然后更新状态。喜欢:
//I think the best approach is calling this in a submit or button click event
const buttonClick = () => {
const newEvents = [...events]; //This spreads every element inside the events array into a new one
newEvents.push({
title: eventTitleState, //You also need a useState for the title
start: moment().toDate(),
end: moment(),
});
setEvents(newEvents);
}
你可以在这里看到这个想法:https://codesandbox.io/s/green-cherry-xuon7
您更改标题的方法不正确。由于它是 object 的数组,您需要找到特定的 object,然后更改特定的标题。在您的情况下,用您的代码替换此代码有助于更改 0 索引的标题。
<input
placeholder="Name"
onChange={(e) =>{
let tempArr = [...events];
tempArr[0].title = e.target.value;
setEvents(tempArr)
}}
required
>
如果您还想添加新的 objects,请在某些事件上将其推送到 tempArr 并更新 setEvents。