gpt4 book ai didi

javascript - react setState 不更新数组

转载 作者:行者123 更新时间:2023-11-30 14:50:37 27 4
gpt4 key购买 nike

我遇到了一个问题,setState 没有更新我的 todoItems 数组。我阅读了此处处理相同问题的其他帖子。在我的 addTodoItem() 中,我将 this.setState 更改为一个函数,我现在正在使用展开运算符,在数组中生成了一个新项目。这是日志:

(4) [{…}, {…}, {…}, {…}]0: {id: "1", item: "Learn React."}1: {id: 
"2", item: "Do Yoga."}2: {id: "3", item: "Be kind."}3: {id: "4",
item: "Have Fun"}length: 4__proto__: Array(0)
App.js:36 todo: Have Fun

但它实际上并没有更新数组。当我刷新时,它会恢复到原始状态。根据我的阅读,我认为我遇到了状态更新异步问题。我错过了什么?

class App extends Component {
constructor(props) {
super(props);

this.state = {
value: '',
listItemValue: props.value || '',
todoItems: [
{id: _.uniqueId(), item: 'Learn React.'},
{id: _.uniqueId(), item: 'Do Yoga.'},
{id: _.uniqueId(), item: 'Be kind.'}
]
};

this.addTodoItem = this.addTodoItem.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);
}

handleChange(event) {
let value = event.target.value;
this.setState({
value: this.state.value,
listItemValue: value
});
}

handleSubmit(event) {
event.preventDefault();
this.setState({
value: '',
listItemValue: ''
});
}

addTodoItem = () => {
let todoItems = this.state.todoItems.slice();
todoItems.push({
id: _.uniqueId(),
item: this.state.listItemValue
});
this.setState(prevState => ({
todoItems: [
...prevState.todoItems,
{
id: _.uniqueId(),
item: this.state.listItemValue
}
]
}))
};

render() {
return (
<div className="App">
<h1>Todo List</h1>
<TodoListForm name="todo"
onClick={()=>this.addTodoItem()}
onSubmit={ this.handleSubmit }
handleChange={ this.handleChange }
value={ this.state.listItemValue } />
<TodoList todoItems={ this.state.todoItems }/>
</div>
);
}
}

最佳答案

React“状态”并不像您认为的那样。它不是像数据库或 localStorage 这样的持久数据源。状态项与 JavaScript 中的任何其他变量一样,仅在单次加载的生命周期内存在。当您刷新网页时,每个变量都会被删除并重新初始化,就像您第一次登陆该页面一样。

如果你想持久化状态,你需要使用在刷新、 session 等期间持久化的东西。

如果您没有服务器,或者不需要服务器,您可以使用 localStorage或其他浏览器存储系统,但是这些不利于长期持久性。在某些时候,根据您正在构建的内容,您将需要使用连接到数据库的服务器。

关于javascript - react setState 不更新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160534/

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