Я новичок в reactjs и пытаюсь реализовать простое приложение todo. Но после отправки я не могу вставить массив, то есть переменную состояния.
Вот мой код:
import React, { Component } from 'react';
class ToDo extends Component{
constructor(props){
super(props)
this.state = {list:['hello'],item:''}
this.handleSubmit=this.handleSubmit.bind(this)
this.handleSearchChange=this.handleSearchChange.bind(this)
}
handleSubmit(e){
e.preventDefault();
this.setState(state=>({list:(state.list.push(this.state.item))}))
}
handleSearchChange(e){
this.setState({item:e.target.value})
}
render(){
console.info('state:',this.state.list)
let listing=this.state.list.map((item)=><li key = {item}>{item}</li>)
return(
<div >
<form onSubmit = {this.handleSubmit}>
<div className = "form-group">
<label>
<input className = "form-control "type = "text" value = {this.state.item} onChange = {this.handleSearchChange} />
</label>
<label>
<input type = "submit" value = "Submit" className = "form-control" />
</label>
</div>
</form>
<ul>{listing}</ul>
</div>
)
}
}
export default ToDo;
Когда я пытаюсь нажать «Отправить», происходит перенаправление на ошибку. Помощь будет оценена. Спасибо.
попробуй это:
handleSubmit(e){
const { list, item } = this.state
e.preventDefault();
this.setState({ list: [...list, item] })
}
Объяснение: вы не можете изменять данные, вместо этого объедините их так. Совет: всегда используйте функции es6, поэтому привязка вам не понадобится.
Спасибо. Можете ли вы также сказать, что я должен выполнить операцию разделения в той же ситуации, если у меня есть индекс.
Да, я скажу вам, если вы выберете мой ответ, как я отвечал раньше;)
this.setState({list:[...this.state.list.splice(index,1)]})
это будет работать?
Лучше пусть список this.state.list с полными данными. Затем вы могли бы разрезать его, когда вызываете состояние следующим образом: this.state.list.slice (). Map ((item) => <li key = {item}> {item} </li>. Используйте slice вместо splice потому что срез создает новый массив в отличие от среза (для беспокойства о неизменности)
также еще один совет, попробуйте использовать const вместо let для лучшей практики, необходимость let очень редка (я почти никогда не использую его лично), потому что в любом случае ваша страница повторно визуализируется: const листинг = this.state.list.map ((item) = > <li key = {item}> {item} </li>.
Вам это легко и полезно ...
handleSubmit(e){
const {list, item}=this.state;
e.preventDefault();
this.setState({ list: [...list, item] });
}
Не изменяйте состояние напрямую. сделайте копию состояния и затем вставьте в нее значение, а затем используйте setState.