reactjs - 如何在 useEffect() 中正确实现 setState()?
问题描述
如果这个 useEffect() 运行一次(使用 [] 作为第二个参数), setTicket(response.data) 不会用数据更新票证的值。如果我以 [ticket] 作为参数运行 useEffect(),它会使用数据更新票证的值,但 useEffect 会变成无限循环。
我需要它运行一次并更新票证数据。我不认为我理解 useEffect() 及其第二个参数。
我该怎么做才能得到预期的结果?
import React from "react";
import axios from "axios";
import { useState, useEffect } from "react";
const EditTicket = (props) => {
const [ticket, setTicket] = useState("");
useEffect(() => {
axios
.get("http://localhost:4000/tickets/" + props.match.params.id)
.then((response) => {
setTicket(response.data);
console.log({ ticket });
})
.catch(function (error) {
console.log(error);
});
}, []);
return <div>edit</div>;
};
export default EditTicket;
解决方案
ticket
是本地人const
。它永远不会改变,这不是我们setTicket
想要做的。的目的setTicket
是告诉组件重新渲染。在下一次渲染中,将使用新值创建一个新的局部变量。
您的代码已经按照应有的方式编写,只是您的日志语句没有为您提供任何有用的信息。如果您想看到它使用新值重新呈现,您可以将日志语句移动到组件的主体。
const EditTicket = (props) => {
const [ticket, setTicket] = useState("");
console.log('rendering', ticket);
useEffect(() => {
// same as before
推荐阅读
- url - Kentico 迁移更新 URL
- c# - userControl 中的按钮单击应更改 Form 中的 PictureBox 图像
- python - 使用ghostscript将双倍pdf页面转换为单列pdf页面的参数是什么
- javascript - 如何使递归函数等待直到它完成 - nodejs
- javascript - 关于spring boot rest api和javascript ajax调用通信的问题
- android - 带有视频解码器的 MediaCodec 错误 0xffffff3
- javascript - 如何从反应原生android应用程序中选择文件并将其上传到php服务器?
- c# - 如何将 coreIdentity 添加到现有数据库
- android - 如何将editText数据传递给字符串URL
- ios - 使用 init 作为闭包