javascript - 从 useState 设置状态而不触发 useEffect 钩子
问题描述
问题
我想防止触发在依赖数组中包含 useState 值的 useEffect 挂钩。为了清楚起见,请看示例。
详细解释
在初始化过程中,表单会设置一些值,因此我定义了一个标志以防止在完全初始化之前执行其他效果,但我也不想在初始化标志状态更改时触发第二个效果。
我可以以某种方式阻止对这种isInitialization
状态的跟踪吗?
我找不到可以解决我的问题的线程。您是否愿意链接与此相关的线程?提前致谢。
例子
export function SomeComponent(props) {
const [form] = useForm();
const [settings, setSettings] = useState(props.initialSettings);
const [isInitialization, setIsInitialization] = useState(true);
/**
* Updates the form settings state, just for initialization
*/
useEffect(() => {
if (isInitialization) {
form.setFieldsValue({
...settings,
});
setIsInitialization(false); // <-- This should not trigger any useEffect
}
}, [settings, form, isInitialization]);
useEffect(() => {
if (props.settingsChanges && !isInitialization) {
props.settingsChanges(settings, isValid && hasRequiredFields);
}
}, [settings, props, isInitialization]);
}
解决方案
尝试isInitialization
从依赖数组中删除。
useEffect(() => {
if (isInitialization) {
form.setFieldsValue({
...settings,
});
setIsInitialization(false); // <-- This should not trigger any useEffect
}
}, [settings, form]);
如果你想运行一个效果并且只清理一次(在挂载和卸载时),你可以传递一个空数组([])作为第二个参数。这告诉 React 你的效果不依赖于任何来自 props 或 state 的值,所以它永远不需要重新运行。这不是作为特殊情况处理的——它直接遵循依赖项数组的工作方式。
更新:
构建自己的 Hooks 可以让您将组件逻辑提取到可重用的函数中。
如果是通用逻辑,那么您可以创建自定义钩子并跨组件共享。
«useMyCustomHook.jsx» 文件:
import { useEffect } from 'react';
export default function useMyCustomHook(str) {
useEffect(() => {
console.log(`title`, title);
});
}
然后在组件中使用它:
function fooFunction(props) {
const [firstName, setFirstName] = useState('');
useMyCustomHook(`This is ${firstName}`);
return (
<div>The firstname is {firstName}</div>
);
}
推荐阅读
- c++ - 将boost库链接到C++项目中
- php - 使用数字键对关联多维数组的切片进行排序
- css - 如何在触摸板/触摸设备上添加鼠标悬停效果?
- python-3.x - 在泛型类内的泛型方法上绑定 TypeVar
- c# - 注册 CMD 提示上下文菜单
- javascript - 多选选项组
- mysql - 将 MySQL 转储导入 Google SQL - unique_checks=0 是不确定的
- c# - 将 Html 表格数据转换为 DataTable 而不循环
- sql-server - 优化跨多个数据库的慢 UNION ALL 查询
- javascript - React-Bootstrap-NavItem 上没有圆角