如果满足某些条件,单击按钮时,我会将div组件推入数组。我在我的视图中显示我的列表。它工作正常,但在尝试从数组中删除div组件时遇到问题。为什么当我尝试从数组中删除对象时列表没有更新,但是当我向数组中添加对象时却可以正常工作数组?即使要从阵列中删除对象,我也想更新阵列,以便它应该实时删除要删除的div组件。
我已经检查过控制台日志,并且代码正常运行,因为当我单击removetextpoll
时,它删除了div组件,但问题是我的视图未保留。
我的代码如下。
class TextVotePost extends Component {
constructor() {
super();
this.state = {
addOption: 3,
maxImage: 4,
optionBtn: true,
};
this.addOption = this.addOption.bind(this);
}
addOption() {
this.setState(prevState => ({
addOption: ++prevState.addOption,
}));
}
render() {
let list = [];
const textPollMaxLength = 35;
function removetextpoll() {
list.splice(0, 1);
}
for (let i = 3; i <= this.state.maxImage; i++) {
{
this.state.addOption > i &&
list.push(
<div key={i}>
<div className="txt_vote_bar_div">
<div onClick={removetextpoll} />
<Field
name={`inputName${i}`}
component="input"
type="text"
placeholder={`Option ${i}`}
maxLength={textPollMaxLength}
/>
</div>
</div>,
);
}
}
return (
<form onSubmit={this.props.handleSubmit}>
{list}
<div onClick={this.addOption}>
<span>Add Option</span>
</div>
}
</form>
);
}
}
答案 0 :(得分:0)
反应组件仅在其状态或道具更改时才重新渲染。该列表不是状态或道具的一部分,只是您在渲染函数中声明的一些列表。
添加选项时,您正在更改addOption()
中的状态,但是要删除选项,您只是直接拼接该数组。您需要通过状态或道具对列表进行编辑,以使更改触发重新渲染并更新视图。
正如某人评论(看起来他们现在已将其删除)一样,请注意splice()
和slice()
之间的区别。直接改变状态/道具不会触发重新渲染,也将导致错误和奇怪的行为。要更改道具,您需要传递新的道具,或更改状态,您需要使用setState()
。