【Vue】彻底理解Vue中render函数与template的区别

一、render函数与template对比

VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数。

以下我们来做一个需求跟根据level等级来编写对应等级的标题

template解析

<body>   <divid="app">       <h-titlelevel=1>           <p>li</p>       </h-title>       <h-titlelevel=2>           <p>li</p>       </h-title>   </div></body>

</html><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script>//在这里玩们需要通过v-if来进行判断   Vue.component("h-title", {       template: `<div>           <h1 v-if="level==1"><slot></slot></h1>           <h2 v-else-if="level==2"><slot></slot></h2>       </div>`,       props: {           level: {               type: Number,               required: true          }      }  })

   letvm=newVue({       el: "#app"  })</script>

render解析

<body>   <divid="app">       <h-titlelevel=1>           <p>Alley</p>       </h-title>       <h-titlelevel=2>           <p>Alley</p>       </h-title>   </div></body>

</html><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script>   Vue.component("h-title", {       render:function(createElement){           returncreateElement(               "h"+this.level,               this.$slots.default          )      },       props: {           level: {               type: Number,               required: true          }      }  })

   letvm=newVue({       el: "#app"  })</script>

二者对比我们不难看出render函数创建组件的方式更加的灵活,同时也能让我们最大的发挥出JavaScript的编程能力

二、render函数详解

Vue中的Render函数中有一个参数,这个参数是一个函数通常我们叫做h。其实这个h叫做createElement。Render函数将createElement的返回值放到了HTML中

createElement这个函数中有3个参数

  • 第一个参数(必要参数):主要用于提供DOM的html内容,类型可以是字符串、对象或函数
  • 第二个参数(类型是对象,可选):用于设置这个DOM的一些样式、属性、传的组件的参数、绑定事件之类
  • 第三个参数(类型是数组,数组元素类型是VNode,可选):主要是指该结点下还有其他结点,用于设置分发的内容,包括新增的其他组件。注意,组件树中的所有VNode必须是唯一的
// @return {VNode}createElement( // {String | Object | Function} // 一个HTML标签字符串,组件选项对象,或者一个返回值类型为String/Object的函数。该参数是必须的 ‘div‘,

 // {Object} // 一个包含模板相关属性的数据对象,这样我们可以在template中使用这些属性,该参数是可选的。{     attrs: {        name: headingId,        href: ‘#‘+headingId    },     style: {        color: ‘red‘,        fontSize: ‘20px‘    },     ‘class‘: {        foo: true,        bar: false      },      // DOM属性      domProps: {         innerHTML: ‘baz‘      },      // 组件props       props: {          myProp: ‘bar‘      },       // 事件监听基于 ‘on‘       // 所以不再支持如 ‘v-on:keyup.enter‘ 修饰语       // 需要手动匹配 KeyCode         on: {           click: function(event) {                event.preventDefault();                console.log(111);          }        }  }

 // {String | Array} // 子节点(VNodes)由 createElement() 构建而成。可选参数 // 或简单的使用字符串来生成的 "文本节点"。[   ‘xxxx‘,   createElement(‘h1‘, ‘一则头条‘),   createElement(MyComponent, {     props: {       someProp: ‘xxx‘    }  }),   this.$slots.default])

三、什么时候用render函数?

假设我们要封装一套按钮组件,按钮有四个样式(success、error、warning、default)。首先,你可能会想到如下实现

<template><divclass="btn btn-success"v-if="type === ‘success‘">{{ text }}</div><divclass="btn btn-danger"v-else-if="type === ‘danger‘">{{ text }}</div><divclass="btn btn-warning"v-else-if="type === ‘warning‘">{{ text }}</div></template>

虽然我们这样实现没有问题,但是如果现在有十几个样式的情况下我们就需要写N多个判断,如果遇到了这种情况我们就可以选择使用render函数。

其实简单的来说就是template适合简单的组件封装,然后render函数适合复杂的组件封装

<script>Vue.component("A-button", {       props: {           type: {               type: String,               default: ‘default‘          },           text: {               type: String,               default: ‘按钮‘          }      },       computed: {           tag() {               switch(this.type) {                   case‘success‘:                       return1;                   case‘danger‘:                       return2;                   case‘warning‘:                       return3;                   default:                       return1;              }          }      },       render(h) {           returnh(‘div‘, {               class: {                   btn: true,                   ‘btn-success‘: this.type===‘success‘,                   ‘btn-danger‘: this.type===‘danger‘,                   ‘btn-warning‘: this.type===‘warning‘              },               domProps: {                   //innerText: this.text,              },               on: {                   click: this.handleClick              }          },           this.$slots.default          );      },       methods: {           handleClick() {               console.log(‘-----------------------‘);               console.log(‘li‘);          }      }  })

   letvm=newVue({       el: "#app"  })</script>

四、template与render函数对比

相同之处:

render 函数template 一样都是创建 html 模板

不同之处:

  • Template适合逻辑简单,render适合复杂逻辑。
  • 使用者template理解起来相对容易,但灵活性不足;自定义render函数灵活性高,但对使用者要求较高。
  • render的性能较高,template性能较低。这一点我们可以看一下,下图中vue组件渲染的流程图可知。
  • 基于上一点,我们通过vue组件渲染流程图知道,使用render函数渲染没有编译过程,相当于使用者直接将代码给程序。所以,使用它对使用者要求高,且易出现错误
  • Render 函数的优先级要比template的级别要高,但是要注意的是Mustache(双花括号)语法就不能再次使用

原文地址:https://www.cnblogs.com/liqiang666/p/12175465.html

时间: 2024-11-09 00:31:08

【Vue】彻底理解Vue中render函数与template的区别的相关文章

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

本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. <h1> <a name="hello-world" href="#hello-world"> Hello world! </a> </h1>

vue中render函数的使用

render函数 vue通过 template 来创建你的 HTML.但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力.此时,需要用render来创建HTML. 什么情况下适合使用render函数 在一次封装一套通用按钮组件的工作中,按钮有四个样式(success.error.warning.default).首先,你可能会想到如下实现 <div class="btn btn-success" v-if="type === 'success'&qu

Vue系列---理解Vue.nextTick使用及源码分析(五)

_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DOM操作. 三. Vue.nextTick的调用方式如下: 四:vm.$nextTick 与 setTimeout 的区别是什么? 五:理解 MutationObserver 六:nextTick源码分析 回到顶部 一. 什么是Vue.nextTick()? 官方文档解释为:在下次DOM更新循环结束之

理解JavaScript中回调函数的使用

首先要理解function 对象,在JavaScript中function和array object,number一样作为一个对象,因此function也可以像普通对象一样可以作为一个参数传递个另一个函数; function parentF(callback){//callback可以任意定义名称,它只是个参数,此时并不能确定callback的类型(是number,object,function都不确定) var a=1; var b=2;  console.log("parent")

结合windows消息系统理解C#中WndProc函数和DefWndProc函数

Windows消息系统由3部分组成: 1.消息队列.Windows应用程序的消息是由Windows统一在一个消息队列中管理的. 2.消息循环.应用程序从Windows消息队列中获得自己的消息,并将其分配给窗体函数进行处理. 3.窗口过程.负责处理接收到的消息,每个窗口都有对应的窗口过程,负责截获消息并响应.WndProc是窗口过程函数,负责处理接收到的消息,在我们写代码时,不会注意到有这个函数,这是因为开发环境自动为我们生成了.WndProc函数通过switch...case...判断并处理消息

React中render函数中变量map中事件无法关联的解决办法

如下所示的代码,Input的checkbox可以正常显示3个,但是都无法和 handleChange关联上. 由于代码无法正常显示,我用图片 var Input = ReactBootstrap.Input; var TestCom = React.createClass({ getInitialState: function() { return {value: 'Hello!', value2: 'nihao2' }; }, handleChange: function(event) { v

深入理解JavaScript中的函数操作

匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数. 简单的举个例子如下: window.onload = function() { alert('hello'); } var templateObj = { shout:function() { alert('作为方法的匿名函数') } } templateObj.shout(); setTimeout(

深入理解Javascript中构造函数和原型对象的区别

在 Javascript中prototype属性的详解 这篇文章中,详细介绍了构造函数的缺点以及原型(prototype),原型链(prototype chain),构造函数(constructor),instanceof运算符的一些特点.如果对prototype和构造函数不熟悉,可以前往Javascript中prototype属性的详解 和 Javascript 中构造函数与new命令的密切关系 仔细的品味品味.先来做一个简单的回顾. 首先,我们知道,构造函数是生成对象的模板,一个构造函数可以

理解Java中字符流与字节流的区别

1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流.InputStre