【发布时间】:2020-06-04 18:55:35
【问题描述】:
我想知道初始化状态并使其与服务器保持同步的最佳方式/模式是什么。在过去的几天里,我已经阅读并尝试了很多,但没有找到任何可以解决我问题的东西。
这个例子很简单。有一个状态——为了简单起见,它在示例中是一个数字,尽管在现实生活中它是一个对象——我需要从服务器中检索它。检索后,我希望它与服务器同步。 getValueFromServer 是一个模拟,它在 setTimeout 中等待随机时间后返回一个随机值。
所以,为了初始化我的状态,我在一个空数组上使用了一个 useEffect 作为依赖项,为了保持同步,我使用了一个将状态作为依赖项的 useEffect。
问题是它试图保存一个未定义的值。日志如下。
1 -> 第一次初始化
2 -> API 调用保存在服务器值:未定义
3 -> API 调用保存在服务器值:6.026930847574949
我得到了什么:
1:按预期在安装时运行。
2:这是我没想到的。我猜它是因为“useState”而触发的。
3:一旦我们从服务器获得响应就运行。有点明显但很痛苦,因为我到底为什么要保存这个。
这里最好的方法是什么?在具有依赖关系的 useEffect 中使用“isInitialized”标志之类的东西感觉有点被黑而不专业。
下面的代码,你也可以在这里找到它:https://codesandbox.io/s/optimistic-rgb-uce9f
import React, { useState, useEffect } from "react";
import { getValueFromServer } from "./api";
export default function App() {
const [value, setValue] = useState();
useEffect(() => {
async function initialize() {
console.log("Initializing for first time");
let serverValue = await getValueFromServer();
setValue(serverValue);
}
initialize();
}, []);
useEffect(() => {
console.log("API call to save in server value: ", value);
}, [value]);
const handleClick = () => {
setValue(value + 1);
};
return (
<div className="App">
<h1>Value: {value}</h1>
<button onClick={handleClick}>Add 1 to value</button>
</div>
);
}
【问题讨论】:
标签: reactjs react-hooks data-synchronization