使用 Effect 同步-09

有些組件需要與外部系統同步。例如,你可能希望根據 React state 控制非 React 組件、設置服務器連接或在組件出現在屏幕上時發送分析日志。Effects 會在渲染后運行一些代碼,以便可以將組件與 React 之外的某些系統同步。

簡單理解,就是需要操作外部非React元素,但React未渲染完時是不允許操作原生DOM的,所以需要一個類似渲染完成后的回調函數。其實也可以在root渲染完成后硬編碼實現,但這樣的話代碼顯的不工整了。

Effect使用

一個播放器的示例,注意React很多功能全是在開發環境中執行兩次,生產環境中執行一次,這主要是為了性能調優用的。

  • 生產環境中:掛載-清理
  • 開發環境中:掛載-清理-掛載
import { useState, useRef, useEffect } from 'react';function VideoPlayer({ src, isPlaying }) {const ref = useRef(null);useEffect(() => {if (isPlaying) { //增加判斷,防止每次更改界面都刷新console.log('Calling video.play()');ref.current.play();} else {console.log('Calling video.pause()');ref.current.pause();}return () => {connection.disconnect(); //清理函數,在組件卸載時執行};}, [isPlaying]); //這個參數后面有詳細解釋//ref引用return <video ref={ref} src={src} loop playsInline />;
}export default function App() {const [isPlaying, setIsPlaying] = useState(false);const [text, setText] = useState('');return (<><input value={text} onChange={e => setText(e.target.value)} /><button onClick={() => setIsPlaying(!isPlaying)}>{isPlaying ? 'Pause' : 'Play'}</button><VideoPlayerisPlaying={isPlaying}src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"/></>);
}
useEffect(() => {// 這里的代碼會在每次渲染后執行
});useEffect(() => {// 這里的代碼只會在組件掛載后執行
}, []);useEffect(() => {//這里的代碼只會在每次渲染后,并且 a 或 b 的值與上次渲染不一致時執行,這個特性非常重要,可以不需要參數來判斷是否要重新加載,其實也沒太大關系。
}, [a, b]);

利用effect訂閱事件

簡單的函數不建議這樣來做,可以單用ref即可,但這樣會比較規范一些。

useEffect(() => {function handleScroll(e) {console.log(window.scrollX, window.scrollY);}window.addEventListener('scroll', handleScroll);//組件卸載時執行,防止內存溢出return () => window.removeEventListener('scroll', handleScroll);
}, []);

利用effect初始化數據

比如遠程訪問獲取數據等

useEffect(() => {let ignore = false;async function startFetching() {const json = await fetchTodos(userId);if (!ignore) {setTodos(json);}}startFetching();return () => {ignore = true;};
}, [userId]);

昂貴的計算

如果上述遠程計算的時間會比較長的話,就不適合用effect來做了,可以用userMemo來執行。這會告訴 React,除非 todos 或 filter 發生變化,否則不要重新執行傳入的函數。React 會在初次渲染的時候記住 getFilteredTodos() 的返回值。在下一次渲染中,它會檢查 todos 或 filter 是否發生了變化。如果它們跟上次渲染時一樣,useMemo 會直接返回它最后保存的結果。如果不一樣,React 將再次調用傳入的函數(并保存它的結果)。

import { useMemo, useState } from 'react';function TodoList({ todos, filter }) {const [newTodo, setNewTodo] = useState('');const visibleTodos = useMemo(() => {// 除非 todos 或 filter 發生變化,否則不會重新執行return getFilteredTodos(todos, filter);}, [todos, filter]);// ...
}

編寫 Effect 需要遵循以下三個規則

  1. 聲明 Effect。默認情況下,Effect 會在每次 commit 后都會執行。
  2. 指定 Effect 依賴。大多數 Effect 應該按需執行,而不是在每次渲染后都執行。例如,淡入動畫應該只在組件出現時觸發。連接和斷開服務器的操作只應在組件出現和消失時,或者切換聊天室時執行。文章將介紹如何通過指定依賴來控制如何按需執行。
  3. 必要時添加清理(cleanup)函數。有時 Effect 需要指定如何停止、撤銷,或者清除它的效果。例如,“連接”操作需要“斷連”,“訂閱”需要“退訂”,“獲取”既需要“取消”也需要“忽略”。你將學習如何使用 清理函數 來做到這一切。

關于Effect的內容非常多,主要是這東西屬于脫圍機制的一種,而且還需要和React生命周期相吻合,還要考慮好性能問題。所以具體情況需要具體分析,無法統一下結論。需要多思考嘗試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17337.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實現對Word文檔內容出現“重復標題”進行自動去重(4)

前言 本文是該專欄的第4篇,后面會持續分享Python辦公自動化干貨知識,記得關注。 在本專欄上一篇文章《Python實現對Word文檔內容出現“重復標題”進行自動去重(3)》中,筆者有詳細介紹使用python對word文檔內容的目標文本進行自動去重。只不過本文要介紹的“去重方法”與上…

計算機專業必考之計算機指令設計格式

計算機指令設計格式 例題&#xff1a; 1.設相對尋址的轉移指令占3個字節&#xff0c;第一字節為操作碼&#xff0c;第二&#xff0c;第三字節為相對偏移量&#xff0c; 數據在存儲器以低地址為字地址的存放方式。 每當CPU從存儲器取出一個字節時候&#xff0c;自動完成&…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-24.1,2 SPI驅動實驗-SPI協議介紹

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸機篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

計算機組成原理易混淆知識點總結(持續更新)

目錄 1.機器字長&#xff0c;存儲字長與指令字長 2.指令周期,機器周期,時鐘周期 3.CPI,IPS,MIPS 4.翻譯程序和匯編程序 5.計算機體系結構和計算機組成的區別和聯系 6.基準程序執行得越快說明機器的性能越好嗎? 1.機器字長&#xff0c;存儲字長與指令字長 不同的機器三者…

AI智能體|扣子Coze文生圖功能接入微信公眾號

大家好&#xff0c;我是無界生長。 AI智能體&#xff5c;扣子Coze文生圖功能接入微信公眾號本文分享了如何將Coze平臺的文生圖功能接入微信公眾號的詳細操作流程&#xff0c;包括創建圖像流、創建并配置Bot、設置提示詞和開場白、調試、發布等步驟。如果看完還沒學會的話&…

網頁圖片加載慢的求解指南

網頁/圖片加載慢的求解指南 一、前言與問題描述 今天剛換上華為的HUAWEI AX3 Pro New&#xff0c;連上WIFI后測速雖然比平時慢&#xff0c;但是也不算太離譜&#xff0c;如下圖所示&#xff1a; 估計讀者們有也和作者一樣&#xff0c;還沒意識到事情的嚴重性&#x1f601;。 …

08Django項目--用戶管理系統--查(前后端)

對應視頻鏈接點擊直達 TOC 一些朋友加我Q反饋&#xff0c;希望有每個階段的完整項目代碼&#xff0c;那從今天開始&#xff0c;我會上傳完整的項目代碼。 用戶管理&#xff0c;簡而言之就是用戶的增刪改查。 08項目點擊下載&#xff0c;可直接運行&#xff08;含數據庫&…

PHP框架 Laravel

現在因為公司需求&#xff0c;需要新開一個Laravel框架的項目&#xff0c;毫無疑問&#xff0c;我又被借調過去了&#xff0c;最近老是被借調&#xff0c;有點陰郁&#xff0c;不過反觀來看&#xff0c;這也是好事&#xff0c;又可以復習和鞏固一下自己的知識點&#xff0c;接下…

大數據開發面試題【Spark篇】

115、Spark的任務執行流程 driver和executor&#xff0c;結構式一主多從模式&#xff0c; driver&#xff1a;spark的驅動節點&#xff0c;用于執行spark任務中的main方法&#xff0c;負責實際代碼的執行工作&#xff1b;主要負責&#xff1a;將代碼邏輯轉換為任務、在executo…

編譯qt5.15.2(mac/windows)的mysql驅動(附帶編譯好的文件)

文章目錄 0 背景1 編譯過程2 福利 0 背景 因為需要連接到mysql數據庫&#xff0c;所以需要連mysql驅動。 1 編譯過程 1&#xff0c;打開文件/Users/mac/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers/sqldrivers.pro&#xff0c;注釋掉QMAKE_USE mysql&#xff1b; 如…

國產【Jetson Xavier NX】——從裸機到深度學習開發環境配置

1、設置系統從固態硬盤啟動 英偉達官方NX出廠是直接將SD卡&#xff08;64/128G&#xff09;燒錄系統作為系統盤使用&#xff0c;國產NX出廠是將系統配置在8G內存中&#xff0c;在后續使用中需配置大量開發包&#xff0c;故將系統設置為從固態硬盤啟動。 參考鏈接 https://blo…

vue3中使用svg圖標

安裝依賴 npm i vite-plugin-svg-icons -D vite.config.ts中添加配置 主要為指定svg圖標存放路徑以及命名方式 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path;…

總結力學_3

參考: 陳曦<<力學講義>>http://ithatron.phys.tsinghua.edu.cn/downloads/mechanics.pdf 10 非慣性系 10.1 勻加速平動非慣性系 10.2 定軸勻速轉動非慣性系 可以更好刻劃總結力學_2的有心力運動、質點系的運動的工具! 11 線性系統 11.1 線性系統、11.2 受迫…

【深入理解Python中的裝飾器】

文章目錄 前言裝飾器的基本概念帶參數的裝飾器類作為裝飾器結論 前言 裝飾器是Python中一個非常強大且靈活的特性&#xff0c;它允許程序員在不修改原函數代碼的情況下&#xff0c;增加或修改函數的行為。裝飾器本質上是一個接受函數作為參數并返回一個新函數的函數。本文將深…

點擊登錄按鈕先檢測輸入框的規則檢測(vue組合式)

<template><el-form :model"user" :rules"rules" ref"loginForm" label-width"auto" style"max-width: 600px"><el-form-item label"用戶名" prop"name"><el-input v-model"…

【Linux-LCD 驅動】

Linux-LCD 驅動 ■ Framebuffer 簡稱 fb■ LCD 驅動程序編寫■ 1、LCD 屏幕 IO 配置■ 2、LCD 屏幕參數節點信息修改■ 3、LCD 屏幕背光節點信息■ 4、使能 Linux logo 顯示 ■ 設置 LCD 作為終端控制臺■ 1、設置 uboot 中的 bootargs■ 2、修改/etc/inittab 文件 ■ LCD 背光…

ROS的noetic版本

設置 sources.list 執行下面命令&#xff0c;設置從清華源下載 ROS 軟件包。 sudo sh -c echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list設置密鑰 sudo apt-key adv --keyse…

鴻蒙知識點總結

1 Stage模型應用程序包結構 在開發態&#xff0c;一個應用包含一個或者多個Module&#xff0c;可以在DevEco Studio工程中創建一個或者多個Module。Module是HarmonyOS應用/服務的基本功能單元&#xff0c;包含了源代碼、資源文件、第三方庫及應用/服務配置文件&#xff0c;每一…

快速上手 HuggingFace

HuggingFace HuggingFace 是類似于 GitHub 的社區&#xff0c;它主要提供各種的模型的使用&#xff0c;和 github 不同的是&#xff0c;HuggingFace 同時提供了一套框架&#xff0c;進行模型推理&#xff0c;模型訓練、和模型庫文件的管理等等。本文將介紹&#xff0c;如何快速…

【MySQL精通之路】全文搜索(9)-全文解析器-MeCab

主博客&#xff1a; 【MySQL精通之路】全文搜索功能-CSDN博客 目錄 1.介紹 2.安裝MeCab Parser插件 3.創建使用MeCab分析器的FULLTEXT索引 4.MeCab Parser空間處理 5.MeCab分析程序停止字處理 6.MeCab Parser術語搜索 7.MeCab分析程序通配符搜索 8.MeCab語法分析器短語…