render函数
初步了解
定义一个组件,使用template
<div id="app">
<comp-child :level="level">
我是组件
</comp-child>
</div>
<script>
Vue.component('comp-child',{
props:['level'],
template:`
<div>
<h1 v-if="level===1">
<slot></slot>
</h1>
<h2 v-if="level===2">
<slot></slot>
</h2>
<h3 v-if="level===3">
<slot></slot>
</h3>
</div>
`
})
var app = new Vue({
el:'#app',
data:{
level:1
}
})
</script>
再定义一个组件,使用render函数,其效果和上面例子一样
Vue.component('comp-child',{
props:['level'],
render:function(createElement){
return createElement('h'+this.level,this.$slots.default);
}
})
render函数的第一个参数(必须)
在render函数的方法中,参数必须是createElement,它是类型是function.
render函数的第一个参数可以是:
- String
html标签Vue.component('child',{ render:function(createElement){ return createElement('div') } })
- Object
一个含有数据选项的对象Vue.component('child',{ render:function(createElement){ return createElement({ template:'<div></div>' }) } })
- Function
方法返回含有数据选项的对象Vue.component('child',{ render:function(createElement){ var domFn = function(){ return { template:'<div></div>' } } return createElement(domFn()); } })
render函数的第二个参数
第二个参数是可选,第二个参数是数据对象(只能是Object)
- class
- style
- attrs:正常的html属性
- domProps:原生的DOM属性
Vue.component('child-4', { render: function (createElement) { return createElement('div',{ class:{ active:true, danger:false }, style:{ color:'red', fontSize:'16px' }, attrs:{ id:'foo', src:'http://baidu.com' }, domProps:{ innerText:'Hello World!' } }) } })
render函数的第三个参数
第三个参数是可选的
- String:创建文本子节点
- Array:创建元素子节点(VNODE)
Vue.component('child-5', {
render: function (createElement) {
return createElement('div',[ //:array创建元素节点
createElement('span','Hello world!') //string:创建文本节点
])
}
})
this.$slots(插槽)在render函数中的应用
第三个参数的数组存的是VNODE
<child>
<h3 slot="header">标题</h3>
<p>第一段</p>
<p>第二段</p>
<h5 slot="footer">结尾</h5>
</child>
Vue.component('child', {
render: function (createElement) {
var header = this.$slots.header; //返回的内容就是含有VNODE的数组
var main = this.$slots.default;
var footer = this.$slots.footer;
return createElement('div',[
createElement('header',header),//返回的内容就是VNODE
createElement('main',main),
createElement('footer',footer)
])
}
})
在rander函数中使用props传递数据
在render函数中,props传递过来的数据,可以用this.绑定的数据直接在render函数中使用.
<div id="app">
<child :color="colorchange"></child>
<button @click="clickMe">换色</button>
</div>
<script>
Vue.component('child', {
props:['color'],
render: function (createElement) {
var color
if(this.color){
color = 'red'
}else{
color = 'blue'
}
return createElement('div',{
style:{
color:color
}
},'hello world!')
}
})
var app6 = new Vue({
el: '#app',
data: {
colorchange:false
},
methods:{
clickMe:function(){
this.colorchange = !this.colorchange
}
}
})
</script>
v-model在render函数中的使用
<div id="app">
<comp v-model="name"></comp>
{{name}}
</div>
<script>
Vue.component('comp',{
render:function(createElement){
var _this = this;
return createElement('input',{
domProps:{
value:_this.name
},
on:{
input:function(e){
_this.$emit('input',e.target.value)
}
}
})
}
})
var app = new Vue({
el:'#app',
data:{
name:''
}
})
</script>
作用域插槽在render函数中的使用
函数化组件的应用
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!