javascript - 带有钩子的useEffect中的Promise函数内的setState?
问题描述
我正在尝试在 a 内部的 Promise 函数中设置钩子的值,useEffect()
并能够将返回的承诺值存储在fruit
钩子中,以便我可以在的返回函数中访问它MyComponent()
这是我到目前为止所尝试的:
const MyComponent = () => {
const [fruit, setFruit] = useState('')
useEffect(() => {
// my promise function that returns a string (a random fruit)
promiseFunction()
.then(value => setFruit(value))
}, [])
return <div>fruit ? fruit : Loading...</div>
}
到目前为止,我已经尝试了很多方法,但没有一个奏效。
useEffect(() => {
promiseFunction()
.then(value => setFruit(() => value))
}, [])
useEffect(() => {
promiseFunction()
.then(value => setFruit((value) => { fruit = value }))
}, [])
毕竟,钩子的返回值仍然是空的。
没有错误消息或任何东西,我尝试使用另一个 useEffect 进行调试,它仍然在控制台中返回一个。
如何获取 promise 函数的返回值并将其存储在fruit
变量中?
解决方案
第一个代码示例对我来说看起来很完美。我唯一担心的是函数本身没有正确返回该值。
您是否尝试过记录 promiseFunction 的返回值?编写此代码的另一种方法是使用可以在 useEffect 本身内部调用的函数,如下所示:
useEffect(() => {
async function loadFruitData() {
const promiseFunctionReturn = await promiseFunction()
console.log(promiseFunctionReturn)
setFruit(promiseFunctionReturn)
}
//Call the function
loadFruitData();
}, [])
这应该为您提供更好的方式来查看正在发生的事情,而且我也发现它更具可读性。
但是请记住,如果您在 setFruit 之后尝试 console.log() 数据,它不会向您显示更新的状态,这是因为 React 有一个队列来进行由 useState 引起的更新,这使得它看起来像一个异步更新。
推荐阅读
- c# - Post 服务调用了一次,但在 .NET Core Web API 上被调用了两次
- eclipse - Eclipse 中的 Smart Caret 对某些文件停止工作
- python - 在 Python 中打开一个可执行文件不断写入的文件时出错
- docker - 如何从 docker weblogic 访问远程 JMS 队列
- apache-kafka - 从 Kafka 中删除 __Consumer_offset 主题
- node.js - Heroku 在 60 秒内无法绑定 PORT
- powershell - 使用 Powershell 检索远程文件共享“共享权限”
- html - 应用程序根标签内的 Angular 代码样式不正确
- javascript - 在 react-native 中动态更改函数 onPress 处理程序
- hazelcast - 快速且可扩展的实时应用程序(Hazelcast Jet 是个好方法吗?)