详解vue渲染函数render的使用


Posted in Javascript onDecember 12, 2017

1.什么是render函数?

vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。

比如如下我想要实现如下html:

<div id="container">
 <h1>
  <a href="#" rel="external nofollow" rel="external nofollow" >
   Hello world!
  </a>
 </h1>
</div>

我们会如下使用:

<!DOCTYPE html>
<html>
 <head>
  <title>演示Vue</title>
  <style>
   
  </style>
 </head>
 <body>
  <div id="container">
   <tb-heading :level="1">
    <a href="#" rel="external nofollow" rel="external nofollow" >Hello world!</a>
   </tb-heading>
  </div>
 </body>
 <script src="./vue.js"></script>

 <script type="text/x-template" id="templateId">
  <h1 v-if="level === 1">
   <slot></slot>
  </h1>
  <h2 v-else-if="level === 2">
   <slot></slot>
  </h2>
 </script>
 <script>
  Vue.component('tb-heading', {
   template: '#templateId',
   props: {
    level: {
     type: Number,
     required: true
    }
   }
  });
  new Vue({
   el: '#container'
  });
 </script>
</html>

 2.例:

遇到的问题:

在工作中,我创建了一个button组件,又创建了一个button-group组件

button组件较为简单,就是一个可以输入type/size/icon等属性的button

详解vue渲染函数render的使用

此为渲染后结果。

然后,创建button-group组件,目标结果为

详解vue渲染函数render的使用

此处,不仅要在最外层包裹一层div,还要在每个button组件外层包裹一层p标签。此处,就需要使用render函数了。

既然有了render函数,就不再需要template标签了,vue文件中只需要script标签(该组件style是全局的)

button-group.vue如下

<script>
 export default {
  name: "XButtonGroup",
  props: {
   compact: { //自定义的button-group属性,影响其classname
    type: Boolean,
    default: true
   }
  },
  render(createElement) {
   //此处创建element
  },
  computed: {
   groupClass() {
    const className = ["field"];  //通过计算属性监听compact属性传入className
    className.push(this.compact ? "has-addons" : "is-grouped");
    return className;
   }
  }
 };
</script>

接下来就要看render函数了。

render函数中的createElement方法有三个参数。第一个参数为外层标签名,第二个为外层标签的属性对象,第三个为外层标签中的内容

所以第一步

render(createElement) {
   return createElement(
    'div', {
     class: this.groupClass
    }, '内容',
   )
  }

渲染结果:

详解vue渲染函数render的使用

那怎样在外层div中渲染button组件呢?

render函数的第三个参数除了字符串,还可以传入VNode的数组。VNode就是vue中的节点。

此处,我们通过this.$slots.default获取所有插入到button-group组件内默认slot的button节点

render(createElement) {
   return createElement(
    'div', {
     class: this.groupClass
    }, this.$slots.default,
   )
  },

渲染结果:

 详解vue渲染函数render的使用

button已经正确渲染到了外层div中。但是怎么在每个button外层包裹一层元素呢。createElement会创建新的VNode,而render函数第三个参数需要VNode数组,所以我们需要传入一个由createElement返回值组成的数组。

render(createElement) {
   //遍历每一个VNode,用createElement函数在外层包裹class为control的p标签,组成新的VNode数组
   const arry = this.$slots.default.map(VNode => {
    return createElement('p', {
     class: 'control'
    }, [VNode])
   })
   return createElement(
    'div', {
     class: this.groupClass
    }, arry,
   )
  },

渲染结果:

 详解vue渲染函数render的使用

并且根据button-group的compact属性可以切换不同的class,生成不同的效果

<x-button-group :compact="true">
  <x-button v-for="(item,index) in buttonType" :key="index" :type="item">{{item}}</x-button>
</x-button-group>
<x-button-group :compact="false">
  <x-button v-for="(item,index) in buttonType" :key="index" :type="item">{{item}}</x-button>
</x-button-group>

详解vue渲染函数render的使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
window.onbeforeunload方法在IE下无法正常工作的解决办法
Jan 23 Javascript
js获取ajax返回值代码
Apr 30 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
Jul 25 Javascript
AngularJS入门教程之双向绑定详解
Aug 18 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
JS实现异步上传压缩图片
Apr 22 Javascript
JS解决position:sticky的兼容性问题的方法
Oct 17 Javascript
vue中 v-for循环的用法详解
Feb 19 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
谈谈vue中mixin的一点理解
Dec 12 #Javascript
Vue集成Iframe页面的方法示例
Dec 12 #Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 #Javascript
Vue调试神器vue-devtools安装方法
Dec 12 #Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
Dec 12 #Javascript
javascript实现循环广告条效果
Dec 12 #Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
Dec 12 #Javascript
You might like
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
桌面中心(二)数据库写入
2006/10/09 PHP
php实现的CSS更新类实例
2014/09/22 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
vue 粒子特效的示例代码
2017/09/19 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Python判断变量是否已经定义的方法
2014/08/18 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
python之mock模块基本使用方法详解
2019/06/27 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
Python partial函数原理及用法解析
2019/12/11 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
python Matplotlib模块的使用
2020/09/16 Python
python实现简单遗传算法
2020/09/18 Python
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
4s店市场专员岗位职责
2014/04/09 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
小学生安全演讲稿
2014/04/25 职场文书
大学自主招生推荐信
2014/05/10 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
2015年党总支工作总结
2015/05/25 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
整理Python中常用的conda命令操作
2021/06/15 Python