我很确定我错过了React的一些基本内容。
代码是这样的:
export function EditTagsModal({existingTags}) {
console.log('existingTags', existingTags);
const [selectedTags, setSelectedTags] = React.useState(existingTags);
console.log('selectedTags:', selectedTags);
...
}
在父组件中,<EditTagsModal />
是这样被使用的:
{tags && <EditTagsModal existingTags={tags} /> }
是这样的:
existingTags
以['hello']
开头setSelectedTags
正在做它的事情。selectedTags
现在是['hello', 'world', 'world']
。- 然后我发送标签到服务器,关闭模态,重新渲染。
- 现在服务器返回的
tags
是['hello', 'world']
,没有副本。 - 事情是这样的:现在我再次打开模态,我仍然看到我的值在
selectedTags
(在上面的第二个console.log)有重复,而不是tags
(第一个console.log)从我的服务器。
react怎么了?
useState
钩子中的selectedTags
状态只初始化一次。
如果tags
仍然是一个真实定义的数组(即使空数组也是真实定义的),那么EditTagsModal
组件仍然由{tags && <EditTagsModal existingTags={tags} />}
挂载。如果tags
的值,因此existingTags
的道具更新和EditTagsModal
被重新渲染,那么你应该实现一个useEffect
钩子,它依赖于existingTags
的道具,在道具值更新时更新本地状态。
useEffect(() => {
setSelectedTags(existingTags);
}, [existingTags]);
带有依赖数组的useEffect
等同于类组件的componentDidMount
和componentDidUpdate
生命周期方法。