reactjs - 如何使用 useEffect hook 来初始化 reducerstate
问题描述
所以我的问题是我想使用一个函数来生成我的初始状态,然后在我的减速器中使用该生成的状态。
我的 App 组件函数之外有这个 StateGenerator() 函数,它返回一个大数组。
如果我这样写:
const [boardState, tileDispatchFn] = useReducer(
tileReducer,
StateGenerator()
);
它可以工作,但是每次渲染都会执行 StateGenerator() 函数(这是正常的吗??)尽管状态没有重置为初始状态(我猜这很好??)
但是这些函数仍然会在每次渲染时执行,并且它会生成一个相当大的数组,如果我通过单击它来快速渲染它会中断
如果我这样写:
let initState = null;
useEffect(() => {
initState = StateGenerator();
}, []);
const [boardState, tileDispatchFn] = useReducer(
tileReducer,
initState
);
我收到这样的错误Cannot read property ... of null因为 useEffect 在渲染后执行
使用我的 StateGenerator() 函数生成初始状态的最简单方法是什么?最好的方法是什么?
解决方案
我认为最简单的方法是使用useReducer
作为初始化函数的第三个参数。
使用减速器-const [state, dispatch] = useReducer(reducer, initialArg, init);
您也可以懒惰地创建初始状态。为此,您可以传递一个
init
函数作为第三个参数。初始状态将设置为init(initialArg)
。它使您可以提取用于在 reducer 之外计算初始状态的逻辑。
我不知道你的状态是什么样的,但这就是它的使用方式。
const [boardState, tileDispatchFn] = useReducer(
tileReducer,
{ // <-- default initial board state
// state keys with safe default values
},
StateGenerator // <-- state initializer function
);
推荐阅读
- javascript - 在发送 Ajax 请求之前更改光标以等待
- java - Android:下载文件 octet-stream 网络视图
- javascript - 从 Vue.JS 方法中导入 JSON 文件 - Electron
- jquery - Laravel - 如何获取 Laravel 更改的两个日期之间的差异并将结果加载到文本框中
- python - 显示 FITS 文件内容
- c - GtkFileChooserDialog 上的 gtk_widget_destroy 导致分段错误
- python - 为什么我在 Tensorflow 中的逻辑回归分类器没有学习?
- javascript - 如何使用 Jest 测试处理来自外部变量的数据的函数
- http - 如何将来自 HTTPREAD 的数据存储到变量中?
- dns - 用于 Web 配置的正确 CNAME