详解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 相关文章推荐
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
javascript实现别踩白块儿小游戏程序
Nov 22 Javascript
轻松掌握JavaScript享元模式
Aug 27 Javascript
bootstrap table动态加载数据示例代码
Mar 25 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
VsCode插件整理(小结)
Sep 14 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
Aug 27 Javascript
vue如何使用async、await实现同步请求
Dec 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
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
简单谈谈favicon
2015/06/10 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python在控制台输出进度条的方法
2015/06/20 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
python和shell获取文本内容的方法
2018/06/05 Python
实例讲解Python爬取网页数据
2018/07/08 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
python实现图片识别汽车功能
2018/11/30 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
Linux的文件类型
2012/03/07 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
单位创先争优活动方案
2014/01/26 职场文书
提拔干部考察材料
2014/05/26 职场文书
自我管理的活动方案
2014/08/25 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
SQL Server Agent 服务无法启动
2022/04/20 SQL Server