state 狀態
State簡介
state的主要作用是用於組件保存、控制、修改自己的可變狀態。其在組件內部初始化,能被組件自身修改,而外部不能訪問也不能修改。 你可以將state理解為是一個被組件自身控制的資料。
對比一下props的主要作用是讓父組件可以傳入參數至子組件。 但它是外部傳進來的參數,子組件內部無法控制也無法修改。 除非父組件主動傳入新的props,否則組件的props永遠保持不變。
總而言之,state與props差別在於, state是讓組件控制自己的狀態, props則是讓父組件對組件進行配置。 但是它們都可以決定組件的行為和顯示形態。
透過useState在函數組件中引入state
在函數組件中引入state非常簡單,只需要先將useState給import進來,如 :
import React, {useState} from 'react';
組件自己使用state
在使用上,先透過陣列的解構賦值宣告兩個變數,第一個變數是state的名稱,第二個是重新設定值給state的函數名稱,並給useState傳入初始值即可。 下面例子整個過程先是state在組件內部初始化,初始值為0, 並且保存在Count裡供隨時使用,如顯示button被按了幾次, 且每當button被點擊則可以透過setCount修改state裡面的值, 這樣就實現組件自己使用state控制自己的狀態了。
const App = () => {const [Count, setCount] = useState(0);return (<><p>這是我第一個函數組件App</p><div>Count : {Count}</div><button a={() => { setCount(Count+1) }}></button></>)}
再給一個更實際的例子,也可以在樣式上使用state,例如下 :
const App = () => {const [Count, setCount] = useState(0);//若Count大於0,背景就綠色否則紅色return (<><p>這是我第一個函數組件App</p><div>Count : {Count}</div><button a={() => { setCount(Count+1) }}></button><div style={{ backgroundColor: Count > 0 ? "green" : "red" }}>按了變色</div></>)}
state通過props傳給子組件
在父組件通過props傳state給子組件 :
//父組件 :const App = () => {const [Count, setCount] = useState(0);return (<><p>這是我第一個函數組件App</p><Buttonone a={Count}></Buttonone></>)}
在子組件接收並顯示在按鈕上 :
//子組件const Buttonone = (props) => {return (<button>按鈕 {props.a}</button>)}
用傳入的props做組件的state
如下例子,雖然將父祖件傳入的props.a作為Buttonone的state初始值, 但是Buttonone的state是由Buttonone自己控制的, 除非點擊Buttonone組件內的按鈕, 讓它觸發Buttonone組件自己的setRestore, 按鈕裡面的數字才會增加。 其實也順便說明一件事就是State用在組件內是不受外部影響的。
//父組件 :const App = () => {const [Count, setCount] = useState(0);return (<><p >這是我第一個函數組件App</p><Buttonone a={Count}></Buttonone></>)}
//子組件const Buttonone = (props) => {const [Restore, setRestore] = useState(props.a)return (<><button onClick={() => { setRestore(Restore + 2) }}> 按鈕 {Restore}</button><p>props.a : {props.a}</p></>)}