vue用h()函數(shù)創(chuàng)建Vnodes的實(shí)現(xiàn)
前言
Vue 提供了一個(gè) h() 函數(shù)用于創(chuàng)建 vnodes。
h() 是 hyperscript 的簡稱——意思是“能生成 HTML (超文本標(biāo)記語言) 的 JavaScript”。
const vnode = h(
'div', // type
{ id: 'foo', class: 'bar' }, // props
key: '001', // key
[
/* children */
]
)
【注意】組件樹中的 vnodes 必須是唯一的。
一、h() 函數(shù)的基本使用方式
import { h } from 'vue'
// 除了類型必填以外,其他的參數(shù)都是可選的
h('div')
h('div', { id: 'foo' })
// attribute 和 property 都能在 prop 中書寫
// Vue 會自動將它們分配到正確的位置
h('div', { class: 'bar', innerHTML: 'hello' })
// 像 `.prop` 和 `.attr` 這樣的的屬性修飾符
// 可以分別通過 `.` 和 `^` 前綴來添加
h('div', { '.name': 'some-name', '^width': '100' })
// 類與樣式可以像在模板中一樣
// 用數(shù)組或?qū)ο蟮男问綍鴮?
h('div', { class: [foo, { bar }], style: { color: 'red' } })
// 事件監(jiān)聽器應(yīng)以 onXxx 的形式書寫
h('div', { onClick: () => {} })
// children 可以是一個(gè)字符串
h('div', { id: 'foo' }, 'hello')
// 沒有 props 時(shí)可以省略不寫
h('div', 'hello')
h('div', [h('span', 'hello')])
// children 數(shù)組可以同時(shí)包含 vnodes 與字符串
h('div', ['hello', h('span', 'hello')])
二、h() 函數(shù)的進(jìn)階使用方式
1、條件渲染
h('div', [ok.value ? h('div', 'yes') : h('span', 'no')])
2、列表渲染
h(
'ul',
// 假設(shè)‘items'是一個(gè)具有數(shù)組值的 ref
items.value.map(({ id, text }) => {
return h('li', { key: id }, text)
})
)
3、事件
h(
'button',
{
onClick: (event) => {},
// 對于事件和按鍵修飾符,可以使用 withModifiers 函數(shù)
onDbclick: withModifiers(() => {}, ['stop'])
},
'click me'
)
4、使用插槽
import { h } from 'vue'
const vnode = h(
'SelfComponent',
// 默認(rèn)插槽:
// <div><slot /></div>
// <div>{slots.default()}</div>
h('div', slots.default()),
// 具名插槽
// <div><slot name="footer" :text="message" /></div>
// <div>{slots.footer({ text: props.message })}</div>
h(
'div',
slots.footer({
text: props.message
})
)
)
【參考文章】
vue 官網(wǎng)之“渲染函數(shù) & JSX”
到此這篇關(guān)于vue用h()函數(shù)創(chuàng)建Vnodes的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue h()函數(shù)創(chuàng)建Vnodes內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue中post方式提交數(shù)據(jù)后臺無法接收的問題
今天小編就為大家分享一篇解決vue中post方式提交數(shù)據(jù)后臺無法接收的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue手寫<RouterLink/>組件實(shí)現(xiàn)demo詳解
這篇文章主要為大家介紹了vue手寫<RouterLink/>組件實(shí)現(xiàn)demo詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
淺析Proxy如何實(shí)現(xiàn)Vue響應(yīng)式
這篇文章主要是來和大家探討一下,Vue的響應(yīng)式系統(tǒng)僅僅是一個(gè)Proxy嗎,本文將圍繞此問題探索一下Proxy是如何實(shí)現(xiàn)Vue響應(yīng)式的,感興趣的小伙伴可以了解一下2023-08-08
vue.js集成echarts時(shí)遇到的一些問題總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于vue.js集成echarts遇到的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
vue項(xiàng)目基于WebRTC實(shí)現(xiàn)一對一音視頻通話
這篇文章主要介紹了vue項(xiàng)目基于WebRTC實(shí)現(xiàn)一對一音視頻通話效果,實(shí)現(xiàn)代碼分為前端和后端兩部分代碼,需要的朋友可以參考下2024-05-05

