Javascript 向父组件发送状态
我使用复选框将数据添加/删除到状态(即字符串数组) 在我的父组件上,我使用emails属性来接收这个字符串数组并在另一个状态下重新填充Javascript 向父组件发送状态,javascript,reactjs,state,Javascript,Reactjs,State,我使用复选框将数据添加/删除到状态(即字符串数组) 在我的父组件上,我使用emails属性来接收这个字符串数组并在另一个状态下重新填充 emails={(emails) => this.setState({ emails }, () => console.log(this.state.emails))} 但是我有一个问题,我假设是由于状态是异步的,第一个状态更新正确,但是我的第二个状态,在父组件中,仅在第二次交互时更新,导致了相反的结果预期,首先我单击复选框,字符串被添加到第一个
emails={(emails) =>
this.setState({ emails }, () => console.log(this.state.emails))}
但是我有一个问题,我假设是由于状态是异步的,第一个状态更新正确,但是我的第二个状态,在父组件中,仅在第二次交互时更新,导致了相反的结果预期,首先我单击复选框,字符串被添加到第一个状态,而不是第二个状态,然后,当我再次单击(取消选中)时,它将从第一个状态中删除,并在第二个状态中添加。如何解决这个问题?要解决这个问题,我只需直接在父组件上使用状态,我的复选框的onClick变为
const checkboxClick = (e, contact) => {
e.stopPropagation()
props.emails(contact.email)
}
我在父组件上收到这些电子邮件,如下所示
emails={x => {
const resultado = this.state.emails.indexOf(x)
if (resultado === -1) {
this.setState({ emails: [...this.state.emails, x] })
} else {
this.state.emails.splice(resultado, 1)
}
}}
您知道StackOverflow支持添加使用React的代码段吗?你可以在你的问题中为我们重现你的问题。这也将极大地帮助你获得有用答案的机会。你应该只有一个真相来源。删除子组件的本地状态i,并仅使用父状态。试试看,也许它会帮你解决这个问题。就是这样,我只是把字符串直接传递给父状态,然后把验证放在那里,现在它工作得很好,谢谢
const checkboxClick = (e, contact) => {
e.stopPropagation()
props.emails(contact.email)
}
emails={x => {
const resultado = this.state.emails.indexOf(x)
if (resultado === -1) {
this.setState({ emails: [...this.state.emails, x] })
} else {
this.state.emails.splice(resultado, 1)
}
}}