【问题标题】:State not immediately updating, even with prevState状态不会立即更新,即使使用 prevState
【发布时间】:2021-11-01 11:57:11
【问题描述】:

我正在尝试将“电子邮件”(这是一种状态)分配给“refE​​mail.current.value”。

所以我做setEmail(response.data) 并且当我做console.log(response.data) 时,我有预期的数据,但如果我在console.log(email) 之后立即做,我仍然有我的状态的默认值。我尝试使用 prevState 但它没有改变任何东西:setEmail(prevState => prevState, response.data)

这是我的代码:

const EditProfilModal = () => {

  const [email, setEmail] = useState('exemple') 

  const refFirstname = useRef();
  const refLastname = useRef();
  const refEmail = useRef();

  useEffect(() => {
    const toFetchEmail = async () => {
      try {
        const params = JSON.parse(localStorage.getItem("user")).user_id;
        const response = await axios.get(`http://localhost:4200/api/user/${params}`);
        setEmail(prevState => prevState, response.data)        
        console.log(response.data)
        console.log(email);
      } catch (err) {
        throw err;
      }
    };
    toFetchEmail()
    refFirstname.current.value = JSON.parse(localStorage.getItem("user")).user_firstname;
    refLastname.current.value = JSON.parse(localStorage.getItem("user")).user_lastname;
    refEmail.current.value = email;
  }, []);

  return (.....)

因此,第一个 console.log 返回预期数据,但第二个返回默认值(示例)而不是预期数据。为什么以及如何立即更新状态?

【问题讨论】:

标签: reactjs use-state


【解决方案1】:

这与useState set method not reflecting change immediately 中提到的问题相同 和 setState in react functional components is not being assigned property with assigned objects

React setState 或 useState 函数不会立即更改您的变量,它是一个异步过程,只会在下一次渲染时设置您的值,

console.log(email)
setEmail(newEmail)
console.log(email)

此代码显示与当前属性相同的日志尚未使用新属性更新,要检查状态变量的更改,您可以在函数之外(在组件返回之前)或在 useEffect 中检查它

useEffect(()=> {
    conole.log(email) // this will console latest value on your every `email` update
 },[email])

或者您可以在返回 HTML 之前简单地对其进行控制台,或者在 HTML 中,该值将在下一次渲染时自动更新

const EditProfilModal = () => {

  const [email, setEmail] = useState('exemple') 

  const refFirstname = useRef();
  const refLastname = useRef();
  const refEmail = useRef();

  useEffect(() => {
    const toFetchEmail = async () => {
      try {
        const params = JSON.parse(localStorage.getItem("user")).user_id;
        const response = await axios.get(`http://localhost:4200/api/user/${params}`);
        setEmail(prevState => prevState, response.data)        
        console.log(response.data)
       } catch (err) {
        throw err;
      }
    };
    toFetchEmail()
    refFirstname.current.value = JSON.parse(localStorage.getItem("user")).user_firstname;
    refLastname.current.value = JSON.parse(localStorage.getItem("user")).user_lastname;
    refEmail.current.value = email;
  }, []);
  console.log(email);  //This will console email on every render, you can check the update each time. it always consoles the latest updated value.
  return (.....)

【讨论】:

  • 嗨,感谢您的帮助,但我已经在使用 useEffect,因为它显示在我的代码中,甚至添加 [email] 作为我的 useEffect 的依赖项,当我这样做时不会改变任何东西:useEffect( ()=> { console.log(email) },[email]) console.log 返回我的“示例”,而不是预期的 response.data :/
  • 您可以在组件中写入任意数量的使用效果,保持当前使用效果不变,并创建一个具有电子邮件依赖关系的新效果。我已经建议了检查电子邮件更改的方法。两者都可以正常工作
  • 是的,我保留了我的代码并添加了这个:useEffect(() => { refEmail.current.value = email; }, [email]);但 ref.current.value 仍然等于“示例”
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 2021-11-07
  • 2018-08-05
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多