我是新來的反應。在我到目前為止找到的示例中,使用 react context api,您創建自己的背景關系物件并將其作為值傳遞給提供者等。所有示例似乎都存盤了整個背景關系(作為一個物件或總和其部分)處于狀態并將其用于請求。但是物件的生命周期是多少?它是在頁面重繪 期間只創建一次,還是在每個渲染周期重新創建,這樣它只能通過 useState 或 useRef 生存?換句話說,useState 是否真的需要在渲染周期之間存盤背景關系資料,還是 useState 僅用作訂閱更改的一種方式?
這是我根據我看過的教程創建背景關系的方式......
(要清楚,我的問題是關于 context.js 中“contextData”物件的生命周期,以及是否重新渲染或狀態更改或其他一些生命周期事件會導致重新運行包括 contextData 實體化和 createContext 的腳本,或者是否其他一些createContext、contextData 和 useContext 之間的奇怪互動正在進行。)
背景關系.js
import React from "react";
const contextData = {
prop1: "something",
prop2: "somethingElse",
func1: someFunction(stuff) {
prop1 = ".";
},
};
const myContext = React.createContext(contextData);
export {myContext};
function MyContextProvider({children}) {
render <myContext.Provider value={myContext}>{children}</myContext.Provider>;
}
export default MyContextProvider;
index.js
...
root.render(
<MyContextProvider><App /></ContextProvider>
);
SomeComponent.js
import {useContext} from "react";
import {myContext} from "./context"
function SomeComponent() {
const ctx = useContext(myContext);
return <span>{ctx.prop1}</span>
}
uj5u.com熱心網友回復:
這有點重言式,但只要創建背景關系物件的函式再次運行,就會重新創建背景關系物件。該函式將(幾乎總是)是一個組件或自定義鉤子。
React 的理念是視圖應該從狀態流出,因此狀態更改會導致(功能)組件再次運行以確定如何更改視圖(如果有的話)。如果狀態包含在背景關系物件中也是如此 - 如果呼叫背景關系物件內的狀態設定器,則包含該狀態的初始化程式的功能組件再次運行,導致新物件被傳遞給消費者。
換句話說, useState 是否真的需要在渲染周期之間存盤背景關系資料
是的。
但是物件的生命周期是多少?
一旦重新渲染并且沒有子物件在陳舊的閉包中參考舊物件,通常會對一個特定的背景關系物件進行垃圾收集。
只有在背景關系提供程式周圍的組件卸載后,所有背景關系物件才會被垃圾收集。
關于問題中的代碼——通過改變一個傳遞下來的物件,你打破了標準的 React 作業流程,它應該避免對這些型別的值進行突變。.createContext呼叫父組件并傳遞更改prop1屬性的狀態設定器會好得多。
也就是說,如果你不這樣做 - 頂層context.js只運行一次,所以你只創建一次物件,這樣一個物件就會永遠存在。(如果您更改代碼以便也想在其他地方使用背景關系,這可能是一個錯誤 - 背景關系值將包括舊的突變)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522288.html
標籤:r反应反应钩子
下一篇:合并r中的冗余行項
