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

vue多功能渲染函數(shù)h()的使用和多種應(yīng)用場景

 更新時間:2024年08月05日 08:23:46   作者:天天鴨  
我們在vue項(xiàng)目里面用HTML標(biāo)簽構(gòu)建頁面時最終會被轉(zhuǎn)化成vnode,而h()是直接創(chuàng)建vnode,因此h()能以一種更靈活的方式在各種各樣情景下構(gòu)建組件的渲染邏輯,并且能帶來性能方式的提升,本文介紹如何使用和列出具體的應(yīng)用場景,需要的朋友可以參考下

前言

按照vue官方的介紹,h()渲染函數(shù)是用來創(chuàng)建虛擬 DOM 節(jié)點(diǎn) vnode。我們在vue項(xiàng)目里面用HTML標(biāo)簽構(gòu)建頁面時最終會被轉(zhuǎn)化成vnode,而h()是直接創(chuàng)建vnode,因此h()能以一種更靈活的方式在各種各樣情景下構(gòu)建組件的渲染邏輯,并且能帶來性能方式的提升。下面介紹如何使用和列出具體的應(yīng)用場景:

一、 h()渲染函數(shù)使用語法

如下所示,主要有三個參數(shù),其中第2第3個參數(shù)都是可選的

  • type: 要創(chuàng)建的節(jié)點(diǎn)類型,可以是HTML 標(biāo)簽、組件或函數(shù)(函數(shù)式組件)。
  • props(可選): 節(jié)點(diǎn)的屬性對象,傳遞的 prop。
  • children(可選): 節(jié)點(diǎn)的子節(jié)點(diǎn),可以是字符串、數(shù)組或其他 vnode。
// 語法格式
function h(
  type: string | Component,
  props?: object | null,
  children?: Children | Slot | Slots
): VNode

// 基本使用示例
h('div', { id: 'foo' }, 'Hello我是天天鴨!');

h 函數(shù)的參數(shù)詳解

(1)type 參數(shù):

  • HTML 標(biāo)簽: 如果 type 是一個字符串,它會被識別解析為一個 HTML 標(biāo)簽。
  • 組件: 如果 type 是一個對象或函數(shù),那么會被解析為一個 Vue 的組件。
  • 異步組件: type 還可以是一個返回 Promise 的函數(shù), Promise 會被解析為組件。

(2)props 參數(shù):

  • props是可選參數(shù),用來指定該節(jié)點(diǎn)的屬性參數(shù)。如果傳遞了 props,側(cè)應(yīng)該是傳遞一個對象,里面包含傳遞給節(jié)點(diǎn)的屬性名和值。
  • 如果傳遞 props,可以傳遞 null。

(3)children 參數(shù):

  • children是可選參數(shù),用于指定當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)。子節(jié)點(diǎn)同理可以是字符串、數(shù)組或 vnode 對象。
  • 如果子節(jié)點(diǎn)是數(shù)組,則數(shù)組中的每個元素都是該節(jié)點(diǎn)的子節(jié)點(diǎn)。
  • 如果子節(jié)點(diǎn)是一個函數(shù),則該函數(shù)會在渲染時被調(diào)用,并且其返回值將作為子節(jié)點(diǎn)。

二、具體應(yīng)用示例

只看使用語法可能不太好理解什么時候應(yīng)該使用h()函數(shù),下面直接列舉出真實(shí)項(xiàng)目中的幾種適合使用h()的業(yè)務(wù)場景。

(1)動態(tài)渲染組件

如下所示,結(jié)合component實(shí)現(xiàn)動態(tài)組件,這種算是最常用的業(yè)務(wù)場景之一了,但很多人在這種情況并不會用h()實(shí)現(xiàn)些功能。 其實(shí)用上h()能避免模板編譯的開銷,在這場景下可以帶來性能上的優(yōu)化,并且處理起來也更靈活。

<template>
  <button @click="changeComponent">切換動態(tài)組件</button>
  <component :is="createComponent()" />
</template>

<script setup lang="ts">
import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

const nowComponent = ref('ComponentA');

function changeComponent() {
  nowComponent.value = nowComponent.value === 'ComponentA' ? 'ComponentB' : 'ComponentA';
}

const createComponent = () => {
  return h(nowComponent.value === 'ComponentA' ? ComponentA : ComponentB);
};
</script>

(2)創(chuàng)建函數(shù)式組件

h()創(chuàng)建函數(shù)式組件既能獨(dú)立抽離維護(hù),又不用額外多創(chuàng)建一個.vue文件,真的不要太實(shí)用了。這種方式非常適合用于簡單的 UI 組件,可以顯著簡化代碼并且提高性能。

<template>
  <FunctionalComponent text="這是函數(shù)式組件" @click="handleClick" />
</template>

<script setup lang="ts">
import { h, defineEmits } from 'vue';

const FunctionalComponent = (props, context) => {
  return h('div', null, [
    h('p', null, props.text),
    h('button', { onClick: context.emit.bind(context, 'click') }, '點(diǎn)擊我')
  ]);
};

const emit = defineEmits(['click']);

function handleClick() {
  console.log('handleClick');
}
</script>

如上所示,就是典型的函數(shù)式組件使用方法,其中包含了如何在父子組件中與之交互。函數(shù)式組件 FunctionalComponent 接收 propscontext 參數(shù),并使用 h() 函數(shù)來構(gòu)建頁面。同時再通過 context.emit 方法來觸發(fā)父組件中的事件處理器。

注意: props 用于接收父組件傳遞過來的屬性。context 用于訪問組件上下文,如 slots插槽和方法事件的。

(3)渲染動態(tài)屬性

一個組件或者一個標(biāo)簽如果需要定義一些動態(tài)屬性,那么用h()渲染函數(shù)就相當(dāng)方便了

<template>
  <button @click="myVisibility">切換組件顯示狀態(tài)</button>
  <component :is="componentWithProps()" />
</template>

<script setup lang="ts">
  import { ref } from 'vue';

  const visible = ref(true);

  function myVisibility() {
    visible.value = !visible.value;
  }

  const componentWithProps = () => {
    return h('div', { class: { visible: visible.value } }, '我是div');
  };
</script>

如上所示,h()函數(shù)里面根據(jù) visible 的值來決定 vnode 是否具有 visible 這個類,當(dāng)點(diǎn)擊按鈕時實(shí)現(xiàn)動態(tài)樣式。當(dāng)然了,動態(tài)類只是一個例子,其實(shí)h()里面的各種屬性或者說子組件都能動態(tài),靈活性遠(yuǎn)超用HTML實(shí)現(xiàn)。

(4)使用插槽

h()如果結(jié)合函數(shù)式組件和插槽來傳遞內(nèi)容,能提高使用時的靈活性。

<template>
  <SlotComponent>
    <template #default>
      <p>我是插槽里面</p>
    </template>
  </SlotComponent>
</template>

<script setup lang="ts">
import { h } from 'vue';

const SlotComponent = (props, context) => {
  return h('div', null, [
    h('p', null, '插槽里面:'),
    context.slots.default && context.slots.default()
  ]);
};
</script>

如上所示,引用 SlotComponent組件時,其內(nèi)部的 <template> 標(biāo)簽中的內(nèi)容會被作為默認(rèn)插槽的內(nèi)容傳遞給 SlotComponent組件。并且能通過 context.slots.default() 來獲取并渲染默認(rèn)插槽里面的內(nèi)容。因此當(dāng)我們封裝一個函數(shù)式組件,但里面有某一部分是動態(tài)的時候,就特別適合這樣通過插槽去靈活使用。

注意: props 用于接收父組件傳遞過來的屬性。context 用于訪問組件上下文,如 slots插槽和方法事件的。

(5)創(chuàng)建動態(tài)標(biāo)簽

如下代碼是 h() 函數(shù)結(jié)合動態(tài)組件來實(shí)現(xiàn)在不同的 HTML 標(biāo)簽之間的切換。

<template>
  <button @click="changeTag">切換標(biāo)簽</button>
  <component :is="createElement()" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const tag = ref('div');

function changeTag() {
  tag.value = tag.value === 'div' ? 'section' : 'div';
}

const createElement = () => {
  return h(tag.value, null, '動態(tài)標(biāo)簽');
};
</script>

如上所示,其實(shí)就是根據(jù) tag 的值來決定返回哪個 HTML 標(biāo)簽的 VNode,如果業(yè)務(wù)邏輯涉及到標(biāo)簽的動態(tài)變化時就相當(dāng)好用,避免使用v-if產(chǎn)生大量重復(fù)代碼。

小結(jié)

總結(jié)下來就會發(fā)現(xiàn),其實(shí)h()渲染函數(shù)適用的應(yīng)用場景非常多并且用法相當(dāng)靈活,絕對是萬金油函數(shù)。以上是我總結(jié)的幾種實(shí)用場景,如有哪里寫的不對或者有更好的建議歡迎大佬指點(diǎn)一二啊。

以上就是vue多功能渲染函數(shù)h()的使用和多種應(yīng)用場景的詳細(xì)內(nèi)容,更多關(guān)于vue渲染函數(shù)h()的用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用proxy實(shí)現(xiàn)一個更優(yōu)雅的vue【推薦】

    使用proxy實(shí)現(xiàn)一個更優(yōu)雅的vue【推薦】

    Proxy 用于修改某些操作的默認(rèn)行為,等同于在語言層面做出修改,所以屬于一種“元編程”。這篇文章主要介紹了用proxy實(shí)現(xiàn)一個更優(yōu)雅的vue,需要的朋友可以參考下
    2018-06-06
  • vue中使用sessionStorage記住密碼功能

    vue中使用sessionStorage記住密碼功能

    sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。這篇文章主要介紹了vue中使用sessionStorage記住密碼功能,需要的朋友可以參考下
    2018-07-07
  • Vue使用el-upload批量上傳圖片時報錯問題處理方法

    Vue使用el-upload批量上傳圖片時報錯問題處理方法

    相信大家都知道在element-ui中,el-upload可以進(jìn)行文件多選操作,下面這篇文章主要給大家介紹了關(guān)于Vue使用el-upload批量上傳圖片時報錯問題的處理方法,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Mac下安裝vue

    Mac下安裝vue

    本文給大家詳細(xì)介紹了Mac下安裝vue的方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-04-04
  • vue動態(tài)配置模板 ''component is''代碼

    vue動態(tài)配置模板 ''component is''代碼

    這篇文章主要介紹了vue動態(tài)配置模板 'component is'代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • vue如何動態(tài)獲取當(dāng)前時間

    vue如何動態(tài)獲取當(dāng)前時間

    這篇文章主要介紹了vue如何動態(tài)獲取當(dāng)前時間問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解Vue3如何優(yōu)雅的監(jiān)聽localStorage變化

    詳解Vue3如何優(yōu)雅的監(jiān)聽localStorage變化

    最近在研究框架,也仔細(xì)用了Vue3一些功能,所以本文就來和大家聊聊Vue3如何實(shí)現(xiàn)優(yōu)雅的監(jiān)聽localStorage的變化,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • Vue使用font-face自定義字體的案例詳解

    Vue使用font-face自定義字體的案例詳解

    @font-face?是?CSS?中的一個規(guī)則,它允許你加載服務(wù)器上的字體文件(遠(yuǎn)程或者本地),并在網(wǎng)頁中使用這些字體,本文給大家介紹了Vue使用font-face自定義字體的案例,并通過代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能

    vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目接入高德地圖點(diǎn)擊地圖獲取經(jīng)緯度以及省市區(qū)功能的相關(guān)資料,開發(fā)中我們需要地圖定位,就是用戶輸入位置,自動定位獲取經(jīng)緯度,需要的朋友可以參考下
    2023-08-08
  • VUE3使用JSON編輯器的詳細(xì)圖文教程

    VUE3使用JSON編輯器的詳細(xì)圖文教程

    最近項(xiàng)目中有用到j(luò)son編輯器,我選用了這款vue的編輯器,看起來也是比較簡潔,接下來就具體介紹一下它,下面這篇文章主要給大家介紹了關(guān)于VUE3使用JSON編輯器的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-04-04

最新評論

东至县| 宣威市| 定南县| 山阳县| 徐闻县| 武宁县| 开阳县| 逊克县| 合山市| 寻乌县| 吴堡县| 衡水市| 建水县| 安泽县| 顺昌县| 大冶市| 临武县| 英超| 吉安县| 永靖县| 杭州市| 文水县| 安远县| 黎城县| 泰来县| 于都县| 新巴尔虎右旗| 监利县| 桑植县| 星子县| 根河市| 辽宁省| 喀喇沁旗| 宁陵县| 磐安县| 洛扎县| 和平县| 柘城县| 会宁县| 商都县| 武穴市|