详解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 相关文章推荐
可以用来调试JavaScript错误的解决方案
Aug 07 Javascript
js 剪切板应用clipboardData详细解析
Dec 17 Javascript
PHP开发者必须掌握的6个关键字
Apr 14 Javascript
jquery实现搜索框常见效果的方法
Jan 22 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
JS中的==运算: [''] == false —&gt;true
Jul 24 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
vue中v-model的应用及使用详解
Jun 27 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 jQuery
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 Javascript
JavaScript中的类型检查
Feb 03 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
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
为Python程序添加图形化界面的教程
2015/04/29 Python
python万年历实现代码 含运行结果
2017/05/20 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python实现括号匹配方法详解
2020/02/10 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
法学毕业生自我鉴定
2013/11/08 职场文书
小学语文教学反思
2014/02/10 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
个人租房协议书
2014/11/28 职场文书
教师党员承诺书2015
2015/01/21 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
《春酒》教学反思
2016/02/22 职场文书
新员工入职感言范文!
2019/07/04 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS