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魔力之$(&quot;tagName&quot;)与selector
Mar 05 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
Feb 04 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
Apr 02 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
使用javascript插入样式
Mar 14 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
Angular2使用Angular CLI快速搭建工程(一)
May 21 Javascript
Vue2.0 事件的广播与接收(观察者模式)
Mar 14 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
ES6 Promise对象的含义和基本用法分析
Jun 14 Javascript
Preload基础使用方法详解
Feb 03 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漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python config文件的读写操作示例
2019/09/27 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
测绘工程专业个人自我评价
2013/12/01 职场文书
高三语文教学反思
2014/01/15 职场文书
房地产财务管理制度
2014/02/02 职场文书
交通事故协议书
2014/04/15 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
三好学生个人总结
2015/02/15 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python