render函数与JSX快速掌握
render函数
render: h => h(element|component)
h作为一个形参,是一个回调函数,可以拥有三个参数:
-
element | componenet props content
element | componenet
原生dom元素:div、span等,或是自定义组件
element情况render: h => h(div, {
style: {
color: red
}
}, 这是一个div)
component情况
render: h => h(myComponent)
props
属性、样式等,可省略
render: h => h(div, {
class: [class1, {class2: true}],
attrs: {
id: box1
},
style: {
color: red,
backgroundColor: lightblue
},
props: {},//组件中的props属性
on: {
click: () => { console.log(单击了一下) }
},
nativeOn: {},//渲染组件时,给组件根元素绑定事件
directives: {},//自定义指令
scopedSlots: {},
slot: ,//default|具名name
key: ,//唯一识别名,如同v-for时使用的key
ref:
}, 这是一个div)
render: h => h(div, 省略属性的div)
content
内容:字符串或者数组,字符串作为元素内部文本呈现,数组可继续渲染子节点
//在元素中传入字符串
render: h => h(div, 这是一个字符串内容)
//在元素中生成子元素节点,必须是数组
render: h => h(ul, [
h(li, 第一个li),
h(li, 第二个li)
]
//通过循环来插入子节点
let list = [
{el: li ,text: 第一个内容},
{el: li ,text: 第二个内容},
{el: li ,text: 第三个内容}
];
const getLiArr= (h, list) => {
return list.map(item => h(item.el, item.text);
}
render: h => h(ul, getLiArr)
函数组件
通过以组件形式,使用render函数渲染,用于在使用slot插槽时,可以自定义插槽渲染的内容样式
//list.vue
<template>
<ul>
<li v-for="(item, itemIndex) in list">
<span v-if=!render>{
{item.name}}</span>
<render-dom v-else :renderFunc=render :name=item.name></render-dom>
</li>
</ul>
</template>
<script>
import renderDom from ./render_dom
export default {
name: list,
props: {
list: {
Array,
default: () => []
},
render: Function,
default: () => {}
},
components: { renderDom }
}
</scirpt>
//render-page.vue
<template>
<list :list=list :render=renderFunc></list>
</template>
<script>
import List from ./list
export default {
name: render-page,
components: {
List
},
data() {
return {
list: [
{ name: 张三 },
{ name: 李四 }
]
}
},
methods: {
renderFunc (h, name) {
return h(h3, {
style: {
color: white,
backgroundColor: lightblue
}
}, name);
}
}
}
</scirpt>
//render_dom.js
export default {
functional: true,//vue中提供的允许组件无状态,无实例的函数组件化
props: {
name: String,
renderFunc: Function
},
render: (h, ctx) => {
//ctx 提供的上下文对象,可以访问实例组件里面的data、props等
return ctx.props.renderFunc(h, ctx.props.name);
}
}
JSX语法
//引用上面代码
//render-page.vue中的renderFunc
renderFunc (h, name) {//形参的h不能改变
return (
//on- 绑定事件的前缀,如若绑定组件里面的自定义事件:on-on-select写法
//nativeOn- 绑定组件根元素事件
//{} 属性绑定的所有变量放入{}内,属性前不需要:
<p on-click={ handleClick } style={
{color: red}}>{name}</p>
)
},
handleClick () {
console.log(单击了);
}
总结
今天重新学习了vue的render函数和JSX语法,刷新了对render的感官,对一些比较模糊的知识点有了清晰的认识,也许还有些不对的地方,会持续改进。由难而易,render的写法也许较为繁琐,最后看到了JSX的语法,感觉又是一股清流,焕然一新的同时,也不会感到有半点滞涩。
天天都是美好的一天,勇士加油!
上一篇:
IDEA上Java项目控制台中文乱码
