龙空技术网

如何创建Vue渲染函数

dirac 583

前言:

此刻我们对“vue渲染html”大致比较重视,咱们都需要分析一些“vue渲染html”的相关知识。那么小编在网摘上汇集了一些有关“vue渲染html””的相关文章,希望姐妹们能喜欢,我们快快来了解一下吧!

Vue 建议在绝大多数情况下使用模板来构建应用程序。但是,在某些情况下,我们需要 JavaScript 的全部编程能力。这就是我们可以使用渲染功能的地方。

基本用法

创建虚拟节点。Vue 提供了一个h()创建虚拟节点的函数:

import { h } from 'vue'

const vnode = h(

'div', // type

{ id: 'foo', class: 'bar' }, // props

[/* children */]

)

h()是hyperscript的缩写,意即“产生 HTML(超文本标记语言)的 JavaScript”。此名称继承自许多虚拟 DOM 实现共享的约定。更具描述性的名称可能是createVnode(),但当必须在渲染函数中多次调用此函数时,较短的名称会有所帮助。

该h()功能设计得非常灵活。

// 除类型之外的所有参数都是可选的

h('div')

h('div', { id: 'foo' })

// attributes和properties均可在props中使用

// Vue 会自动选择正确的分配方式

h('div', { class: 'bar', innerHTML: 'hello' })

// 分别使用“.”和“^”前缀

// 添加 props 修饰符,如 .prop 和 .attr

h('div', { '.name': 'some-name', '^width': '100' })

// 与模板相同,class和style的值可以是对象或数组

h('div', { class: [foo, { bar }], style: { color: 'red' } })

// 事件侦听器应作为onXxx传递

h('div', { onClick: () => {} })

// 子元素可以是一个字符串

h('div', { id: 'foo' }, 'hello')

// 当没有props时可以省略props

h('div', 'hello')

h('div', [h('span', 'hello')])

// 子级数组可以包含虚拟节点和字符串

h('div', ['hello', h('span', 'hello')])

生成的虚拟节点具有以下形式:

const vnode = h('div', { id: 'foo' }, [])

vnode.type // 'div'

vnode.props // { id: 'foo' }

vnode.children // []

vnode.key // nullc

声明渲染函数

我们可以使用以下render选项声明渲染函数:

import { h } from 'vue'

export default {

data() {

return {

msg: 'hello'

}

},

render() {

return h('div', this.msg)

}

}

该render()函数可以通过 访问组件实例this。

除了返回单个虚拟节点之外,还可以返回字符串或数组:

export default {

render() {

return 'hello world!'

}

}

import { h } from 'vue'

export default {

render() {

// 使用数组返回多个根节点

return [h('div'), h('div'), h('div') ]

}

}

如果渲染函数组件不需要任何实例状态,也可以为简洁起见直接声明为函数:

function Hello() {

return 'hello world!'

}

这是一个有效的Vue组件。

虚拟节点必须是唯一的

组件树中的所有虚拟节点必须是唯一的。因此,以下渲染函数是无效的。

function render() {

const p = h('p', 'hi')

return h('div', [p, p])

}

如果想多次复制相同的元素/组件,可以使用工厂函数来实现。例如,下面的渲染函数是渲染 20 个相同段落的完全有效的方法:

function render() {

return h('div',

Array.from({ length: 20 }).map(() => {return h('p', 'hi')})

)

}

标签: #vue渲染html