
- 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 - Context
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - 片段
- ReactJS - 高階元件
- ReactJS - 與其他庫整合
- ReactJS - 最佳化效能
- ReactJS - Profiler API
- ReactJS - Portals
- 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 - useInsertionEffect 鉤子
‘useInsertionEffect’ 鉤子是在 React JS 的第 18 個版本中引入的。useInsertionEffect 鉤子提供了一種新的、使用者友好的方法來管理 DOM 插入操作。開發人員可以使用 useInsertionEffect 在元素被放置到 DOM 中後立即執行操作。
useInsertionEffect 鉤子是一個自定義鉤子,它允許我們在元件的元素被放置到 DOM 樹中後立即執行程式碼。它受到 React 中內建鉤子的啟發,例如 useEffect 和 useLayoutEffect。
語法
useInsertionEffect(setup, dependency)
引數
設定 - 這是我們可以放置程式碼的部分,這些程式碼告訴我們的 React 元件在最初引入網頁時執行任何操作。
可選依賴項 - 這類似於我們的設定程式碼所依賴的物件列表。它可能是來自我們元件外部的任何內容,例如資訊、資料或我們在元件內部生成的內容。
返回值
此鉤子返回 undefined。
示例
示例 - 向 textArea 新增 CSS
此軟體允許我們將 CSS 程式碼輸入到一個 textarea 中,並檢視它在 div 元素上的外觀。在 div 元素被放置到 DOM 中後,useInsertionEffect 鉤子用於將 CSS 程式碼插入到文件的頭部。這保證了 CSS 程式碼在執行任何其他佈局效果之前應用。
import React, { useState, useRef, useInsertionEffect } from 'react'; const App = () => { const [styleText, setStyleText] = useState(''); const styleRef = useRef(null); useInsertionEffect(() => { const styleElement = document.createElement('style'); styleElement.textContent = styleText; document.head.appendChild(styleElement); return () => { document.head.removeChild(styleElement); }; }, [styleText]); return ( <div> <textarea value={styleText} onChange={(event) => setStyleText(event.target.value)} /> <div ref={styleRef} /> </div> ); }; export default App;
輸出

示例 - 動態進度條應用
這是另一個在 React 中使用 useInsertionEffect 鉤子的應用示例,它展示了其用於建立動態進度條的用法。此應用允許我們調整範圍輸入,並且輸入的值將反映在動態進度條中。useInsertionEffect 鉤子用於在進度狀態變數更改時更新進度條的寬度。
import React, { useState, useRef, useEffect } from 'react'; const App = () => { const [progress, setProgress] = useState(0); const progressBarRef = useRef(null); useEffect(() => { const progressBarElement = progressBarRef.current; progressBarElement.style.width = `${progress}%`; }, [progress]); return ( <div> <input type="range" min="0" max="100" value={progress} onChange={(event) => setProgress(event.target.value)} /> <div ref={progressBarRef} style={{ height: 20, backgroundColor: '#ccc' }}> <div style={{ height: '100%', width: `${progress}%`, backgroundColor: '#007bff' }}></div> </div> </div> ); }; export default App;
輸出

示例
因此,我們可以透過使用 CSS-in-JS 庫注入動態樣式來使用 ‘useInsertionEffect’ 鉤子。因此,我們將藉助一個簡短的應用程式詳細討論這一點。
過去,React 元件使用基本的 CSS 進行樣式設定。
// In the Javascript file: <button className="login" /> // In the CSS file: .login { color: green; }
簡單來說,CSS-in-JS 是一種為 JavaScript 元件設定樣式的方法。雖然首選靜態和內聯樣式,但在執行時插入樣式可能會導致我們的程式速度變慢。在 React 中,useInsertionEffect 鉤子管理何時新增這些樣式,使我們的應用更易於使用。
import React from 'react'; import { useInsertionEffect } from 'react'; // import here the useInsertedEffect hook let isInserted = new Set(); function useCSS(rule) { useInsertionEffect(() => { if (!isInserted.has(rule)) { isInserted.add(rule); const style = document.createElement('style'); style.innerHTML = rule; document.head.appendChild(style); } }); } function ColoredBox() { useCSS('.colored-box { background-color: lightgreen; }'); return <div className="colored-box">I have a colored background.</div>; } function App() { return ( <div> <ColoredBox /> </div> ); } export default App;
輸出

在上面的示例中,我們有一個 ColoredBox 元件,它使用 useCSS 自定義鉤子動態地放置一個更改背景顏色的 CSS 規則。useInsertionEffect 鉤子確保 CSS 規則在佈局效果之前出現。
限制
效果(如 useInsertionEffect 中使用的效果)僅適用於我們瀏覽器中顯示的網頁。當網頁在伺服器上建立並傳輸到我們的瀏覽器之前,它們不會執行。
我們無法在 useInsertionEffect 中修改元件使用的任何資料或資訊。
當執行 useInsertionEffect 鉤子時,特殊引用 (refs) 尚未準備好。它們不會立即使用。
在網頁更新時,我們永遠無法確定使用InsertionEffect 何時被啟用。它可能在頁面上的內容更改之前或之後執行。
總結
React 應用中的 useInsertionEffect 鉤子提供了一種強大且簡單的方法來管理 DOM 插入操作。透過在元素新增到 DOM 後立即執行程式碼,我們可以執行 DOM 修改、動畫、初始化和清理活動。瞭解其設定、限制和現實世界中的最佳實踐將使我們能夠正確利用 useInsertionEffect 並改善 React 元件的功能和使用者體驗。