详解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中的new的使用方法与注意事项
May 16 Javascript
JS鼠标事件大全 推荐收藏
Nov 01 Javascript
ajax的hide隐藏问题解决方法
Dec 11 Javascript
javascript 回到顶部效果的实现代码
Feb 17 Javascript
javascript拖拽应用实例(二)
Mar 25 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
基于Marquee.js插件实现的跑马灯效果示例
Jan 25 Javascript
vue项目中api接口管理总结
Apr 20 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
微信小程序开发之转发分享功能
Oct 22 Javascript
React Ant Design树形表格的复杂增删改操作
Nov 02 Javascript
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
谈谈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类与对象中的private访问控制的疑问
2012/11/01 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
JavaScript DOM基础
2015/04/13 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
angular2使用简单介绍
2016/03/01 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
python调用API实现智能回复机器人
2018/04/10 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
护士自我鉴定
2013/10/23 职场文书
毕业生自荐书
2013/12/18 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2015年试用期工作总结
2014/12/12 职场文书
MySQL中的隐藏列的具体查看
2021/09/04 MySQL