- ReactJS 教程
- ReactJS - 首頁
- ReactJS - 簡介
- ReactJS - 路線圖
- ReactJS - 安裝
- ReactJS - 特性
- ReactJS - 優點和缺點
- ReactJS - 架構
- ReactJS - 建立 React 應用程式
- ReactJS - JSX
- ReactJS - 元件
- ReactJS - 巢狀元件
- ReactJS - 使用新建立的元件
- ReactJS - 元件集合
- ReactJS - 樣式
- ReactJS - 屬性 (props)
- ReactJS - 使用屬性建立元件
- ReactJS - props 驗證
- ReactJS - 建構函式
- ReactJS - 元件生命週期
- ReactJS - 事件管理
- ReactJS - 建立一個事件感知元件
- ReactJS - 在 Expense Manager 應用程式中引入事件
- ReactJS - 狀態管理
- ReactJS - 狀態管理 API
- ReactJS - 無狀態元件
- ReactJS - 使用 React Hooks 進行狀態管理
- ReactJS - 使用 React Hooks 進行元件生命週期管理
- ReactJS - 佈局元件
- ReactJS - 分頁
- ReactJS - Material UI
- ReactJS - Http 客戶端程式設計
- ReactJS - 表單程式設計
- ReactJS - 受控元件
- ReactJS - 非受控元件
- ReactJS - Formik
- ReactJS - 條件渲染
- ReactJS - 列表
- ReactJS - Keys
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 動畫
- ReactJS - Bootstrap
- ReactJS - Map
- ReactJS - 表格
- ReactJS - 使用 Flux 管理狀態
- ReactJS - 測試
- ReactJS - CLI 命令
- ReactJS - 構建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 簡介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定義 Hooks
- ReactJS 高階
- ReactJS - 可訪問性
- ReactJS - 程式碼分割
- ReactJS - 上下文
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - 片段
- ReactJS - 高階元件
- ReactJS - 與其他庫整合
- ReactJS - 最佳化效能
- ReactJS - Profiler API
- ReactJS - 埠
- ReactJS - 無 ES6 ECMAScript 的 React
- ReactJS - 無 JSX 的 React
- ReactJS - 調和
- ReactJS - Refs 和 DOM
- ReactJS - 渲染 Props
- ReactJS - 靜態型別檢查
- ReactJS - 嚴格模式
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期選擇器
- ReactJS - Helmet
- ReactJS - 內聯樣式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 走馬燈
- ReactJS - 圖示
- ReactJS - 表單元件
- ReactJS - 參考 API
- ReactJS 有用資源
- ReactJS - 快速指南
- ReactJS - 有用資源
- ReactJS - 討論
ReactJS - static getDerivedStateFromProps() 方法
React 是一個著名的 JavaScript 庫,用於建立使用者介面。React 中有一個名為 getDerivedStateFromProps 的方法,看起來很複雜,但讓我們將其分解成簡單的詞語。
在 React 中,getDerivedStateFromProps 方法在元件渲染之前呼叫,無論是在首次出現時還是在更新時。其目標是確定元件的狀態是否需要響應其 props 的更改而更改。
語法
static getDerivedStateFromProps(props, state)
引數
props - 元件將渲染的下一組 props。
state - 元件即將渲染的狀態。
返回值
如果需要更新狀態,則應返回一個物件;否則,應返回 null。
示例
示例 1
讓我們使用 getDerivedStateFromProps 函式建立一個簡單的 React 應用程式。在此示例中,我們將建立一個表單,該表單在使用者 ID 更改時自動重新整理電子郵件地址。
import React, { Component } from 'react';
class Form extends Component {
state = {
email: this.props.defaultEmail,
prevUserID: this.props.userID
};
static getDerivedStateFromProps(props, state) {
if (props.userID !== state.prevUserID) {
return {
prevUserID: props.userID,
email: props.defaultEmail
};
}
return null;
}
handleUserIDChange = (e) => {
// Simulate user ID change
this.props.onUserIDChange(e.target.value);
};
handleEmailChange = (e) => {
this.setState({ email: e.target.value });
};
render() {
return (
<div>
<label>
User ID:
<input type="text" value={this.props.userID} onChange={this.handleUserIDChange} />
</label>
<br />
<label>
Email:
<input type="text" value={this.state.email} onChange={this.handleEmailChange} />
</label>
</div>
);
}
}
class App extends Component {
state = {
userID: '123',
defaultEmail: 'user@example.com'
};
handleUserIDChange = (newUserID) => {
this.setState({ userID: newUserID });
};
render() {
return (
<div>
<h1>Form App</h1>
<Form
userID={this.state.userID}
defaultEmail={this.state.defaultEmail}
onUserIDChange={this.handleUserIDChange}
/>
</div>
);
}
}
export default App;
輸出
在上面的示例中,Form 元件具有使用者 ID 和電子郵件輸入。當用戶 ID 更改時,getDerivedStateFromProps 函式重置電子郵件。handleUserIDChange 函式模擬使用者 ID 更改。App 元件設定 Form 並管理使用者 ID 的更改。這是一個基本示例,我們可以對其進行更改以滿足我們的特定需求。
示例 2
現在,我們將建立一個簡單的計數器應用程式,其中初始計數作為引數給出,並且可以遞增計數器。當 prop 更改時,將呼叫 getDerivedStateFromProps 函式來更新狀態。
import React, { Component } from 'react';
import './App.css';
class Counter extends Component {
state = {
count: this.props.initialCount,
};
static getDerivedStateFromProps(props, state) {
// Check if the initial count prop has changed
if (props.initialCount !== state.count) {
// Update the state with the new initial count
return {
count: props.initialCount,
};
}
return null;
}
handleIncrement = () => {
this.setState((prevState) => ({
count: prevState.count + 1,
}));
};
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.handleIncrement}>Increment</button>
</div>
);
}
}
class App extends Component {
state = {
initialCount: 0,
};
handleInitialCountChange = (e) => {
const newInitialCount = parseInt(e.target.value, 10);
this.setState({ initialCount: newInitialCount });
};
render() {
return (
<div className='App'>
<h1>Counter App</h1>
<label>
Initial Count:
<input
type="number"
value={this.state.initialCount}
onChange={this.handleInitialCountChange}
/>
</label>
<Counter initialCount={this.state.initialCount} />
</div>
);
}
}
export default App;
輸出
現在,我們有一個簡單的 React 應用程式,其中計數器根據初始 count prop 更新,並且 getDerivedStateFromProps 方法用於處理 prop 更改。
示例 3
讓我們建立一個簡單的 React 應用程式,該應用程式使用生命週期方法 getDerivedStateFromProps 根據使用者是否登入來顯示訊息。因此,在執行應用程式後,我們將能夠看到使用者已登入或已登出的訊息。
import React, { Component } from 'react';
import './App.css';
class LoginStatus extends Component {
static getDerivedStateFromProps(props, state) {
// Check if the user is logged in
const isLoggedIn = props.isLoggedIn;
// Display different messages as per the login status
return {
statusMessage: isLoggedIn ? 'Welcome back! You are logged in.' : 'Please log in.'
};
}
render() {
return (
<div>
<p>{this.state.statusMessage}</p>
</div>
);
}
}
class App extends Component {
state = {
isLoggedIn: false
};
handleLoginToggle = () => {
this.setState((prevState) => ({
isLoggedIn: !prevState.isLoggedIn
}));
};
render() {
return (
<div className='App'>
<h1>Login App</h1>
<button onClick={this.handleLoginToggle}>
{this.state.isLoggedIn ? 'Logout' : 'Login'}
</button>
<LoginStatus isLoggedIn={this.state.isLoggedIn} />
</div>
);
}
}
export default App;
輸出
在上面的應用程式中,我們使用了 getDerivedStateFromProps() 方法來檢查使用者的登入和登出狀態。正如我們在上面的輸出中看到的,當我們單擊該按鈕時,螢幕上會顯示一個按鈕,它將顯示訊息“歡迎回來!您已登入。”並且按鈕更改為登出。
侷限性
與以前的 UNSAFE_componentWillReceiveProps 不同,它在每次渲染時都會被呼叫。
它無法訪問元件例項,因此我們不能直接在其中使用它。
總結
getDerivedStateFromProps 函式乍一看可能很難,但它是特定條件下的工具。簡單來說,它允許我們根據其 props 的更改來管理元件的狀態。