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 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
js简单实现让文本框内容逐个字的显示出来
Oct 22 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
浅谈JavaScript中运算符的优先级
Jul 07 Javascript
用js编写的简单的计算器代码程序
Aug 04 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
Jan 05 Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
js利用拖放实现添加删除
Aug 27 Javascript
一文了解JavaScript用Element Traversal新属性遍历子元素
Nov 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
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
再探JavaScript作用域
2014/09/24 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python表格存取的方法
2018/03/07 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python实现各种插值法(数值分析)
2019/07/30 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
争先创优个人总结
2015/03/04 职场文书
银行实习推荐信
2015/03/27 职场文书