详解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 相关文章推荐
许愿墙中用到的函数
Oct 07 Javascript
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
Javascript根据指定下标或对象删除数组元素
Dec 21 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
jQuery实现页面顶部下拉广告
Dec 30 Javascript
基于Vue实现图书管理功能
Oct 17 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
mock.js模拟数据实现前后端分离
Jul 24 Javascript
Vue页面刷新记住页面状态的实现
Dec 27 Javascript
在Vue中获取自定义属性方法:data-id的实例
Sep 09 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
php 中include()与require()的对比
2006/10/09 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
python学生管理系统开发
2019/01/30 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
python十进制转二进制的详解
2020/02/07 Python
详解Python 循环嵌套
2020/07/09 Python
Python 在函数上添加包装器
2020/07/28 Python
美国牛仔品牌:True Religion
2018/11/16 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
四风问题自查报告剖析材料
2014/02/08 职场文书
对祖国的寄语大全
2014/04/11 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
活动总结格式
2014/08/30 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
检察院起诉意见书
2015/05/20 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
公司仓库管理制度
2015/08/04 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL