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 相关文章推荐
关于跨站脚本攻击问题
Dec 22 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
JS回调函数的应用简单实例
Sep 17 Javascript
JS实现弹性漂浮效果的广告代码
Sep 02 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
jQuery中animate的几种用法与注意事项
Dec 12 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
JS原型与原型链的深入理解
Feb 15 Javascript
JS仿JQuery选择器功能
Mar 08 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
前端MVVM框架解析之双向绑定
Jan 24 Javascript
原生javascript自定义input[type=radio]效果示例
Aug 27 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
VOLVO车载收音机
2021/03/02 无线电
php 注释规范
2012/03/29 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python读写LMDB文件的方法
2018/07/02 Python
详解Python sys.argv使用方法
2019/05/10 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
python中@contextmanager实例用法
2021/02/07 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
英语专业学子个人的自我评价
2013/10/02 职场文书
心得体会怎么写
2013/12/30 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
环保建议书作文500字
2015/09/14 职场文书
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
2021/03/29 PHP
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
MySQL 存储过程的优缺点分析
2021/05/20 MySQL