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得到iframe src属性值的方法
Sep 25 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
Bootstrap框架的学习教程详解(二)
Oct 18 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
纯JS实现只能输入数字的简单代码
Jun 21 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
JavaScript点击按钮生成4位随机验证码
Jan 28 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
一个基于PDO的数据库操作类
2011/03/24 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JavaScript更改class和id的方法
2008/10/10 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
全面理解闭包机制
2016/07/11 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
从vue源码看props的用法
2019/01/09 Javascript
vue多次循环操作示例
2019/02/08 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
质检部职责
2013/12/28 职场文书
七年级音乐教学反思
2014/01/26 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
卫生巾广告词
2014/03/18 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS