亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React - React 應用程序中閉包的影響

React - React 應用程序中閉包的影響

天涯盡頭無女友 2023-10-20 10:27:48
我偶然發現了一個對我來說非常奇怪的問題,但很可能很容易解釋。演示讓我們假設以下 React 組件import React, { useState, useEffect, useCallback } from "react";export default function App() {  const [test, setTest] = useState();  const doSomething = () => {    // TODO: Why does this returns the inital state value? Hoisting?    console.log(test);  };  const doSomethingWithCallback = useCallback(doSomething, [test]);  useEffect(() => {    setTest("asas");    window.setTimeout(() => doSomething(), 2000);    document.addEventListener("click", doSomethingWithCallback);    return () => {      document.removeEventListener("click", doSomethingWithCallback);    };  }, [doSomethingWithCallback]);  return (    <div className="App">      <h1>Click anywhere</h1>    </div>  );}(參見CodeSandbox)問題看一下TODO代碼中的注釋。為什么控制臺會記錄最初設置的doSomething狀態,即回調變體在調用時返回“真實”當前狀態?testundefined這是 React 正在做的某種提升或性能優化嗎?
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

這和吊裝沒有太大關系。setTest正在導致重新渲染,這將導致useCallback評估它的回調,因為它的依賴項發生了變化。

解釋為什么另一個函數調用返回初始值有點神秘,但我認為這與您注冊調用時的 test 值有關setTimeout。

AnysetState是異步的,如果您設置狀態然后同步嘗試立即引用狀態,則不能保證狀態中的值與您期望的值一致。相反,它很可能不會,我沒有完全了解,但我相信在同步工作隊列完全為空之前或多或少不會完成任何異步工作。

至于你的實際問題,“國家價值觀是否被提升?” 是的,就像 Javascript 中的所有值一樣。然而,反應狀態鉤子值略有不同,因為它們的執行順序在渲染之間必須始終相同,因此您必須至少保持那么多(即可能不存在條件鉤子實例化)。


查看完整回答
反對 回復 2023-10-20
  • 1 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號