详解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 相关文章推荐
php图像生成函数之间的区别分析
Dec 06 Javascript
分享10个原生JavaScript技巧
Apr 20 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
Aug 17 Javascript
jQuery实现下滑菜单导航效果代码
Aug 25 Javascript
在IE8上JS实现combobox支持拼音检索功能
May 23 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
Aug 03 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
Feb 18 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
JS回调函数 callback的理解与使用案例分析
Sep 09 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 Javascript
原生JS实现音乐播放器
Jan 26 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 strtotime函数详解
2009/12/18 PHP
php session安全问题分析
2011/06/24 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python安装模块的常见问题及解决方法
2018/02/05 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
Python插件机制实现详解
2020/05/04 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
白酒营销策划方案
2014/08/17 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
Moment的feature导致线上bug解决分析
2022/09/23 Javascript