绝大多数情况下使用template来构建html,Render函数用来满足特点情况下完全使用JavaScript来编程
在遇到写类似的组件的时候需要写很多很长的代码,出于简洁(懒惰使人进步)的角度来说,我们应该找到更合适的方法来实现该效果。
- <body>
- <div id="app">
- <mycomment :level="2">
- 这是h2元素
- </mycomment>
- </div>
- </body>
- <script type="text/x-template" id="is">
- <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>
- <h4 v-if="level === 4">
- <slot></slot>
- </h4>
- <h5 v-if="level === 5">
- <slot></slot>
- </h5>
- <h6 v-if="level === 6">
- <slot></slot>
- </h6>
- </div>
- </script>
- <script>
- Vue.component('mycomment',{
- template:'#is',
- props:{
- level:{
- type:Number,
- required:true,
- }
- }
- })
- var app =new Vue({
- el:'#app',
- })
-
-
- </script>
这时候Render 函数就很好的解决了这个问题,先来简单一点额例子,算是有基本的骨架了
- <body>
- <div id="app">
- <render-teample :level="4">
- render function
-
- </render-teample>
- </div>
-
- </body>
- <script>
- Vue.component('render-teample',{
- render:function(createElement){
- return createElement(
- 'h'+this.level,
- this.$slots.default
- )
- },
- props: {
- level: {
- type: Number,
- required: true
- }
- }
-
-
- var app=new Vue({
- el:"#app",
-
- });
-
-
- </script>
然后进一步给你的组件加入你想要的样式需要事件,变得有血有肉
- <body>
- <div id="app">
- <render-teample :level="4" >
-
- <div class="jah" slot="myslot">render function</div>
- </render-teample>
- </div>
-
- </body>
- <script>
- Vue.component('render-teample',{
- render:function(createElement){
- return createElement(
- 'h'+this.level,
- {
- 'class':{
- show:true,
- hide:false,
- },
- style:{
- width:'200px',
- height:'400px',
- background:'red',
- },
- attrs:{
- name:'h-ex',
- id:'h-id'
- },
- props:{
- myprops:true,
- },
- on: {
- click: function(event){
- alert(this.num)
- }
- },
- nativeOn:{
- click:function(event) {
-
- alert(1111)
- }
- }
-
- },
- [
- this.$slots.myslot,
- createElement('div',{
- domProps:{
- innerHTML:'holle render'
- }
- })
- ]
-
- )
- },
- props: {
- level: {
- type: Number,
- required: true
- }
- }
- });
-
- var app=new Vue({
- el:"#app",
- data:{
- num:110
- }
-
- });
-
-
- </script>
注意:约束组件中 VNodes 必须是唯一的。
直接把所有元素写在一个createElement()下是很痛苦的,不利于维护。
所以通常会 var com1= createElement('p','item1');var com2= createElement('p','item1');
可以使用return createElement('div',[com1,com2])
这种情况是禁止的return createElement('div',[com1,com1])