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

手寫Vue內(nèi)置組件component的實現(xiàn)示例

 更新時間:2022年07月18日 09:32:35   作者:CreatorRay  
本文主要介紹了手寫Vue內(nèi)置組件component的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近在復習Vue的源碼,今天帶大家手寫實現(xiàn)一下Vue內(nèi)置組件component,比較簡單,最近面試有被問到。

前言

Vue大家都很熟悉,除了原生的組件,其自己也封裝了一下內(nèi)置組件,比如component,transitionkeep-alive等等。

component算是用的比較多的了,當我們遇到需要根據(jù)不同條件顯示不同組件的時候,一般都是用component來實現(xiàn)。當然你也可以v-if,v-else-if,v-else,就顯的比較笨了。

大家如果沒用過,可以先自己嘗試一下這個component組件。最主要的就是它有一個is屬性,你給is賦予什么組件名,它就渲染什么組件。

內(nèi)置組件component的使用

我寫一個小demo演示一下。
先隨意的寫三個組件,A,B,C。

在這里插入圖片描述

組件內(nèi)容就是aaaa,bbbbcccc,方便我們辨認當然渲染的是哪個組件。

在這里插入圖片描述

然后集體引入,掛載。

在這里插入圖片描述

在這里插入圖片描述

視圖內(nèi)容大概這樣寫,需求就是,準備三個按鈕,點擊哪個按鈕就顯示哪個組件。

    <div>
      <button @click="changeComp('A')">顯示A</button>
      <button @click="changeComp('B')">顯示B</button>
      <button @click="changeComp('C')">顯示C</button>
    </div>
    <component :is="compList"></component>

compList提前聲明好,默認是A組件。

  data() {
    return {
      compList: 'A'
    };
  },

changeComp函數(shù)內(nèi)容如下:

  methods: {
    changeComp(comp) {
      this.compList = comp;
    },
  }

OK,這就完事了,大家可以自己試一下,是可以完成既定的需求的。

在這里插入圖片描述

component組件的原理分析

我們今天的任務是,了解內(nèi)置組件component的原理,并手寫實現(xiàn)一個。

那么component的實現(xiàn)原理是怎么樣的呢,這個就需要牽扯一塊比較大的知識鏈了,也是Vue的核心內(nèi)容。關于Vue虛擬DOM以及模板編譯的部分內(nèi)容。

簡單來說,Vue內(nèi)部實現(xiàn)了一個虛擬DOM來妥善解決原生DOM的性能問題。

虛擬DOM與原生DOM

比如我們當前需要插入1000DOM節(jié)點,如果是原生DOM來做的話,就是扎扎實實的,一個個操作,改變DOM,DOM需要被改變1000次,這對于性能是極大的損耗,造成很多的問題。

虛擬DOM的原理就是,先在框架內(nèi)部用對象模擬一下原生DOM的形態(tài),記錄你這1000次的DOM操作,最后將DOM被操作1000次后的形態(tài)賦給原生DOM。這樣就能極大的優(yōu)化大量DOM操作帶來的負面影響。

然后再來思考一下,我們平時寫的.vue文件,其實跟原生寫法是有區(qū)別的,無論是HTMLJS還是CSS,在編寫階段有做了些許的改動,這樣做有助于提高我們的編寫效率。但是瀏覽器是只認原生的HTML、CSSJS的,所以我們編寫的組件內(nèi)容,其實只是一個template模板,需要進行編譯轉換為原生的DOM才能渲染到瀏覽器上。

componet組件其實就是內(nèi)部做了這個事情,將你傳入的組件, 先轉換為虛擬DOM,然后渲染為真實DOM,展示到視圖上。

render函數(shù)的使用

這里面就涉及到一個知識點了,關于render函數(shù)的使用,具體的內(nèi)容大家可以去Vue文檔詳細了解一下render函數(shù)??赡艽蠹胰粘i_發(fā)用的比較少,涉及一些偏底層的東西時才會遇到。

我這里只介紹render函數(shù)做的事情。
它的形態(tài)大概是這個樣式。

render(h) {
    // return h('A');
    return h('div', '6666');
},

render函數(shù)接收一個參數(shù),比如叫它h,h也是一個函數(shù),它的作用就是將傳入的內(nèi)容構建為虛擬DOM,這個傳入的內(nèi)容支持原生的寫法,也支持Vue組件。

比如我代碼里給出的,h('div', '6666'),h函數(shù)就會生成一個div組件,文本內(nèi)容是666。被注釋掉的,就是傳入Vue中自己的寫的組件名字為A,同樣支持。

但是h函數(shù)僅僅只是將傳入的內(nèi)容,生成虛擬DOM,不是真實的原生DOM,然后將它return出去,render函數(shù)才會將這個虛擬DOM渲染成為真實DOM。

上述關于render函數(shù)的內(nèi)容不知道大家是否理解,可以去Vue官方文檔里,詳細看一下,然后自己寫寫demo體驗一下,render函數(shù)算是Vue進階中比較重要的內(nèi)容了。

所以,話說回來,知道了render函數(shù)這個東西,我們就能夠比較好的實現(xiàn)component這個內(nèi)置組件了。component組件會接收一個屬性isis的值就是我們要渲染的組件。component組件的內(nèi)容其實就是進行了 Vue組件 => 虛擬DOM => 真實DOM,渲染視圖,其實就通過render函數(shù)實現(xiàn)就可以。

嘗試手寫實現(xiàn)component

話不多說,我們試一下。

因為組件內(nèi)容比較少,所以我們直接使用Vue.component來編寫組件內(nèi)容。

Vue.component("myComponent", {
  props: ["is"],
  render(h) {
    return h(this.is);
  },
});

其實核心代碼就上面這幾行,組件名字是myComponent,props的作用就是指定組件要接收的參數(shù)is。然后編寫一下render函數(shù),因為是渲染Vue組件,所以直接return h(this.is)就可以。

將這段代碼寫在JS里,然后就可以使用了。記得要import Vue from 'vue'來引入Vue,因為我們是通過Vue.component來編寫組件的。

下面我們試一試,這個myComponent是否有用。

    <div>
      <button @click="changeComp('A')">顯示A</button>
      <button @click="changeComp('B')">顯示B</button>
      <button @click="changeComp('C')">顯示C</button>
    </div>
    <component :is="compList"></component>
    <my-component :is="compList"></my-component>

在這里插入圖片描述

實際操作后可以發(fā)現(xiàn),我們自己寫的myComponentVue內(nèi)置的component效果是一模一樣的,大家自己也可以試一下。

完整代碼:

<template>
  <div>
    <div>
      <button @click="changeComp('A')">顯示A</button>
      <button @click="changeComp('B')">顯示B</button>
      <button @click="changeComp('C')">顯示C</button>
    </div>
    <component :is="compList"></component>
    <my-component :is="compList"></my-component>
  </div>
</template>

<script>
import Vue from "vue";
import A from "../components/A.vue";
import B from "../components/B.vue";
import C from "../components/C.vue";

Vue.component("myComponent", {
  props: ["is"],
  render(h) {
    return h(this.is);
  },
});
export default {
  components: {
    A,
    B,
    C,
  },
  data() {
    return {
      compList: 'A'
    };
  },
  methods: {
    changeComp(comp) {
      this.compList = comp;
    },
  },
};
</script>

<style scoped>

</style>

總結

今天的內(nèi)容是帶著大家手寫實現(xiàn)Vue的內(nèi)置組件component,在嘗試實現(xiàn)某一個東西的時候,就需要先思考它的作用以及內(nèi)部原理。手寫component的過程比較簡單,但是涉及到了很多Vue的原理性知識點,比如虛擬DOM、render函數(shù)、模板編譯等。

到此這篇關于手寫Vue內(nèi)置組件component的實現(xiàn)示例的文章就介紹到這了,更多相關Vue內(nèi)置組件component內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue中input type=file上傳后@change事件無效的解決方案

    vue中input type=file上傳后@change事件無效的解決方案

    這篇文章主要介紹了vue中input type=file上傳后@change事件無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    這篇文章主要給大家介紹了關于Vue.js如何利用v-for循環(huán)生成動態(tài)標簽的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • Vue+ElementUI技巧之自定義表單項label的文字提示方法

    Vue+ElementUI技巧之自定義表單項label的文字提示方法

    這篇文章主要給大家介紹了關于Vue+ElementUI技巧之自定義表單項label文字提示的相關資料,文中通過圖文以及代碼示例介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • uniapp中app與webview的通訊代碼示例

    uniapp中app與webview的通訊代碼示例

    這篇文章主要給大家介紹了關于uniapp中app與webview通訊的相關資料,這里的通信主要是打包APP端和web-view內(nèi)嵌網(wǎng)頁的雙向通信,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Vue頭像處理方案小結

    Vue頭像處理方案小結

    這篇文章主要介紹了Vue頭像處理方案,實現(xiàn)思路主要是通過獲取后臺返回頭像url,判斷圖片寬度,高度。具體實例代碼大家參考下本文
    2018-07-07
  • elementui實現(xiàn)表格自定義排序的示例代碼

    elementui實現(xiàn)表格自定義排序的示例代碼

    本文主要介紹了elementui實現(xiàn)表格自定義排序的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Vue3中#default=“scope”的使用

    Vue3中#default=“scope”的使用

    在Vue3中,我們經(jīng)常會遇到需要處理列表渲染的情況,Vue3引入了一種新的語法,即#default=“scope”,本文就來介紹一下Vue3中#default=“scope”的使用,感興趣的可以了解一下
    2023-10-10
  • Vue Router history模式的配置方法及其原理

    Vue Router history模式的配置方法及其原理

    這篇文章主要介紹了Vue Router history模式的配置方法及其原理,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • vue3.0 上手體驗

    vue3.0 上手體驗

    vue3.0 beta 版本已經(jīng)發(fā)布有一段時間了,今天這篇文章就帶大家體驗一下,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • vue雙向數(shù)據(jù)綁定原理分析、vue2和vue3原理的不同點

    vue雙向數(shù)據(jù)綁定原理分析、vue2和vue3原理的不同點

    這篇文章主要介紹了vue雙向數(shù)據(jù)綁定原理分析、vue2和vue3原理的不同點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

乐平市| 驻马店市| 万宁市| 合山市| 成安县| 宁乡县| 徐闻县| 永定县| 彰武县| 朝阳区| 磐安县| 乌兰浩特市| 安化县| 朝阳市| 阜宁县| 汾西县| 泗水县| 高安市| 上饶县| 泗水县| 琼海市| 斗六市| 阜城县| 册亨县| 连州市| 神池县| 东平县| 天长市| 鄯善县| 牡丹江市| 南投县| 仙居县| 界首市| 安达市| 鄂托克旗| 友谊县| 平和县| 卢氏县| 高要市| 资阳市| 蒙山县|