在程式中常會需要宣告變數來賦值或儲存值,變數主要分為兩種:
在程式語言中,變數和一般數學定義有些不同,常數跟變數都稱為一種 variable。而現今 JavaScript ES6 版本,會推薦分別使用 const 及 let 來宣告變數(不要再用 var 了!),然而許多新手在剛接觸 React 的 function component 撰寫前端網頁時,可能都出現過這樣的疑問:
這兩個都屬於 block-scoped local variables,大部分情境使用 const 即可,能更好管理及維護程式並減少犯錯的機會,需要重新賦值時才使用 let。
let:
export default function Counter() {
let count = 0;
function handleClick() {
count = count + 1;
}
return (
<>
<button onClick={handleClick}>Count</button>
<span>點擊數量:{count} 次</span>
</>
);
}
值沒改變,畫面也未再次渲染,當然也就不會有什麼改變;這時候,就需要 useState 來新增 state variable 了,既能讓變數在不同 render 之間保留下來,還會觸發畫面 render!
useState is a React Hook that lets you add a state variable to your component.
-React
import { useState } from "react";
export default function Counter() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<>
<button onClick={handleClick}>Count</button>
<span>點擊數量:{count} 次</span>
</>
);
}
在剛剛的範例中,count 這個變數不只需要在不同 render 間保留,還需要觸發 render,因此需要使用 useState;但如果是需要保留變數,卻不需要重新渲染畫面的情境,可以使用 React 提供的另一個 hook:useRef
useRef is a React Hook that lets you reference a value that’s not needed for rendering.
-React
import { uesRef, useEffect } from "react";
export default function Counter() {
const firstTimeRef = uesRef(false);
useEffect(() => {
if (!firstTimeRef.current) {
firstTimeRef.current = true;
return;
}
doSomething();
});
return <></>;
}
用來在 render 間記住、卻在改變時不需要觸發 render 的變數是 useRef 其中一種用法,此外它也很常用來操作 DOM,更多詳細資訊及用法可參考 React 官網介紹。
變數種類 | const | let | useRef | useState |
---|---|---|---|---|
常數 / 變數 | 常數 | 變數 | 變數 | 狀態變數 |
賦值 | 不可重新賦值 | 可重新賦值 | 可重新賦值 | 可透過 setState 重新賦值 |
render 之間 | 重新宣告 | 重新宣告 | 記住 value | 記住 value |
value 改變時 | X | 不會觸發 render | 不會觸發 render | 觸發 render |
References: