淺談React

forwardRef和useImperativeHandle的聯動使用

import React, { useImperativeHandle, useRef } from "react"
import { forwardRef } from "react"const CustomInput = forwardRef((props, ref) => {const inputRef = useRef<HTMLInputElement>(null)useImperativeHandle(ref, () => ({focus: () => {inputRef.current?.focus()}}))return <div><input ref={inputRef} /></div>
})export default CustomInput

巧用children

  • 一般用法
父組件:import React from "react"
import Child from './Child'const CustomInput = () => {return <Child><div>hello 靚仔</div></Child>
}export default CustomInput子組件:import React from "react"const Child = ({children
}) => {return <div>{children}</div>
}export default Child
  • 函數用法
父組件:import React from "react"
import Child from './Child'const CustomInput = () => {return <Child>{(arr)=><div>{arr.map((v,idx)=>{return <div key={idx}>{v}</div>})}</div>}</Child>
}export default CustomInput子組件:import React from "react"const Child = ({children
}) => {const arr = [1,2,4,5]return <div>{children(arr)}</div>
}export default Child

useEffect

  • 沒有依賴,類似于componentDidMount和componentDidUpdate
import React, { useEffect, useState } from "react"const Detail = () => {const [count, setCount] = useState(1)const [num,setNum] = useState(2)useEffect(()=>{console.log(count,'count',num,'num')})return <div><div onClick={() => setCount(count + 1)}>add count</div><div onClick={() => setNum(num + 1)}>add num</div><div>count: {count}</div><div>num: {num}</div></div>
}export default Detail

  • 依賴是個空數組,相當于componentDidMount
import React, { useEffect, useState } from "react"const Detail = () => {const [count, setCount] = useState(1)const [num,setNum] = useState(2)useEffect(()=>{console.log(count,'count',num,'num')},[])return <div><div onClick={() => setCount(count + 1)}>add count</div><div onClick={() => setNum(num + 1)}>add num</div><div>count: {count}</div><div>num: {num}</div></div>
}export default Detail

?

?

  • 有依賴,componentDidMount和對應依賴的componentDidUpdate
import React, { useEffect, useState } from "react"const Detail = () => {const [count, setCount] = useState(1)const [num,setNum] = useState(2)useEffect(()=>{console.log(count,'count',num,'num')},[num])return <div><div onClick={() => setCount(count + 1)}>add count</div><div onClick={() => setNum(num + 1)}>add num</div><div>count: {count}</div><div>num: {num}</div></div>
}export default Detail

?

?

useEffect和useLayoutEffect

useEffect在渲染后執行,而useLayouEffect是在渲染之前執行

最典型的例子就是實現一個tooltip組件,在性能比較差的情況下,useEffect會先渲染初始狀態再更新,而useLayoutEffect會阻塞UI的更新即不會出現組件閃爍的情況~

阻塞代碼:

let now = performance.now();
while (performance.now() - now < 100) {
}

useEffect在性能差的情況下會出現以下效果

useContext

依賴注入

父級:
export const ThemeContext = createContext({});
const App = ()=>{return  <ThemeContext.Provider value={{name:"real hot"}}>......</ThemeContext.Provider>
}子級:const context = useContext(ThemeContext)console.log(context)

useState的變動

在react管轄下(react17.x.x)

  • 函數形式

狀態能夠更改多次,只渲染一次

const handleCount= ()=>{setCount(count=>count+1)setCount(count=>count+1)
}

  • 對象形式

多次更改狀態會被合并成一次更改,即一次生效其他無效,只渲染一次

const handleCount= ()=>{setCount(count+1)setCount(count+1)
}

在異步任務/原生事件下(react17.x.x)

const handleCount= ()=>{
setTimeout(()=>{setCount(count=>count+1)setCount(count=>count+1)
})
}

?

版本的演變(React18)

react18之后在異步操作或者react事件中都是批量更新,即多個狀態更新合成一次渲染,若需要多次渲染可使用flushsync

const handleCount= ()=>{flushSync(()=>{setCount(count=>count+1)})flushSync(()=>{setCount(count=>count+1)})}

探索生命周期函數

父子組件生命周期執行順序

掛載:?

更新:?

卸載:?

錯誤處理

生命周期方法:

getDerivedStateFromError
componentDidCatch

缺點(沒辦法捕獲):

  • 異步操作
  • 事件處理函數報錯
  • 錯誤邊界自己報錯?
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// Update state so the next render will show the fallback UI.return { hasError: true };}componentDidCatch(error, errorInfo) {// You can also log the error to an error reporting servicelogErrorToMyService(error, errorInfo);}render() {if (this.state.hasError) {// You can render any custom fallback UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}

實現一個簡單的Message

import ReactDOM from 'react-dom';
import { Modal } from 'antd';
const ToastFn = () => {
let parent = null;
return {
open: function ({ el, container = document.body }) {
// this.destroy();
parent = document.createElement('div');
document.body.appendChild(parent);
ReactDOM.render(<Modal open onCancel={this.destroy}>{el}</Modal>, parent)
},
destroy: function () {
ReactDOM.unmountComponentAtNode(parent);
},
};
};
const Toast = ToastFn();
export default Toast;

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

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

相關文章

Java中鎖的分類、原理、使用場景、注意事項、優缺點等詳解

Java開發中&#xff0c;鎖是保證多線程安全的重要手段。Java提供了多種類型的鎖來滿足不同的同步需求。在這篇文章中&#xff0c;我將為您介紹以下幾種常見的鎖類型&#xff1a; 偏向鎖/輕量級鎖/重量級鎖 偏向鎖&#xff1a;當一個線程獲取一個對象的鎖時&#xff0c;如果發現…

解決MCM功率電源模塊EMC的關鍵

對MCM功率電源而言&#xff0c;由于其工作在幾百kHz的高頻開關狀態&#xff0c;故易成為干擾源。電磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指設備或系統在其電磁環境中符合要求運行并不對其環境中的任何設備產生無法忍受的電磁干擾的…

react父調用子的方法,子調用父的方法

父調用子的方法 // 子組件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…

量化交易的實戰操作與心得

量化交易&#xff0c;作為一種基于數學模型和算法執行交易的方法&#xff0c;已經在全球金融市場中取得了廣泛的應用。對于從事量化交易的投資者而言&#xff0c;了解實戰操作的具體細節及相關心得是至關重要的&#xff0c;它可以幫助投資者優化策略&#xff0c;提高交易效率&a…

浪潮天啟防火墻TQ2000遠程配置方法SSL-xxx、L2xx 配置方法

前言 本次設置只針對配置VXX&#xff0c;其他防火墻配置不涉及。建議把防火墻內外網都調通后再進行Vxx配置。 其他配置可參考&#xff1a;浪潮天啟防火墻配置手冊 配置SSLVxx 在外網端口開啟SSLVxx信息 開啟SSLVxx功能 1、勾選 “啟用SSL-Vxx” 2、設置登錄端口號&#xff0…

springboot零食盒子-計算機畢業設計源碼50658

目 錄 1 緒論 1.1 研究背景 1.2研究意義 1.3論文結構與章節安排 2 微信小程序的零食盒子系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據流程 3.3.2 業務流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 微信…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;來快速排序。 這里介紹一些相關的算法&#xff0c;鞏固記憶。 快速排序 跟二分查找有一丟丟像。 首先選擇一個基準元素&#xff0c;一般就直接選擇第一個。然后兩個指針&#xff0c…

編程玩具應用前景怎么樣:深入剖析四大方面、五大趨勢、六大挑戰與七大機遇

編程玩具應用前景怎么樣&#xff1a;深入剖析四大方面、五大趨勢、六大挑戰與七大機遇 在科技飛速發展的今天&#xff0c;編程玩具作為一種新興的教育工具&#xff0c;正逐漸走進人們的視野。那么&#xff0c;編程玩具的應用前景究竟如何呢&#xff1f;本文將從四個方面、五個…

測試類型介紹-安全性測試實戰技巧

安全性測試實戰技巧 在當今數字化時代&#xff0c;軟件安全不再是可選項&#xff0c;而是每一款產品的必備特性。隨著網絡攻擊的復雜性和頻率不斷上升&#xff0c;安全性測試成為了確保應用程序健壯性和用戶數據保護的關鍵環節。 1. 安全性測試的重要性? 安全性測試旨在識別…

Java如何使用 HttpClientUtils 發起 HTTP 請求

Java如何使用 HttpClientUtils 發起 HTTP 請求 一、前言1.HttpClientUtils 類概覽2.解析 HttpClientUtils 類3.使用 HttpClientUtils 類 一、前言 在現代的軟件開發中&#xff0c;經常需要與遠程服務器進行通信&#xff0c;例如獲取數據或發送數據。Apache HttpClient 是一個流…

安卓逆向經典案例——XX優品(uniapp)

uni-app逆向 uniapp的目錄結構 有一個io文件夾&#xff0c;下面有dcloud uniapp UniApp 可以用于開發 H5 應用&#xff0c;但它不僅僅局限于 H5 應用。UniApp 的特點包括&#xff1a; 1. 跨平臺&#xff1a;可以一套代碼同時生成適用于多個平臺&#xff08;如 iOS、Android、…

windows node降級到指定版本

要在Windows上將Node.js降級到指定版本&#xff0c;你可以使用nvm&#xff08;Node Version Manager&#xff09;來管理和切換不同的Node.js版本。以下是使用nvm降級Node.js的步驟&#xff1a; 如果尚未安裝nvm&#xff0c;請訪問https://github.com/coreybutler/nvm-windows …

Python學習筆記(二):函數

python英文官方文檔:https://docs.python.org/3.8/tutorial/index.html 比較不錯的python中文文檔:https://www.runoob.com/python3/python3-tutorial.html 1. 寫在前面 這幾周從實踐角度又學習了一遍python,溫故而知新,還是有蠻多心得的, 周末再看之前記的python筆記,…

Python技巧:使用enumerate函數增強你的for循環

在Python編程中&#xff0c;我們經常需要遍歷列表、元組或其他可迭代對象。然而&#xff0c;在某些情況下&#xff0c;我們可能還需要知道當前元素的索引。這時&#xff0c;enumerate函數就派上了用場。以下我們將深入探討enumerate函數的使用方法&#xff0c;并通過幾個示例來…

Java---數組

樂觀學習&#xff0c;樂觀生活&#xff0c;才能不斷前進啊&#xff01;&#xff01;&#xff01; 我的主頁&#xff1a;optimistic_chen 我的專欄&#xff1a;c語言 歡迎大家訪問~ 創作不易&#xff0c;大佬們點贊鼓勵下吧~ 前言 無論c語言還是java數組都是重中之重&#xff0…

LangChain 入門案例教程

LangChain 是一個基于 transformer 模型的語言鏈模型&#xff0c;它可以根據輸入文本生成相應的回答。下面是一個簡單的入門案例教程&#xff0c;旨在幫助您快速上手 LangChain。 1. 安裝 LangChain 首先&#xff0c;您需要安裝 LangChain。可以使用 pip 安裝&#xff1a; p…

【簡歷】湖南某一本大學:JAVA實習簡歷指導,面試通過率比較低

注&#xff1a;為保證用戶信息安全&#xff0c;姓名和學校等信息已經進行同層次變更&#xff0c;內容部分細節也進行了部分隱藏 簡歷說明 這個同學的學校是重點一本院校&#xff0c;這種學校背景我們建議大家嘗試投一下大廠&#xff0c;然后投遞主體在中廠。但是因為項目經歷…

曠野之間12 - 內容創作用的最佳大模型評測

?????? 我正在做一個項目,需要我找出最適合內容創作的 LLM。我查看了 lmsys 排行榜上的頂級模型,閱讀了其他人對這些模型的評價,查看了頂級 LLM 的模型卡,在沒有明確答案后,我決定對所有這些 LLM 進行測試,以完成不同的內容創作任務。 評估模型 我想要評估的模型…

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac AnyGo for Mac是一款專為Mac電腦用戶設計的虛擬定位工具。它可以模擬你的GPS位置&#xff0c;讓你的設備顯示你在任何世界上的任何地方。無論你是想在游戲中虛擬移動&#xff0c;還是在社交媒體上分享虛擬的旅行照片&#xff0…

Flask+Layui開發案例教程

基于 Python 語言的敏捷開發框架_DjangoAdmin敏捷開發框架FlaskLayui版本_開發文檔 軟件產品基于 Python 語言&#xff0c;采用 Flask2.x、Layui、MySQL 等技術棧精心打造的一款集模塊化、高性能、組件化于一體的企業級敏捷開發框架&#xff0c;本著簡化開發、提升開發效率的初…