我有一些副作用要应用在我的React组件中,并想知道如何组织它们:
- 使用一个单独的useEffect
- 或者使用多个useEffect
从性能和架构方面来看,哪个更好?
我有一些副作用要应用在我的React组件中,并想知道如何组织它们:
从性能和架构方面来看,哪个更好?
您需要遵循的模式取决于您的用例。
首先:您可能会遇到一种情况,需要在初始挂载期间添加事件侦听器并在卸载时将其清除,另一种情况是特定侦听器需要在属性更改时清除并重新添加。
在这种情况下,最好使用两个不同的useEffect
,以保持相关逻辑在一起,并获得性能上的好处。
useEffect(() => {
// adding event listeners on mount here
return () => {
// cleaning up the listeners here
}
}, []);
useEffect(() => {
// adding listeners everytime props.x changes
return () => {
// removing the listener when props.x changes
}
}, [props.x])
第二点:当任何状态或属性从一个定义好的集合中发生变化时,您需要触发一个API调用或其他副作用。在这种情况下,使用单个useEffect
与相关依赖项进行监控会更好。
useEffect(() => {
// side effect here on change of any of props.x or stateY
}, [props.x, stateY])
第三点:您需要为不同的更改集分别设置副作用。在这种情况下,将相关的副作用分离到不同的useEffect
中。
第三点:您需要为不同的更改集分别设置副作用。在这种情况下,将相关的副作用分离到不同的useEffect
中。
useEffect(() => {
// some side-effect on change of props.x
}, [props.x])
useEffect(() => {
// another side-effect on change of stateX or stateY
}, [stateX, stateY])
[]
(因为它仍然只是等待更改的状态/属性的 _子集_),但您也想重用代码。您是否使用单独的 useEffect
并将共享代码放入它们各自调用的函数中? - ecoeuseEffect
调用。 - hakazvaka你应该使用多个效果来分离关注点,如reactjs.org所建议的。
有多个 useEffect 是完全正常的。
以下是我的其中一个设置示例:
/*
* Backend tags list have changed add the changes if needed
*/
useEffect(() => {
setTagsList(setTagsAdded);
}, [setTagsAdded]);
/*
* Backend files have changed add the changes if needed
*/
useEffect(() => {
for (let i = 0; i < changedFilesMeta.length; i += 1) {
// Is the list item value changed
if (changedFilesMeta[i].id === currentEditableFile.id) {
unstable_batchedUpdates(() => {
setTags(changedFilesMeta[i].tags ? changedFilesMeta[i].tags : []);
});
}
}
}, [changedFilesMeta]);
/*
* Reset when user select new files using the filepicker
*/
useEffect(() => {
if (setNewFiles.length > 0) {
unstable_batchedUpdates(() => {
setCurrentFile(null);
setDescription('');
setTitle('');
setTags([]);
});
}
}, [setNewFiles]);
/*
* User selecet to edit a file, change to that file
*/
useEffect(() => {
// When user select a file to edit it
if (currentEditableFile && currentEditableFile !== theCurrentFile) {
setCurrentFile(currentEditableFile);
unstable_batchedUpdates(() => {
setDescription(currentEditableFile.description);
setTitle(currentEditableFile.title);
setTags(currentEditableFile.tags);
});
}
}, [currentEditableFile]);
setTags
正在更新哪个状态位吗? setTagsAdded
是函数还是对象?另外,你是如何确保这种方式比一个大的 useEffect 的性能和架构都更好呢? - AncientSwordRage