详解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 20 Javascript
js二级地域选择的实现方法
Jun 17 Javascript
jquery ui dialog实现弹窗特效的思路及代码
Aug 03 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
js实现上传图片预览方法
Oct 25 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
JS实现前端缓存的方法
Sep 21 Javascript
javascript的this关键字详解
May 20 Javascript
了解javascript中的Dom操作
May 27 Javascript
element跨分页操作选择详解
Jun 29 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生成扇形比例图实例
2013/11/06 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python使用matplotlib绘制柱状图教程
2017/02/08 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
django反向解析和正向解析的方式
2018/06/05 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
基于python检查矩阵计算结果
2020/05/21 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
马智宇结婚主持词
2014/04/01 职场文书
房屋租房协议书范本
2014/12/04 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
公司表扬信格式
2015/05/04 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
mysql全面解析json/数组
2022/07/07 MySQL