第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

React - React 應(yīng)用程序中閉包的影響

React - React 應(yīng)用程序中閉包的影響

天涯盡頭無女友 2023-10-20 10:27:48
我偶然發(fā)現(xiàn)了一個對我來說非常奇怪的問題,但很可能很容易解釋。演示讓我們假設(shè)以下 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代碼中的注釋。為什么控制臺會記錄最初設(shè)置的doSomething狀態(tài),即回調(diào)變體在調(diào)用時返回“真實”當(dāng)前狀態(tài)?testundefined這是 React 正在做的某種提升或性能優(yōu)化嗎?
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經(jīng)驗 獲得超10個贊

這和吊裝沒有太大關(guān)系。setTest正在導(dǎo)致重新渲染,這將導(dǎo)致useCallback評估它的回調(diào),因為它的依賴項發(fā)生了變化。

解釋為什么另一個函數(shù)調(diào)用返回初始值有點神秘,但我認為這與您注冊調(diào)用時的 test 值有關(guān)setTimeout。

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

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


查看完整回答
反對 回復(fù) 2023-10-20
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號