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 相关文章推荐
符合标准的js表单提交的代码
Sep 13 Javascript
JavaScript 全角转半角部分
Oct 28 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
Oct 10 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
微信小程序如何获取用户信息
Jan 26 Javascript
layui问题之模拟select点击事件的实例讲解
Aug 15 Javascript
3分钟读懂移动端rem使用方法(推荐)
May 06 Javascript
移动端手指操控左右滑动的菜单
Sep 08 Javascript
node 解析图片二维码的内容代码实例
Sep 11 Javascript
iSlider手机端图片滑动切换插件使用详解
Dec 24 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 Javascript
react中props 的使用及进行限制的方法
Apr 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php的curl实现get和post的代码
2008/08/23 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
常用jQuery代码分享
2015/07/14 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
requireJS使用指南
2016/04/27 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Python 中迭代器与生成器实例详解
2017/03/29 Python
python最小生成树kruskal与prim算法详解
2019/01/17 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
Python json转字典字符方法实例解析
2020/04/13 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
Why do we need Unit test
2013/01/03 面试题
办加油卡单位介绍信
2014/01/09 职场文书
校园活动宣传方案
2014/03/28 职场文书
《穷人》教学反思
2014/04/08 职场文书
工作推荐信范文
2014/05/10 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
综治目标管理责任书
2015/05/11 职场文书