最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue組件的實(shí)現(xiàn)原理詳細(xì)分析

 更新時(shí)間:2023年01月03日 16:03:09   作者:知奕奕  
在日常業(yè)務(wù)開發(fā)中我們會(huì)經(jīng)常封裝一些業(yè)務(wù)組件,下面這篇文章主要給大家介紹了關(guān)于Vue組件的實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

渲染組件

一個(gè)組件內(nèi)部必須要使用 render 進(jìn)行渲染,且返回虛擬 DOM

這是一個(gè)最簡(jiǎn)組件實(shí)例

const MyComponent = {
  // 組件名稱,可選
  name: "MyComponent",
  // 組件的渲染函數(shù),其返回值必須為虛擬 DOM
  render() {
    // 返回虛擬 DOM
    return {
      type: "div",
      children: `我是文本內(nèi)容`,
    };
  },
};

渲染器中的 mountComponent 函數(shù)完成組件的渲染

function mountComponent(vnode, container, anchor) {
  // 通過(guò) vnode 獲取組件的選項(xiàng)對(duì)象,即 vnode.type
  const componentOptions = vnode.type;
  // 獲取組件的渲染函數(shù) render
  const { render } = componentOptions;
  // 執(zhí)行渲染函數(shù),獲取組件要渲染的內(nèi)容,即 render 函數(shù)返回的虛擬
  const subTree = render();
  // 最后調(diào)用 patch 函數(shù)來(lái)掛載組件所描述的內(nèi)容,即 subTree
  patch(null, subTree, container, anchor);
}

組件更新

組件初始化步驟:

  • 取得 data 函數(shù)后用 reactive 將其變成響應(yīng)式的
  • render 函數(shù)內(nèi)將 this 指向 state,并將 state 作為第一個(gè)參數(shù)傳入 render 函數(shù)

將渲染任務(wù)包裝到一個(gè)副作用函數(shù) effect 里面,即可實(shí)現(xiàn)響應(yīng)式更新數(shù)據(jù)

若要使每次響應(yīng)式數(shù)據(jù)修改后,effect 僅執(zhí)行一次,則需要引入調(diào)度器概念

這是書中給出的最簡(jiǎn)調(diào)度器實(shí)例

即先把 effect 放入微任務(wù)隊(duì)列,等執(zhí)行棧清空再調(diào)出來(lái)執(zhí)行

// 任務(wù)緩存隊(duì)列,set可以自動(dòng)去重
const queue = new Set();
// 一個(gè)標(biāo)志,代表是否正在刷新任務(wù)隊(duì)列
let isFlushing = false;
// 創(chuàng)建一個(gè)立即 resolve 的 Promise 實(shí)例
const p = Promise.resolve();
// 調(diào)度器的主要函數(shù),用來(lái)將一個(gè)任務(wù)添加到緩沖隊(duì)列中,并開始刷新隊(duì)列
function queueJob(job) {
  // 將 job 添加到任務(wù)隊(duì)列 queue 中
  queue.add(job);
  // 如果還沒有開始刷新隊(duì)列,則刷新之
  if (!isFlushing) {
    // 將該標(biāo)志設(shè)置為 true 以避免重復(fù)刷新
    isFlushing = true;
    // 在微任務(wù)中刷新緩沖隊(duì)列
    p.then(() => {
      try {
        // 執(zhí)行任務(wù)隊(duì)列中的任務(wù)
        queue.forEach((job) => job());
      } finally {
        // 重置狀態(tài)
        isFlushing = false;
        queue.clear = 0;
      }
    });
  }
}

父子組件

這是一個(gè)簡(jiǎn)單的父子組件代碼

// 子組件
<template>
  <MyComponent :title="title" />
</template>
// 父組件
const vnode = {
  type: MyComponent,
  props: {
    title: 'A Big Title'
  }
}

父組件更新導(dǎo)致子組件更新(被動(dòng)更新)過(guò)程:

  • 父組件自更新
  • 渲染器檢查 subTree 發(fā)現(xiàn)存在 vnode,則調(diào)用 patchComponent 實(shí)現(xiàn)子組件更新

setup函數(shù)

setup 函數(shù)為配合組合式 API 所引入的

他有如下兩種返回值形式

// 返回函數(shù)
const comp = {
  setup() {
    return () => {
      return {
        type: "div",
        children: "give up for vuejs",
      };
    };
  },
};
// 返回對(duì)象
const comp = {
  setup() {
    const count = ref(0);
    return {
      count,
    };
  },
  render() {
    return {
      type: "div",
      children: `count is ${this.count}`,
    };
  },
};

setup 接收兩個(gè)參數(shù),分別是 props 以及 setupContext

setupContext 包含以下四個(gè)主要對(duì)象

  • slots 插槽
  • emit 自定義事件
  • attrs 自定義屬性
  • expose 暴露

emit 實(shí)現(xiàn)

只需要實(shí)現(xiàn)一個(gè) emit 函數(shù)并將其添加到 setupContext 對(duì)象中

到此這篇關(guān)于Vue組件的實(shí)現(xiàn)原理詳細(xì)分析的文章就介紹到這了,更多相關(guān)Vue組件實(shí)現(xiàn)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3 響應(yīng)式對(duì)象如何實(shí)現(xiàn)方法的不同點(diǎn)

    vue3 響應(yīng)式對(duì)象如何實(shí)現(xiàn)方法的不同點(diǎn)

    這篇文章主要介紹了vue3 響應(yīng)式對(duì)象如何實(shí)現(xiàn)方法的不同點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue-cli V3.0版本的使用詳解

    vue-cli V3.0版本的使用詳解

    這篇文章主要介紹了vue-cli V3.0版本的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • vue3.x:報(bào)錯(cuò)清單及解決記錄

    vue3.x:報(bào)錯(cuò)清單及解決記錄

    這篇文章主要為大家介紹了vue3.x:報(bào)錯(cuò)清單及解決記錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 解決vue項(xiàng)目中前后端交互的跨域問(wèn)題、nginx代理配置方式

    解決vue項(xiàng)目中前后端交互的跨域問(wèn)題、nginx代理配置方式

    這篇文章主要介紹了解決vue項(xiàng)目中前后端交互的跨域問(wèn)題、nginx代理配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 實(shí)例講解vue源碼架構(gòu)

    實(shí)例講解vue源碼架構(gòu)

    在本篇文章中小編給大家分享了關(guān)于vue源碼架構(gòu)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • 解決Vue使用百度地圖BMapGL內(nèi)存泄漏問(wèn)題?Out?of?Memory

    解決Vue使用百度地圖BMapGL內(nèi)存泄漏問(wèn)題?Out?of?Memory

    這篇文章主要介紹了解決Vue使用百度地圖BMapGL內(nèi)存泄漏問(wèn)題?Out?of?Memory,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于vue2的canvas時(shí)鐘倒計(jì)時(shí)組件步驟解析

    基于vue2的canvas時(shí)鐘倒計(jì)時(shí)組件步驟解析

    今天給大家介紹一款基于vue2的canvas時(shí)鐘倒計(jì)時(shí)組件,這個(gè)時(shí)鐘倒計(jì)時(shí)組件采用canvas動(dòng)畫的炫酷動(dòng)畫效果形式,根據(jù)剩余時(shí)間的多少變換顏色和旋轉(zhuǎn)扇形的速度,適合搶購(gòu)、拍賣、下注等業(yè)務(wù)場(chǎng)景,且對(duì)移動(dòng)端友好,需要的朋友可以參考下
    2018-11-11
  • Vue2路由跳轉(zhuǎn)傳參中文問(wèn)題處理方案

    Vue2路由跳轉(zhuǎn)傳參中文問(wèn)題處理方案

    在el-table中的記錄列表中放置了一個(gè) 操作按鈕,點(diǎn)這個(gè)按鈕時(shí)可以新增一個(gè)tab頁(yè)簽,并將通過(guò)路由傳參方式將一些信息傳遞到新打開的tab頁(yè)簽中,但發(fā)現(xiàn)傳遞中文參數(shù)時(shí)會(huì)出現(xiàn)報(bào)錯(cuò),所以本文給大家介紹了Vue2路由跳轉(zhuǎn)傳參中文問(wèn)題處理方案,需要的朋友可以參考下
    2024-05-05
  • Vue.js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼

    Vue.js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼

    這篇文章主要介紹了vue js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Vue keepAlive頁(yè)面強(qiáng)制刷新方式

    Vue keepAlive頁(yè)面強(qiáng)制刷新方式

    這篇文章主要介紹了Vue keepAlive頁(yè)面強(qiáng)制刷新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評(píng)論

蒲城县| 东兰县| 三穗县| 长丰县| 镇平县| 黄浦区| 开化县| 绍兴县| 长海县| 山丹县| 瑞丽市| 东丽区| 云阳县| 牡丹江市| 阿克陶县| 左权县| 新乐市| 福建省| 涞源县| 绥化市| 色达县| 临安市| 巴楚县| 馆陶县| 兴隆县| 萨迦县| 二连浩特市| 眉山市| 行唐县| 常宁市| 永顺县| 平塘县| 泗水县| 嘉祥县| 吉水县| 长兴县| 施秉县| 崇信县| 日土县| 新龙县| 磐石市|