vue3中h函數(shù)的常用使用方式匯總
前言
一般情況下每個(gè)vue組件都用"<template>"寫html, 但實(shí)際還可以在js代碼中通過render函數(shù)生成dom. 最主要常見組件庫也需要配合"h"使用.
render
render是組件的一個(gè)選項(xiàng), 他的返回值會(huì)被作為組件的DOM結(jié)構(gòu).
<script> import { defineComponent} from "vue"; export default defineComponent({ render(){ return '123456789' } }); </script>
試試插入html:
<script> import { defineComponent } from "vue"; export default defineComponent({ render(){ return '<h2>123456789</h2>' } }); </script>
可以看到html標(biāo)簽被當(dāng)做字符串渲染了,** 并沒有生成h2標(biāo)簽. 如何正確插入h2標(biāo)簽?zāi)?**
VNode
如果想插入DOM就要用到"VNode", VNode是vue對(duì)頁面DOM節(jié)點(diǎn)的描述, 其是一個(gè)Object類型.
h
結(jié)構(gòu)這么復(fù)雜的"VNode"肯定不是自己拼寫的, 官方提供了"h"函數(shù), 可以幫助我們生成"VNode"
<script> import { defineComponent, h } from "vue"; export default defineComponent({ render() { const props = { style: { color: "red" } }; return h("h2", props, "123456789"); }, }); </script>
這次生成了真正"h2":
"h"函數(shù)的第1個(gè)參數(shù)是"標(biāo)簽名", 第2個(gè)是"屬性", 在這個(gè)例子里可以理解為html的所有屬性, 第3個(gè)是"內(nèi)容". "內(nèi)容"不僅僅可以是字符串, 還可以是"VNode"或2者混合:
<script> import { defineComponent, h } from "vue"; export default defineComponent({ render() { const props = { style: { color: "red" } }; const small = h("small", "副標(biāo)題"); return h("h2", props, ["123456789", small]); }, }); </script>
如果實(shí)際只傳入2個(gè)參數(shù), 那么第二2參數(shù)就會(huì)作為內(nèi)容, 比如這里的"small".
渲染組件
"h"還可以渲染"組件", 這一下靈活度就上來了, 假設(shè)我們有一個(gè)"switch"組件, 其支持<switch v-model:checked="checked"/>
.
<script> import { defineComponent, h } from "vue"; import ASwitch from "../components/ASwitch.vue"; export default defineComponent({ components: { ASwitch }, data() { return { checked: false }; }, render() { return h(ASwitch) } }); </script>
這里注意第1個(gè)參數(shù)還支持傳入組件對(duì)象. 效果如下:
但是你可以發(fā)現(xiàn)了, "switch"雖然顯示了, 但是點(diǎn)擊后按鈕并不能切換.
h函數(shù)中使用"v-model"
上面不能切換是因?yàn)闆]有像在模板中那樣使用"v-model".
<a-switch v-model:checked="checked"></a-switch>
回憶下前面講過的"自定義雙向數(shù)據(jù)綁定"課中講的如何實(shí)現(xiàn)"v-model", 對(duì)比下可以發(fā)現(xiàn)上面"h"中,沒有定義"props"和"v-on事件監(jiān)聽", 怎么寫呢? 先說一個(gè)重要的知識(shí)點(diǎn): 組件上的事件監(jiān)聽其實(shí)也可通過"props"傳入:
<a-switch @update:checked="onChange"></a-switch> <!-- 等價(jià)寫法: --> <a-switch :onUpdate:checked="onChange"></a-switch>
所有的自定義事件, 都可以通過":on"前綴通過props傳入. 所以在"h"中可以通過第2個(gè)參數(shù)傳入"checked"屬性和"onUpdate:checked"事件實(shí)現(xiàn)"v-model"的等同操作.
<script> import { defineComponent, h } from "vue"; import ASwitch from "../components/ASwitch.vue"; export default defineComponent({ components: { ASwitch }, data() { return { checked: false }; }, render() { return h(ASwitch, { checked: this.checked, ["onUpdate:checked"]: (checked) => { this.checked = checked; }, }); }, }); </script>
使用場(chǎng)景
實(shí)際開發(fā)中很多第三方組件都設(shè)計(jì)了可以接收"VNode"的"屬性", 比如"ant-design-vue"的"Table"組件的"columns"屬性中的"customRender"屬性, 可以通過傳入"VNode"實(shí)現(xiàn)樣式自定義:
{ title: '狀態(tài)', customRender({ record }: any) { if (1 === record.state) { return h(Tag, { color: 'success' }, () => `開啟`); } else { return h(Tag, { color: 'error' }, () => `關(guān)閉`); } }, },
代碼中通過"h"渲染了"Tag"組件,效果如下:
總結(jié)
這節(jié)課講了3個(gè)概念, 幫大家整理下他們3者的關(guān)系:** "render"函數(shù)的返回值需要是"VNode"格式, "h"函數(shù)可以構(gòu)造"VNode"格式數(shù)據(jù). **
到此這篇關(guān)于vue3中h函數(shù)的常用使用方式的文章就介紹到這了,更多相關(guān)vue3中h函數(shù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element-plus按需引入后ElMessage與ElLoading在頁面中的使用
這篇文章主要介紹了element-plus按需引入后ElMessage與ElLoading在頁面中的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue 的keep-alive緩存功能的實(shí)現(xiàn)
本篇文章主要介紹了vue 的keep-alive緩存功能的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Vue2+Elementui?Dialog實(shí)現(xiàn)封裝自定義彈窗組件
在日常的管理系統(tǒng)界面中,我們寫的最多的除了列表表格之外,就是各種彈窗組件,本文就來為大家詳細(xì)介紹一下Vue2如何結(jié)合Elementui?Dialog實(shí)現(xiàn)封裝自定義彈窗組件,希望對(duì)大家有所幫助2023-12-12vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新
這篇文章主要為大家詳細(xì)介紹了vue+echarts實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Vue?Echarts實(shí)現(xiàn)多功能圖表繪制的示例詳解
作為前端人員,日常圖表、報(bào)表、地圖的接觸可謂相當(dāng)頻繁,今天小編隆重退出前端框架之VUE結(jié)合百度echart實(shí)現(xiàn)中國地圖+各種圖表的展示與使用;作為“你值得擁有”專欄階段性末篇,值得一看2023-02-02vue.js 1.x與2.0中js實(shí)時(shí)監(jiān)聽input值的變化
這篇文章主要介紹了vue.js 1.x與vue.js2.0中js實(shí)時(shí)監(jiān)聽input值的變化的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03