漸進式的理解和使用Render
<!-- <template>
<div class="container">
<h1>1</h1>
</div>
</template> -->
<!-- 這里就不需要上面的 模板方式,直接通過render函數來生成組件 --->
<script>
export default {
data () {
return {
}
},
components: {
},
render(createElement){
//第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素
return createElement('h1',{},'Hello Render')
}
}
</script>
<style scoped>
</style>
render的內容1:
render(createElement){ //加點變化 let obj = { style:"color:#CCCCCC;border:1px solid red", } //第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素 return createElement('h1',obj,'Hello Render') }
render的內容2:
props:{ tag:String //假設傳遞一個 h2 }, render(createElement){ //第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素 return createElement(this.tag,{},'Hello Render') }
調用的是時候

效果:


render內容3:
<!-- <template> <div class="container"> <h1>1</h1> </div> </template> --> <!-- 這里就不需要上面的 模板方式,直接通過render函數來生成組件 ---> <script> export default { data () { return { people:['蓋倫','韓信','慌子'] } }, props:{ tag:String //假設傳遞一個 ul的例子 }, render(createElement){ //第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素 return createElement(this.tag,{},this.people.map(name=>createElement('li',{},`${name}`))) } } </script> <style scoped> </style>
頁面調用

效果好的不行

render內容4:第二個參數加內容
<!-- <template> <div class="container"> <h1>1</h1> </div> </template> --> <!-- 這里就不需要上面的 模板方式,直接通過render函數來生成組件 ---> <script> export default { data () { return { people:['蓋倫','韓信','慌子'] } }, props:{ tag:String //假設傳遞一個 ul的例子 }, render(createElement){ //第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素 return createElement(this.tag,{},this.people.map(name=>createElement('li',{attrs:{class:'Te'},on:{ click:()=>{ console.log(`${name}被點擊!!!`); } }},`${name}`))) } } </script> <style scoped> .Te{ color: red; } </style>
效果
樣式和點擊事件都被加上了

render內容5:render第一個參數除了標簽,還可以是一個組件
Test.vue組件內容
<template> <div>傳過來的內容 → {{msg}}</div> </template> <script> export default { props:{ msg:String }, data () { return { } }, } </script>
使用組件的內容
<script> import Test from './Test.vue' export default { render(createElement){ //第一個參數:可傳標簽/組件名,第二個參數:選項,第三個子元素 return createElement(Test,{props:{ msg:'Hello 幽冥狂_七' }}) } } </script> <style scoped> .Te{ color: red; } </style>
效果如何:

Render內容6:Render的妙用
AnchoredHeading.vue 文件內容
<!-- <template> <h1> <a href="#hello-youmingkuang">你好,幽冥狂_七</a> </h1> </template> --> <script> export default { props:{ level:Number }, name:"AnchoredHeading", render(createElemenet){ return createElemenet('h'+this.level,{attrs:{ href:'#hello-youmingkuang' }},'你好,幽冥狂_七') } } </script> <style scoped> </style>

效果圖

這些有點過於繁瑣,能不能在優化一下,看下面
新建一個 `AnchoredHeading.js` 文件
export default{ props:{ level:Number }, render(h){ //h 就是createElement return h('h'+this.level,this.$slots.default) //this.$slots.default 存放slot的值 } }
引用 js 文件

效果

