详解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 相关文章推荐
XP折叠菜单&amp;仿QQ2006菜单
Dec 16 Javascript
比较详细的javascript对象的property和prototype是什么一种关系
Aug 06 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
Nov 17 Javascript
JavaScript中的anchor()方法使用详解
Jun 08 Javascript
JavaScript中获取HTML元素值的三种方法
Jun 20 Javascript
JS实现双击内容变为可编辑状态
Mar 03 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
Oct 30 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开发过程中常用函数收藏
2009/12/14 PHP
深入分析php之面向对象
2013/05/15 PHP
Symfony查询方法实例小结
2017/06/28 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
解决laravel session失效的问题
2019/10/14 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
Linux上比较文件的命令都有哪些
2012/02/24 面试题
优秀应届生推荐信
2013/11/09 职场文书
十佳护士获奖感言
2014/02/18 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
追悼会主持词
2014/03/20 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
硕士论文致谢范文
2015/05/14 职场文书