javascript - 如何使用来自 useEffect 的异步返回值作为 useState 中的默认值?
问题描述
我创建了一个简单的示例https://codesandbox.io/s/4zq852m7j0。
如您所见,我正在从远程源获取一些数据。我想将返回值用作我的文本字段中的值。
const useFetch = () => {
const [value, setValue] = useState("");
useEffect(
async () => {
const response = await fetch("https://httpbin.org/get?foo=bar");
const data = await response.json();
setValue(data.args.foo);
},
[value]
);
return value;
};
但是,使用函数内部的值useState
不起作用。我认为useState
仅在第一次渲染时使用默认值。首次渲染时,显然没有设置该值,因为它是异步的。文本字段应该有值bar
,但它是空的。
function App() {
const remoteName = useFetch();
// i want to see the remote value inside my textfield
const [name, setName] = useState(remoteName);
const onChange = event => {
setName(event.target.value);
};
return (
<div className="App">
<p>remote name: {remoteName}</p>
<p>local name: {name}</p>
<input onChange={onChange} value={name} />
</div>
);
}
从远程获取值后,我希望能够在本地更改它。
有任何想法吗?
解决方案
现在useFetch
返回一个异步可用的值,您需要在 remoteValue 可用时更新 localState,为此您可以编写一个效果
const remoteName = useFetch();
// i want to see the remote value inside my textfield
const [name, setName] = useState(remoteName);
useEffect(
() => {
console.log("inside effect");
setName(remoteName);
},
[remoteName] // run when remoteName changes
);
const onChange = event => {
setName(event.target.value);
};
推荐阅读
- angular - 如何将包含形状文件数据的自定义图块集与高程值一起添加到地图框
- android - AOSP 构建在 .mk 文件中显示所有 PRODUCT_PACKAGES 变量
- java - MacOS Big Sur 11.1 无法启动 eclipse 安装程序
- f# - 你能在 F# 的编译时表示一个封闭的网络吗?
- javascript - 我正在尝试在 javascript 中创建一个待办事项列表,但 HTML 没有显示它
- google-calendar-api - 使用 URL 和预定义的事件 ID 创建 Google 日历事件
- python - 对解析为字符串的 JSON 对象使用字符串格式
- python - 了解我的不区分大小写的列表比较
- mediawiki - 侧边栏链接与 wgServer 无关
- javascript - 在 SweetAlert 中显示视频