#reactjs
#reactjs
Вопрос:
В настоящее время я работаю над своим первым проектом react js в виде списка задач. Он имеет значение ввода текста, значение которого передается в функцию при отправке для обновления элемента списка. Мой вопрос заключается в следующем, я хочу сделать так, чтобы при отправке он создавал новый
import React, { Component } from "react";
import ReactDOM from "react-dom";
class Tests extends Component {
constructor(props) {
super(props);
this.state = {
value: "",
object: [],
};
this.updateInputValue = this.updateInputValue.bind(this);
this.submit = this.submit.bind(this);
}
updateInputValue(evt) {
this.setState({
value: evt.target.value,
});
}
submit() {
this.setState({
object: this.state.value,
value: "",
});
}
render() {
return (
<div>
<label for="text">Text 1</label>
<input
type="text"
label="text"
onChange={(evt) => this.updateInputValue(evt)}
onSubmit={this.submit}
value={this.state.value}
/>
<br />
<button onClick={this.submit} style={{ height: 50, width: 60 }}>
Submit
</button>
<ul>
<li>{this.state.object}</li>
</ul>
</div>
);
}
}
export default Tests;
ReactDOM.render(<Tests />, document.getElementById("root"));
Если есть какие-либо предложения о том, как улучшить этот код, который я написал, я прочитаю их и попытаюсь улучшить свой код. Спасибо
Ответ №1:
Вы, по сути, перезаписываете значение object
на своем setState
. Что вам нужно сделать, это сохранить старый массив и добавить последний элемент. Используя синтаксис распространения:
submit() {
this.setState({
object : [...this.state.object, this.state.value],
value : "",
});
}
Это создает новый массив с добавлением вашего нового элемента. Будьте осторожны, чтобы не изменить состояние (другими словами, изменить this.state
):
// the above code is essentially doing this:
const newObject = [...this.state.object, this.state.value];
this.setState({ object: newObject });
// 👻 buggy version! This is mutating the state:
this.state.object.push(this.state.value);
При рендеринге вам необходимо отобразить несколько map
объектов:
<ul>
{ this.state.object.map(item => <li>{ item }</li>) }
</ul>
Комментарии:
1. Спасибо, мой друг, я думаю, что это может быть частью проблемы, однако теперь при отправке добавляется только один элемент <li> вместо создания совершенно нового
2. Я только что отредактировал свой ответ. Это связано с тем, что вы визуализируете сам массив, вам нужно сделать, это отобразить карту каждого элемента
object
массива.