javascript - 异步调用后 React Context API 不更新状态
问题描述
我为自己的代码遵循此示例,但在单击按钮时异步获取调用后状态不会更新。
这是一个真正简单的应用程序,当用户加载页面时,它也会加载componentDidMount()
. 当用户单击获取“笑话”按钮时,它会再次使用新的“笑话”设置状态。
当页面加载时,笑话会在几毫秒后很好地呈现。但是当单击按钮时,它只在控制台中显示提取的“笑话”,但状态为null
.
单击按钮时,我记录了this
对象,它看起来像这样,是否正确?
这是代码和应用程序“工作”:https ://codesandbox.io/s/friendly-shirley-qupr4
我感谢任何评论。
解决方案
所以你忘记了绑定动作。在 JokeStat.js 中绑定动作
<JokesContext.Provider
value={{
joke: this.state.joke,
getJoke: this.getJoke.bind(this)
}}
>
{this.props.children}
</JokesContext.Provider>
或者改变
async getJoke() {
console.log("get joked triggered");
const joke = await fetchJoke();
console.log(joke,'joke')
console.log("state", this.state);
this.setState({ joke });
}
到
getJoke = async() => {
console.log("get joked triggered");
const joke = await fetchJoke();
console.log(joke,'joke')
console.log("state", this.state);
this.setState({ joke });
}
或第三个选项
<JokesContext.Provider
value={{
joke: this.state.joke,
getJoke: ()=>this.getJoke()
}}
>
{this.props.children}
</JokesContext.Provider>
推荐阅读
- javascript - javascript 从一个对象数组拆分为 2 个匹配项和不匹配项的数组
- javascript - 上传时的arraybuffer最大大小
- excel - 如何使用 Excel 脚本将动态范围转换为表格?
- python - 计算文本列作为其他两列的 concat(字符串总和)
- safari - 在 target='_blank' 之后强制 Safari 关闭选项卡
- reactjs - ReactJS:如何将图像从前端上传到公共文件夹
- javascript - 未处理的拒绝(TypeError):在 REACT FETCH 中将循环结构转换为 JSON
- eslint - 如何使用 ESLint 配置 jsdoc 格式?
- c++ - 如何找出四个整数中最大的?
- parameters - laravel 8 中缺少 ROUTE 所需的参数