Vue中render函数的使用方法


Posted in Javascript onJanuary 31, 2018

render函数

vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。

什么情况下适合使用render函数

在一次封装一套通用按钮组件的工作中,按钮有四个样式(default success error )。首先,你可能会想到如下实现

<div v-if="type === 'success'">success</div>
 <div v-else-if="type === 'error'">error</div>
 <div v-else-if="type === 'warm'">warm</div>
 <div v-else>default</div>

这样写在按钮样式少的时候完全没有问题,但是试想,如果需要的按钮样式有十多个,按钮内的文字根据实际情况而定(如success按钮内的文字可能是OK、GOOD等等)。那么template写死的方式就显得很无力了。遇上类似这样的情况,使用render函数可以说最优选择了。

根据实际情况改写按钮组件

首先render函数生成的内容相当于template的内容,故使用render函数时,在.vue文件中需要先把template标签去掉。只保留逻辑层。

export default {
 render(h) {
  return h('div',{
   'class': {
    btn: true,
    success: this.type === 'success',
    error: this.type === 'error',
    warm: this.type === 'warm',
    default: this.type === 'default'
   },
   domProps: {
    innerHTML: this.$slots.default[0].text
   },
   on: {
    click: this.clickHandle
   }
  })
 },
 methods: {
  clickHandle() {
   // dosomething
  }
 },
 props: {
  type: {
   type: String,
   default: 'default'
  },
  text: {
   type: String,
   default: 'default'
  }
 }
};

根据组件化思维,能抽象出来的东西绝不写死在逻辑上。这里的clickHandle函数可以根据按钮的type类型触发不同的逻辑,就不多叙述了。

然后在父组件调用

<btn
 v-for="(btn, index) in testData"
 :type="btn.type"
 :text="btn.text"
 :key="index">{{btn.text}}
</btn>

使用jsx

是的,要记住每个参数的类型同用法,按序传参实在是太麻烦了。那么其实可以用jsx来优化这个繁琐的过程。

return (
 <div
  class={{
   btn: true,
   success: this.type === 'success',
   error: this.type === 'error',
   warm: this.type === 'warm',
   default: this.type === 'default'
  }}
  onClick={this.clickHandle}>
  {this.$slots.default[0].text}
 </div>
)

示例二:

在遇到写类似的组件的时候需要写很多很长的代码,出于简洁(懒惰使人进步)的角度来说,我们应该找到更合适的方法来实现该效果。

<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])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js opener的使用详解
Jan 11 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
Nov 11 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
Mar 19 Javascript
Node.js连接mongodb实例代码
Jun 06 Javascript
jQuery常用选择器详解
Jul 17 jQuery
vue判断input输入内容全是空格的方法
Mar 02 Javascript
vue mounted组件的使用
Jun 18 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
vue中的过滤器实例代码详解
Jun 06 Javascript
在vue中动态添加class类进行显示隐藏实例
Nov 09 Javascript
详解JS函数防抖
Jun 05 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
Jan 31 #Javascript
微信小程序scroll-view组件实现滚动动画
Jan 31 #Javascript
微信小程序实现全国机场索引列表
Jan 31 #Javascript
微信小程序radio组件使用详解
Jan 31 #Javascript
微信小程序checkbox组件使用详解
Jan 31 #Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 #Javascript
浅析Angular19 自定义表单控件
Jan 31 #Javascript
You might like
php实现rc4加密算法代码
2012/04/25 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js 操作符汇总
2014/11/08 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
2019/02/21 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
Python实现字符串格式化的方法小结
2017/02/20 Python
Python实现针对中文排序的方法
2017/05/09 Python
python实现报表自动化详解
2017/11/16 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python 自定义装饰器实例详解
2019/07/20 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
电大毕业自我鉴定
2014/02/03 职场文书
十一酒店活动方案
2014/02/20 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
安全员岗位职责范本
2015/04/11 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers