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 相关文章推荐
pjblog中的UBBCode.js
Apr 25 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
JavaScript实现twitter puddles算法实例
Dec 06 Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
基于Vue实现微信小程序的图文编辑器
Jul 25 Javascript
Vue.js的动态组件模板的实现
Nov 26 Javascript
vue本地打开build后生成的dist文件夹index.html问题
Sep 04 Javascript
vue单文件组件无法获取$refs的问题
Jun 24 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
PHP文件操作实例总结
2016/09/27 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
python 七种邮件内容发送方法实例
2014/04/22 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
Python最基本的输入输出详解
2015/04/25 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Python常用特殊方法实例总结
2019/03/22 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
Python netmiko模块的使用
2020/02/14 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
一份Java笔试题
2012/02/21 面试题
消防器材管理制度
2014/01/28 职场文书
表决心的诗句大全
2014/03/11 职场文书
企业金融服务方案
2014/06/03 职场文书
献爱心标语
2014/06/21 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书