(1)什么是Render函数

先来看一个场景,在博客网中,一般有一级标题、二级标题、三级标题...,为了方便分享url,它们都做成了锚点,点击后,会将内容加载网址后面,以#分隔。

例如‘特性’是一个<h2>标签,内容含有一个<a href='#特性'>#</a>的链接,点击后url便带有了锚点信息,别人打开时会直接聚焦到‘特性’所在的位置。如果将其封装成一个组件,一般写法会这样:

  1. <div id="app">
  2. <app-demo :level="level" title="特性">
  3. 特性{{level}}
  4. </app-demo>
  5. </div>
  6. <script>
  7. Vue.component('app-demo',{
  8. template:`
  9. <div>
  10. <h1 v-if="level === 1">
  11. <a :href=" '#' + title ">
  12. <slot></slot>
  13. </a>
  14. </h1>
  15. <h2 v-if="level === 2">
  16. <a :href=" '#' + title ">
  17. <slot></slot>
  18. </a>
  19. </h2>
  20. <h3 v-if="level === 3">
  21. <a :href=" '#' + title ">
  22. <slot></slot>
  23. </a>
  24. </h3>
  25. <h4 v-if="level === 4">
  26. <a :href=" '#' + title ">
  27. <slot></slot>
  28. </a>
  29. </h4>
  30. <h5 v-if="level === 5">
  31. <a :href=" '#' + title ">
  32. <slot></slot>
  33. </a>
  34. </h5>
  35. <h6 v-if="level === 6">
  36. <a :href=" '#' + title ">
  37. <slot></slot>
  38. </a>
  39. </h6>
  40. </div>
  41. `,
  42. props:{
  43. level:{
  44. type:Number,
  45. require:true
  46. },
  47. title:{
  48. type:String,
  49. default:''
  50. }
  51. }
  52. });
  53. var app = new Vue({
  54. el:'#app',
  55. data:{
  56. level:
  57. }
  58. });
  59. </script>

效果:

分析:这样写没有什么错误,只是缺点太明显,代码冗长,组件的template代码大多都是重复的,只是heading标题元素的级别不同,再者必须插入一个根元素<div>,这是组件的要求。

template写法在大多数时候很好用,但这里有些别扭。我们更像按照拼接字符串的形式来构造heading元素,比如"h"+this.leavel。在Render函数可以这样做。

  1. <div id="app">
  2. <app-demo :level="level" title="特性">
  3. 特性{{level}}
  4. </app-demo>
  5. </div>
  6. <script>
  7. Vue.component('app-demo',{
  8. props:{
  9. level:{
  10. type:Number,
  11. require:true
  12. },
  13. title:{
  14. type:String,
  15. default:''
  16. }
  17. },
  18. render(createElement){
  19. return createElement(
  20. 'h'+this.level,
  21. [
  22. createElement(
  23. 'a',{
  24. domProps:{
  25. href:'#'+this.title
  26. }
  27. },
  28. this.$slots.default
  29. )
  30. ]
  31. )
  32. }
  33. });
  34. var app = new Vue({
  35. el:'#app',
  36. data:{
  37. level:
  38. }
  39. });
  40. </script>

Render函数通过createElement参数来创建Virtual Dom虚拟Dom,结构精简了很多。

(2)CreateElement用法

①基本参数

CreateElement构成了Vue虚拟Dom的模板,它有3个参数:第一个参数是必选的,可以是HTML标签、组件、函数;第二个是可选的数据对象,在template使用;第三个是子节点,也是可选参数,用法一致。

以往在template里,我们都是在组件的标签上使用形容v-bind:class、v-bind:style额、v-on:click等这样的指令。到Render函数后,都将其写到了数据对象里,比如下面的组件,使用传统的template写法为

  1. <div id="app">
  2. <ele></ele>
  3. </div>
  4. <script>
  5. Vue.component('ele',{
  6. template:`
  7. <div id="element" v-bind:class="{show:show}" v-on:click="handleClick">
  8. 文本内容
  9. </div>
  10. `,
  11. data(){
  12. return {
  13. show:true
  14. }
  15. },
  16. methods:{
  17. handleClick:function(){
  18. console.log('您点击了')
  19. }
  20. }
  21. });
  22. var app = new Vue({
  23. el:'#app'
  24. });
  25. </script>

使用Render改写后的代码为

  1. <div id="app">
  2. <ele></ele>
  3. </div>
  4. <script>
  5. Vue.component('ele',{
  6. /*
  7. template:`
  8. <div id="element" v-bind:class="{show:show}" v-on:click="handleClick">
  9. 文本内容
  10. </div>
  11. `,
  12. */
  13. render:function(createElement){
  14. return createElement(
  15. 'div',/* 第一个参数是必选的,可以是HTML标签、组件、函数*/
  16. {
  17. /*第二个是可选的数据对象,在template使用*/
  18. /*1、动态绑定class,等价于:class*/
  19. class:{
  20. 'show':this.show
  21. },
  22. /* 2、普通HTML特性 */
  23. attrs:{
  24. id:'element'
  25. },
  26. /* 3、给div绑定click点击事件 */
  27. on:{
  28. click:this.handleClick
  29. }
  30. },
  31. '文本内容'/*第三个是子节点,也是可选参数*/
  32. )
  33. },
  34. data(){
  35. return {
  36. show:true
  37. }
  38. },
  39. methods:{
  40. handleClick:function(){
  41. console.log('您点击了')
  42. }
  43. }
  44. });
  45. var app = new Vue({
  46. el:'#app'
  47. });
  48. </script>

就此例来说,template写法比Render函数写法更加简洁,所以要适当使用Render,否则只会增加编码负担。

.

vue之Render函数的更多相关文章

  1. 终于搞懂了vue 的 render 函数(一) -_-|||

    终于搞懂了vue 的 render 函数(一) -_-|||:https://blog.csdn.net/sansan_7957/article/details/83014838 render: h ...

  2. 如何理解Vue的render函数

    第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> < ...

  3. vue 之 render 函数不能渲染非全局自定义函数-方案

    import customCom from 'xxx.vue' render: (h) => { return h(customCom) }

  4. 大白话Vue源码系列(03):生成render函数

    阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...

  5. 大白话Vue源码系列(04):生成render函数

    阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...

  6. Vue学习笔记进阶篇——Render函数

    基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template ...

  7. vue render函数

    基础 vue推荐在绝大多数情况下使用template来创建你的html.然而在一些场景中,你真的需要javascript的完全编程能力.这就是render函数.它比template更接近编译器 < ...

  8. [转]iview render函数常用总结(vue render函数)

    原文地址:https://blog.csdn.net/weixin_43206949/article/details/89385550 iview 的render函数就是vue的render函数ivi ...

  9. VUE3 之 render 函数的使用 - 这个系列的教程通俗易懂,适合新手

    1. 概述 老话说的好:不用想的太多.太远,做好当天的事,知道明天要做什么就可以了. 言归正传,今天我们来聊聊 VUE 中 render 函数的使用. 2. render 函数 2.1 一个简单的例子 ...

随机推荐

  1. 2018.10.20 XMYZ Day1总结

    上周的忘写了……题目没有作者…… T1.backpack 期望得分100,实际得分100. 感觉我自己真是不如以前了……以前做这种题都是秒掉的,现在怎么想了10分钟啊…… 因为物品的体积和价值都非常小 ...

  2. 最好的6个Go语言Web框架

    原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...

  3. Python基础第七天

    一.内容 二.练习 练习1 题目:编写函数,函数执行的时间是随机的 图示: 代码: import time import random def func(): s = 1 l = [] for i i ...

  4. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  5. HDU 4891 The Great Pan (题意题+模拟)

    题意:给定一个文章,问你有多少种读法,计算方法有两种,如果在$中,如果有多个空格就算n+1,如果是一个就算2的次方,如果在{}中, 那么就是把每个空格数乘起来. 析:直接模拟,每次计算一行,注意上一行 ...

  6. tar.xz格式文件的解压方法(转载)

    转自:http://bbs.chinaunix.net/thread-3610738-1-1.html 现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件 ...

  7. maven仓库错误

    1.jai_core 时间:2018年3月21日10:04:57 URL:https://mvnrepository.com/artifact/javax.media/jai_core/1.1.3 / ...

  8. 【原创】MapReduce备份Elasticsearch数据到HDFS(JAVA)

    一.环境:JAVA8,Elasticsearch-5.6.2,Hadoop-2.8.1二.实现功能:mapreduce读elasticsearch数据.输出parquet文件.多输出路径三.主要依赖 ...

  9. jsonp处理跨域

    什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”.而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略 ...

  10. python 闭包 Closure 函数作为返回值

    一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...