pro*_*er1 0 javascript web reactjs
我正在尝试创建一个反应应用程序,该应用程序在按下按钮时添加一个反应组件,然后重新渲染它。我使用 state 内部的 p 元素数组作为测试。事件处理函数使用 setState 来修改数组,但由于某种原因它不会重新渲染组件,因此更改(新元素)不会显示在屏幕上。我做错了什么?
import React, {Component} from "react";
export default class Agenda extends React.Component{
constructor(props){
super(props);
this.list = [];
this.state = {
list:[]
};
this.addItem = this.addItem.bind(this);
const items = ["Hola Mundo 1","Hola Mundo 2","Hola Mundo 3"];
const itemComponent = items.map((item) =>
<p>{item}</p>
);
this.list = itemComponent;
this.state.list = itemComponent;
}
addItem(){
//Adds a new paragraph element at the end of the array
this.list[3]= <p>Hola Mundo 4</p>;
this.setState(
{
list: this.list
}
);
}
render(){
return(
<div id={this.props.id} className={this.props.className}>
{this.state.list}
<button onClick={this.addItem}>
Add item
</button>
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
您正在做的几件事在反应中是不好的做法。其中一个或多个可能会导致您的问题。问题是:
1)不要在状态下保存组件。您的状态应该只是确定组件的最少数据,并且组件本身会显示在渲染中。通过将组件存储在状态中,您很容易忘记更新状态,从而导致渲染不会改变。
2)不要将状态复制为实例变量。通过这样做,您只是强迫自己手动保持两个数据彼此同步。取而代之的是,拥有单一的事实来源,其他一切都源自于此。
3)不要改变状态。如果要将项目添加到数组,请创建一个新数组,它是旧数组的浅表副本,然后附加到该新数组。React 依赖于不可变的状态来判断状态是否已更改,因此更改是一种意外使重新渲染不会发生的简单方法。
export default class Agenda extends React.Component {
constructor(props) {
super(props);
this.state = {
list: ['Hola Mundo 1', 'Hola Mundo 2', 'Hola Mundo 3'],
};
this.addItem = this.addItem.bind(this);
}
addItem() {
this.setState((oldState) => {
const newList = [...oldState.list];
newList.push('Hola Mundo 4');
return { list: newList };
});
}
render() {
return (
<div id={this.props.id} className={this.props.className}>
{this.state.list.map(item =>
<p>{item}</p>
)}
<button onClick={this.addItem}>
Add item
</button>
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3082 次 |
最近记录: |