vue中render函数的使用详解


Posted in Javascript onOctober 12, 2018

render函数

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

render方法的实质就是生成template模板;

通过调用一个方法来生成,而这个方法是通过render方法的参数传递给他的;

通过这三个参数,可以生成一个完整的模板

官网实例

//未使用render函数
Vue.component('anchored-heading', {
 template: '#anchored-heading-template',
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})

//使用render函数
Vue.component('anchored-heading', {
 render: function (createElement) {
  return createElement(
   'h' + this.level,  // tag name 标签名称
   this.$slots.default // 子组件中的阵列
  )
 },
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})

说明

区别:

  • 没有显示的模板内容,而是通过render方法生成
  • 使用了createElement方法

createElement方法,通过render函数的参数传递进来,有三个参数:

  • 第一个参数(必要参数):主要用于提供DOM的html内容,类型可以是字符串、对象或函数
  • 第二个参数(类型是对象,可选):用于设置这个DOM的一些样式、属性、传的组件的参数、绑定事件之类
  • 第三个参数(类型是数组,数组元素类型是VNode,可选):主要是指该结点下还有其他结点,用于设置分发的内容,包括新增的其他组件。注意,组件树中的所有VNode必须是唯一的

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

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

<div class="btn btn-success" v-if="type === 'success'">{{ text }}</div>
 <div class="btn btn-danger" v-else-if="type === 'danger'">{{ text }}</div>
 <div class="btn btn-warning" v-else-if="type === 'warning'">{{ text }}</div>

这样写在按钮样式少的时候完全没有问题,但是试想,如果需要的按钮样式有十多个。那么template写死的方式就显得很无力了。遇上类似这样的情况,使用render函数可以说最优选择了。

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

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

export default {
 props: {
  type: {
   type: String,
   default: 'normal'
  },
  text: {
   type: String,
   default: 'normal'
  }
 },
 computed: {
  tag() {
   switch (this.type) {
    case 'success':
     return 1;
    case 'danger':
     return 2;
    case 'warning':
     return 3;
    default:
     return 1;
   }
  }
 },
 render(h) {
  return h('div', {
   class: {
    btn: true,
    'btn-success': this.type === 'success',
    'btn-danger': this.type === 'danger',
    'btn-warning': this.type === 'warning'
   },
   domProps: {
    innerText: this.text
   },
   on: {
    click: this.handleClick
   }
  });
 },
 methods: {
  handleClick() {
   console.log('-----------------------');
   console.log('do something');
  }
 }
};

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

然后在父组件调用

<Button type="danger" text="test"></Button>

使用jsx

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

render() {
  return (
   <div
    class={{
     btn: true,
     'btn-success': this.type === 'success',
     'btn-danger': this.type === 'danger',
     'btn-warning': this.type === 'warning'
    }}
    onClick={this.handleClick}>
    {this.text}
   </div>
  );
 },

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

Javascript 相关文章推荐
jQuery Selector选择器小结
May 06 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
Apr 09 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
jquery实现下拉框功能效果【实例代码】
May 06 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
jquery实现数字输入框
Feb 22 Javascript
node.js中实现kindEditor图片上传功能的方法教程
Apr 26 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
Dec 12 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
js实现3D旋转效果
Aug 18 Javascript
JS数组去重详情
Nov 07 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 #Javascript
Vue插值、表达式、分隔符、指令知识小结
Oct 12 #Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 #Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
Oct 12 #Javascript
开发用到的js封装方法(20种)
Oct 12 #Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 #Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 #Javascript
You might like
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python3 反射的四种基本方法解析
2019/08/26 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
Python识别html主要文本框过程解析
2020/02/18 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
django修改models重建数据库的操作
2020/03/31 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
关于赌博的检讨书
2014/01/24 职场文书
商铺租赁意向书
2014/04/01 职场文书
关键在于落实心得体会
2014/09/03 职场文书
python基础之函数的定义和调用
2021/10/24 Python
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL