3 回答
TA貢獻1796條經(jīng)驗 獲得超7個贊
那準確嗎?
是的,正如您所說,Example1在每個渲染上創(chuàng)建一個變量(在范圍的末尾將其標記為“一次性” - 與 React 無關(guān),但與 Javascript 無關(guān)),Example2創(chuàng)建一次變量并維護它直到組件被卸載(或此變量的狀態(tài)通過setState) 更改。
就性能/良好實踐而言,這些方法之一是否更可???
作為一個好的做法 - Example1。
至于性能,應(yīng)該是Example1。Example2運行useState并將值a與每個渲染上的先前狀態(tài)進行比較,這比聲明變量“昂貴得多”。
一個更好的例子是比較組件引用/記憶變量與變量(示例1):
function Example2() {
const a = useRef(1);
const b = useMemo(() => 1, []);
return <div>{a.current} , </div>
}
但答案幾乎是一樣的。
看到這樣的代碼表明 refa 可能會改變。的使用useMemo表示這b是一個“繁重的計算”變量,如果不是,它只是一個開銷(與上面的解釋相同)并且更好地使用示例 1。
TA貢獻1788條經(jīng)驗 獲得超4個贊
將此答案的重點放在何時使用什么上。
基本概念,
如果您需要觀察一個值并對其做出反應(yīng),將其存儲在狀態(tài)中是有意義的。
如果您只想存儲一個值以用于顯示/計算目的,則使用 a
const/let更合適。
現(xiàn)在在你的第二個例子中
const [a] = useState(1)
這行代碼是錯誤的。那是因為您正在添加觀察者但不接受 setter 回調(diào)。
Example1 在每次渲染上創(chuàng)建一個變量
是的,這是正確的。在 Example2 中,它創(chuàng)建了 1 個變量,但是,React 中的狀態(tài)是不可變的。這意味著,每次渲染,整個對象都會被復(fù)制到一個臨時變量,銷毀并再次創(chuàng)建。由于這個事實,建議不要將大型對象存儲在狀態(tài)中,因為它會對您的性能產(chǎn)生不利影響。
TA貢獻1862條經(jīng)驗 獲得超6個贊
您的假設(shè)幾乎是正確useState的,變量創(chuàng)建一次并在每次渲染時重復(fù)使用。
但是,主要區(qū)別在于修改使用 useState 創(chuàng)建的變量(通過其 setter 方法)會觸發(fā)組件刷新。
如果你只需要在渲染之間保存一個值,你應(yīng)該使用其他鉤子,例如 useRef、useCallback 或 useMemo
添加回答
舉報
