详解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 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
js类 from qq
Nov 13 Javascript
Javascript 陷阱 window全局对象
Nov 26 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
jQuery 关于伪类选择符的使用说明
Apr 24 Javascript
js出生日期 年月日级联菜单示例代码
Jan 10 Javascript
跟我学习javascript的浮点数精度
Nov 16 Javascript
一些实用性较高的js方法
Apr 19 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
vue更改数组中的值实例代码详解
Feb 07 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
移动节点的jquery代码
2014/01/13 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python中hashlib模块用法示例
2017/10/30 Python
django中send_mail功能实现详解
2018/02/06 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
教师自我评价范文
2013/12/16 职场文书
导游实习生自荐书
2014/01/28 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
驳回起诉裁定书
2015/05/19 职场文书
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
Python使用DFA算法过滤内容敏感词
2022/04/22 Python