【发布时间】:2020-06-24 18:18:22
【问题描述】:
我有一个包含问题字段的 div 列表。对于每个按钮单击,我都会添加一行新的问题字段,并在状态中记住整个列表以及有多少行。我尝试添加一个删除按钮,但是当我的删除功能时,状态变量的值似乎是从创建行时记住的。我该如何解决这个问题,以便我可以访问 HandleDelete 函数中的完整列表?
const OefeningAanvragenDagboek = () => {
const { t, i18n } = useTranslation()
const [questionCount, setQuestionCount] = useState(1)
const [questionList, setQuestionList] = useState([])
const createNewLine = () =>{
var newLine=
<div>
<Field type="text" name={"vraag" + questionCount}/>
<Field component="select" name={"antwoordMogelijkheid"+questionCount}>
<option value="">...</option>
<option value="open">{t('oefeningAanvragenDagboek.open')}</option>
<option value="schaal">{t('oefeningAanvragenDagboek.scale')}</option>
</Field>
<Field type="text" name={"type"+questionCount}/>
<button onClick={() => HandleDelete(questionCount-1)}>{t('assignmentCard.delete')}</button>
</div>
setQuestionList(questionList => [...questionList, newLine])
setQuestionCount(questionCount+1)
}
const HandleDelete = (index)=> {
console.log(questionList)
// setQuestionList(questionList.splice(index, 1))
}
return (
<div>
<button onClick={createNewLine}>{t('oefeningAanvragenDagboek.addQuestion')}</button>
{questionList}
</div>
)
}
【问题讨论】:
-
splice改变原始数组并返回删除的项目。你永远不应该改变状态。您的突变可能会被覆盖,我怀疑您是否想将其更新为仅包含已删除的值。 -
我也遇到了同样的问题,有解决办法吗?
-
下面的答案是这个@BryceSnyder 的解决方案。您能否通过codesandbox.io 或类似方式附上您的问题的最小示例?
-
@95faf8e76605e973 把它放在一起。codesandbox.io/s/charming-architecture-9kp71?file=/src/App.js 如果你在添加 toasts 后点击任一关闭,它只会爆炸列表。试图从下面做“答案”,但它只是进一步中断。
-
@95faf8e76605e973 我忘了我正在重构,添加了 ID。如果您单击 X,它会起作用,但如果您单击按钮,它不会并且很不稳定。这就是问题所在。如果您单击 5x,然后单击您创建的第一个,则整个列表将被删除。如果您点击 5x,然后点击刚刚创建的实例,您将获得所需的功能...
标签: javascript reactjs react-hooks jsx use-state