详解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 相关文章推荐
打印json对象的内容及JSON.stringify函数应用
Mar 29 Javascript
javaScript如何生成xmlhttp
Dec 16 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
Jan 07 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
纯前端JavaScript实现Excel IO案例分享
Aug 26 Javascript
bootstrapfileinput实现文件自动上传
Nov 08 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
node.js中express-session配置项详解
May 31 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
详解使用React.memo()来优化函数组件的性能
Mar 19 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
深入解析php之apc
2013/05/15 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
php扩展开发入门demo示例
2019/09/23 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
小小的船教学反思
2014/02/21 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
小学教育见习总结
2015/06/23 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书