h
函数是什么A:h
函数的本质就是 createElement()
的简写,作用是根据配置创建对应的虚拟节点。
在 Vue2
版本中,可以使用全局Api render
函数,Vue
会给这个函数内部传递一个h
函数作为参数,用于创建Vnode
的描述对象
// 使用模板语法编写的 .Vue 文件最终会被编译成什么样
<template>
<div class="box">
<img src="../src/assets/daiban.png" alt="我是一张图片">
<Son name='卫斯理'/>
</div>
</template>
<script>
import Son from './son.vue'
export default {
name: 'Box',
components: {
Son
}
}
</script>
<style scoped>
</style>
import Vue, { h } from 'vue'
import router from './router'
import store from './store'
import Son from './son.vue'
import img from '../src/assets/guaz.png'
const App = function render() {
return h(
'div',
{
id: 'app'
},
[
h('img', {
alt: '我是一张图片',
// src: '../src/assets/daiban.png' // 会被识别为字符串
src: img
}),
h(Son, {
props: {
name: '卫斯理'
}
})
]
)
}
new Vue({ router, store, render: h => h(App) }).$mount('#app')
h
函数有那些参数配置A:type
、props
、children
export declare function h(
type: string,
props?: RawProps | null,
children?: RawChildren | RawSlots
): VNode;
type
props
children
render(h) {
// 如果使用原生的则
// return h('componentName', {
// 这个是挂载组件
return h('div', {
// 此处是给 SelectEdit 组件传值的(props传值)
props: {
value: 1,
type: 'on'
},
// class可以数组的形式也可以对象的形式
// class: ['speci-class'],
class: {
'speci-class': true
},
// 样式有-的注意小驼峰 或者使用 string 模式
style: {
color: 'red',
fontSize: '14px',
// 或者这样
'font-size': '14px'
},
// 普通的 HTML attribute
attrs: {
placeholder: '这是给原生html赋值placeholder属性'
},
// DOM property
domProps: {
innerHTML: 'DOM property',
// 这个参数等同于h函数的第三个参数
innerText: 'xxxxxxx'
},
// 这里是挂载方法的但不再支持如 `v-on:keyup.enter` 这样的修饰器
on: {
// 方法名可以自定义(组件内 $emit('xxxchange', {name: 'zs'}))
'xxxchange': val => {
this.name = val.name;
},
'click': val => {
this.name = val.name;
},
},
// 仅用于组件,用于监听原生事件,而不是组件内部使用
// `vm.$emit` 触发的事件。
nativeOn: {
click: this.nativeClickHandler
},
// 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
directives: [
{
name: 'my-custom-directive',
value: '2',
expression: '1 + 1',
arg: 'foo',
modifiers: {
bar: true
}
}
],
// 作用域插槽的格式为
scopedSlots: {
default: props => createElement('span', props.text)
},
// 如果组件是其它组件的子组件,需为插槽指定名称
slot: 'name-of-slot',
// 其它特殊顶层 property
key: 'myKey',
ref: 'myRef',
// 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
// 那么 `$refs.myRef` 会变成一个数组。
refInFor: true
}, '这里是显示文本')
}
}
h
函数中如何使用条件判断及循环语句A:
v-for
<ul>
<li v-for="{ item, index } in list" :key="item.id">
{{ item }}
</li>
</ul>
h
函数中的使用let arr = [1,2,3,4,5]
render(h){
return h(
'ul',
{},
[
arr.map(item => return(h('li',{},'item'))
]
)
}
v-if
let flag = true
<div>
<div v-if="flag">出现</div>
<span v-else>隐藏</span>
</div>
h
函数中的使用let flag = true
render(h){
return h(
'ul',
{},
flag ? '出现' : '隐藏'
)
}
<Button @click='submit'>提交</Buttom>
h
函数中的使用render(h){
return h(
'ul',
{
on:{
click: () => {
// 处理函数
}
}
},
'提交按钮'
)
}