亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue中nextTick函數(shù)和react類(lèi)似實(shí)現(xiàn)代碼

 更新時(shí)間:2024年04月28日 10:13:36   作者:向想享xh  
Vue 3 中的 nextTick 主要通過(guò) Promise 實(shí)現(xiàn)異步調(diào)度,返回一個(gè) Promise 對(duì)象,這篇文章主要介紹了vue中nextTick函數(shù)和react類(lèi)似實(shí)現(xiàn)代碼,需要的朋友可以參考下

Vue 3

基本用法

import { nextTick } from 'vue';
// 全局調(diào)用
nextTick(() => {
  // 在下一個(gè) DOM 更新循環(huán)后執(zhí)行的代碼
});
// 在組件內(nèi)部調(diào)用
setup() {
  async function handleUpdate() {
    // 修改數(shù)據(jù)...
    await nextTick();
    // 在數(shù)據(jù)引發(fā)的 DOM 更新完成后執(zhí)行的代碼
  }
}
  • nextTick 函數(shù)現(xiàn)在作為 vue 包的一個(gè)導(dǎo)出成員,需要顯式導(dǎo)入后使用。
  • 在組件的 setup 函數(shù)或其它上下文中,可以使用 await nextTick() 的形式來(lái)等待 DOM 更新完成。

作用

延遲執(zhí)行:確?;卣{(diào)函數(shù)在當(dāng)前操作引發(fā)的 DOM 更新完成后執(zhí)行。這對(duì)于依賴(lài)于更新后 DOM 狀態(tài)的操作(如計(jì)算元素尺寸、位置,或進(jìn)行額外的 DOM 操作)至關(guān)重要。

異步更新策略
Vue 3 仍然遵循異步更新策略,即當(dāng)組件狀態(tài)發(fā)生變化時(shí),Vue 不會(huì)立即更新 DOM,而是將這些更新任務(wù)放入一個(gè)隊(duì)列中。在同一個(gè)事件循環(huán)中發(fā)生的多個(gè)狀態(tài)變更會(huì)被合并,然后在下一個(gè)事件循環(huán)的“微任務(wù)”階段一次性更新 DOM。這樣可以避免不必要的 DOM 操作,提高性能。

使用場(chǎng)景

  • 訪(fǎng)問(wèn)更新后的 DOM:在修改數(shù)據(jù)后,如果需要基于更新后的 DOM 結(jié)構(gòu)或樣式執(zhí)行操作(如獲取元素尺寸、設(shè)置焦點(diǎn)等),應(yīng)將這些操作放在 nextTick 回調(diào)中。
  • 解決依賴(lài)更新順序的問(wèn)題:有時(shí)需要確保某個(gè)操作在另一個(gè)操作引發(fā)的 DOM 更新之后執(zhí)行,例如在插入一個(gè)新的元素后立即滾動(dòng)到該元素的位置。通過(guò) nextTick 可以確保正確的執(zhí)行順序。
  • 協(xié)調(diào)異步操作:在進(jìn)行異步操作(如網(wǎng)絡(luò)請(qǐng)求)后需要更新界面時(shí),可以在異步回調(diào)中使用 nextTick 確保 DOM 更新發(fā)生在數(shù)據(jù)變更之后。

實(shí)現(xiàn)原理
Vue 3 中的 nextTick 主要通過(guò) Promise 實(shí)現(xiàn)異步調(diào)度,返回一個(gè) Promise 對(duì)象。當(dāng) DOM 更新完成后,Promise 被 resolve,從而觸發(fā) await nextTick() 后面的代碼執(zhí)行。Vue 3 也繼續(xù)支持回調(diào)函數(shù)形式的用法,但推薦使用 await 語(yǔ)句以獲得更好的代碼可讀性和錯(cuò)誤處理能力。

react

在 React 中,雖然沒(méi)有直接提供名為 nextTick 的函數(shù),但其設(shè)計(jì)理念和異步更新機(jī)制與 Vue.js 中的 nextTick 概念類(lèi)似。React 也采用了異步批量更新策略,即當(dāng)組件狀態(tài)(stateprops)發(fā)生變化時(shí),React 不會(huì)立即重新渲染組件和更新 DOM,而是將這些更新操作放入一個(gè)隊(duì)列中。當(dāng)事件循環(huán)回到瀏覽器主線(xiàn)程時(shí),React 會(huì)批量處理這些更新,一次性重新渲染受影響的組件并更新真實(shí)的 DOM。

如果你在 React 中需要實(shí)現(xiàn)類(lèi)似 Vue.js nextTick 的效果,即在組件更新和 DOM 渲染完成后執(zhí)行某個(gè)操作,可以利用以下幾種方法:

1. 使用 useEffect Hook:

import { useState, useEffect } from 'react';
function MyComponent() {
  const [value, setValue] = useState(0);
  useEffect(() => {
    // 此處的代碼會(huì)在 DOM 更新后執(zhí)行
    // 適用于對(duì) DOM 或全局狀態(tài)有依賴(lài)的操作
    console.log('DOM 更新已完成,可以在這里操作');
  }, [value]); // 依賴(lài)項(xiàng) `value` 改變時(shí)觸發(fā)此 effect
  return (
    <div>
      <p>You clicked {value} times</p>
      <button onClick={() => setValue(value + 1)}>Click me</button>
    </div>
  );
}

在上述代碼中,useEffect Hook 的第二個(gè)參數(shù)(依賴(lài)數(shù)組)包含了 value。當(dāng) value 變化時(shí),React 會(huì)重新渲染組件,并在 DOM 更新后執(zhí)行 useEffect 內(nèi)部的回調(diào)函數(shù)。這樣就可以確保在 DOM 真實(shí)更新后再進(jìn)行相關(guān)操作。

2. 使用 ReactDOM.flushSync(僅限特殊場(chǎng)景):

import ReactDOM from 'react-dom';
function MyComponent() {
  const [value, setValue] = useState(0);
  function handleClick() {
    // 強(qiáng)制同步更新 DOM
    ReactDOM.flushSync(() => {
      setValue(value + 1);
    });
    // 此處的代碼緊接著同步更新之后執(zhí)行
    console.log('DOM 已經(jīng)同步更新');
  }
  return (
    <div>
      <p>You clicked {value} times</p>
      <button onClick={handleClick}>Click me</button>
    </div>
  );
}

ReactDOM.flushSync 是一個(gè)低級(jí)別的 API,用于強(qiáng)制同步執(zhí)行 React 更新。在極少數(shù)需要立即看到更新結(jié)果且不能等待下一次事件循環(huán)的場(chǎng)景下(如處理計(jì)時(shí)器的精確性問(wèn)題),可以使用此方法。不過(guò),由于同步更新可能會(huì)阻塞用戶(hù)界面,通常不建議常規(guī)使用,而是優(yōu)先考慮使用 useEffect

3. 使用 requestAnimationFramesetTimeout(fn, 0)

function MyComponent() {
  const [value, setValue] = useState(0);
  function handleClick() {
    setValue(value + 1);
    requestAnimationFrame(() => {
      // 此處的代碼會(huì)在下一次重繪前執(zhí)行
      console.log('DOM 大概率已經(jīng)更新');
    });
  }
  return (
    <div>
      <p>You clicked {value} times</p>
      <button onClick={handleClick}>Click me</button>
    </div>
  );
}

或者:

function MyComponent() {
  const [value, setValue] = useState(0);
  function handleClick() {
    setValue(value + 1);
    setTimeout(() => {
      // 此處的代碼會(huì)在下一次事件循環(huán)中執(zhí)行
      console.log('DOM 大概率已經(jīng)更新');
    }, 0);
  }
  return (
    <div>
      <p>You clicked {value} times</p>
      <button onClick={handleClick}>Click me</button>
    </div>
  );
}

requestAnimationFramesetTimeout(fn, 0) 都可以將代碼推遲到下一次瀏覽器重繪或事件循環(huán)中執(zhí)行,此時(shí) DOM 更新大概率已完成。雖然不如 useEffect 那樣精確地綁定到 React 更新周期,但對(duì)于大多數(shù)需要在 DOM 更新后執(zhí)行操作的場(chǎng)景來(lái)說(shuō),這兩種方法通常是足夠可靠的。

綜上所述,React 中沒(méi)有與 Vue.js 中 nextTick 函數(shù)同名的工具,但通過(guò)使用 useEffect Hook、ReactDOM.flushSync(特殊情況)、requestAnimationFramesetTimeout(fn, 0),可以實(shí)現(xiàn)類(lèi)似的在 DOM 更新后執(zhí)行操作的需求。在大多數(shù)情況下,useEffect 是首選解決方案,因?yàn)樗c React 的更新機(jī)制緊密集成,確保在恰當(dāng)?shù)臅r(shí)機(jī)執(zhí)行回調(diào)。

相關(guān)文章

  • Vue使用el-table實(shí)現(xiàn)表格跨頁(yè)多選

    Vue使用el-table實(shí)現(xiàn)表格跨頁(yè)多選

    在我們?nèi)粘m?xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)有表格跨頁(yè)多選的需求,接下來(lái)讓我們用?el-table示例一步步來(lái)實(shí)現(xiàn)這個(gè)需求,文中有詳細(xì)的代碼講解,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • 深入理解vue中的?slot-scope=“scope“

    深入理解vue中的?slot-scope=“scope“

    這篇文章主要介紹了理解vue中的?slot-scope=“scope“,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Vue中使用Echarts儀表盤(pán)展示實(shí)時(shí)數(shù)據(jù)的實(shí)現(xiàn)

    Vue中使用Echarts儀表盤(pán)展示實(shí)時(shí)數(shù)據(jù)的實(shí)現(xiàn)

    這篇文章主要介紹了Vue中使用Echarts儀表盤(pán)展示實(shí)時(shí)數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • vue中this.$parent的使用方式

    vue中this.$parent的使用方式

    這篇文章主要介紹了vue中this.$parent的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 在vue3項(xiàng)目中實(shí)現(xiàn)國(guó)際化的代碼示例

    在vue3項(xiàng)目中實(shí)現(xiàn)國(guó)際化的代碼示例

    國(guó)際化就是指在一個(gè)項(xiàng)目中,項(xiàng)目中的語(yǔ)言可以進(jìn)行切換(中英文切換),那么在實(shí)際項(xiàng)目中是如何實(shí)現(xiàn)的呢,本文就給大家詳細(xì)的介紹實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于vite proxy跨域問(wèn)題的解決

    關(guān)于vite proxy跨域問(wèn)題的解決

    這篇文章主要介紹了關(guān)于vite proxy跨域問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • bmob js-sdk 在vue中的使用教程

    bmob js-sdk 在vue中的使用教程

    將bmob js-sdk放在static目錄,然后在index.html頁(yè)面中已 script 標(biāo)簽的形式引入,就可以在vue中全局使用bmob js-sdk。下面通過(guò)本文給大家分享bmob js-sdk 在vue中的使用教程,需要的朋友參考下吧
    2018-01-01
  • IOS上微信小程序密碼框光標(biāo)離開(kāi)提示存儲(chǔ)密碼的完美解決方案

    IOS上微信小程序密碼框光標(biāo)離開(kāi)提示存儲(chǔ)密碼的完美解決方案

    ios密碼框輸入密碼光標(biāo)離開(kāi)之后會(huì)提示存儲(chǔ)密碼的彈窗,關(guān)于這樣的問(wèn)題怎么解決呢,下面給大家分享IOS上微信小程序密碼框光標(biāo)離開(kāi)提示存儲(chǔ)密碼的完美解決方案,感興趣的朋友一起看看吧
    2024-07-07
  • vue生命周期實(shí)例小結(jié)

    vue生命周期實(shí)例小結(jié)

    這篇文章主要介紹了vue生命周期,結(jié)合實(shí)例形式分析了vue.js生命周期相關(guān)原理、步驟、函數(shù)與操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • vue實(shí)現(xiàn)下拉多選、可搜索、全選功能(示例代碼)

    vue實(shí)現(xiàn)下拉多選、可搜索、全選功能(示例代碼)

    本文介紹了如何在Vue中實(shí)現(xiàn)一個(gè)樹(shù)形結(jié)構(gòu)的下拉多選組件,支持任意一級(jí)選項(xiàng)的選擇,全選功能,以及搜索功能,通過(guò)在mounted生命周期中獲取數(shù)據(jù),并使用handleTree函數(shù)將接口返回的數(shù)據(jù)整理成樹(shù)形結(jié)構(gòu),實(shí)現(xiàn)了這一功能,感興趣的朋友一起看看吧
    2025-01-01

最新評(píng)論