(1)什么是Render函数

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

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

<div id="app">
<app-demo :level="level" title="特性">
特性{{level}}
</app-demo>
</div>
<script>
Vue.component('app-demo',{
template:`
<div>
<h1 v-if="level === 1">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h1>
<h2 v-if="level === 2">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h2>
<h3 v-if="level === 3">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h3>
<h4 v-if="level === 4">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h4>
<h5 v-if="level === 5">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h5>
<h6 v-if="level === 6">
<a :href=" '#' + title ">
<slot></slot>
</a>
</h6>
</div>
`,
props:{
level:{
type:Number,
require:true
},
title:{
type:String,
default:''
}
}
});
var app = new Vue({
el:'#app',
data:{
level:
}
});
</script>

效果:

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

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

<div id="app">
<app-demo :level="level" title="特性">
特性{{level}}
</app-demo>
</div>
<script>
Vue.component('app-demo',{
props:{
level:{
type:Number,
require:true
},
title:{
type:String,
default:''
}
},
render(createElement){
return createElement(
'h'+this.level,
[
createElement(
'a',{
domProps:{
href:'#'+this.title
}
},
this.$slots.default
)
]
)
}
});
var app = new Vue({
el:'#app',
data:{
level:
}
});
</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写法为

<div id="app">
<ele></ele>
</div>
<script>
Vue.component('ele',{
template:`
<div id="element" v-bind:class="{show:show}" v-on:click="handleClick">
文本内容
</div>
`,
data(){
return {
show:true
}
},
methods:{
handleClick:function(){
console.log('您点击了')
}
}
});
var app = new Vue({
el:'#app'
});
</script>

使用Render改写后的代码为

<div id="app">
<ele></ele>
</div>
<script>
Vue.component('ele',{
/*
template:`
<div id="element" v-bind:class="{show:show}" v-on:click="handleClick">
文本内容
</div>
`,
*/
render:function(createElement){
return createElement(
'div',/* 第一个参数是必选的,可以是HTML标签、组件、函数*/
{
/*第二个是可选的数据对象,在template使用*/
/*1、动态绑定class,等价于:class*/
class:{
'show':this.show
},
/* 2、普通HTML特性 */
attrs:{
id:'element'
},
/* 3、给div绑定click点击事件 */
on:{
click:this.handleClick
}
},
'文本内容'/*第三个是子节点,也是可选参数*/
)
},
data(){
return {
show:true
}
},
methods:{
handleClick:function(){
console.log('您点击了')
}
}
});
var app = new Vue({
el:'#app'
});
</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. HTML与JSP页面的区别

    HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和JavaScript一样解释性语言,为什么说是解释性 语言呢?因为,只要你有一个浏览器那么它就可以正常显示出 ...

  2. facebook Presto SQL分析引擎——本质上和spark无异,分解stage,task,MR计算

    Presto 是由 Facebook 开源的大数据分布式 SQL 查询引擎,适用于交互式分析查询,可支持众多的数据源,包括 HDFS,RDBMS,KAFKA 等,而且提供了非常友好的接口开发数据源连接 ...

  3. charCode 表示空格 实现中文对齐

    字符以及HTML实体 描述以及说明     这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个).要使用html实体表示才可累 ...

  4. html title属性

    <table class="table table-hover table-striped"> @foreach (var article in Model) { &l ...

  5. springMVC实现基本文件夹压缩下载功能

    将文件夹压缩后下载: @Slf4j public class Test { private static final String BASE_PATH = "/root/doc/" ...

  6. webpack 4.0 相关

    Webpack 4.0发布了!! https://www.jianshu.com/p/3a13f1b37300 webpack详解 https://juejin.im/post/5aa3d2056fb ...

  7. 三步升级已安装的 Android SDK 和 ADT 插件(转载)

    转载:http://www.tfan.org/update-adt-and-android-sdk-in-five-minutes/ 如何快速地把已安装的 Android SDK 及 Eclipse ...

  8. ssi,服务器端包含,<include file="">

    一.什么是SSI ssi,全称Server Side Include,中文名,服务器端包含. SSI (Server Side Includes)是HTML页面中的指令,在页面被提供时由服务器进行运算 ...

  9. HDU3092:Least common multiple(素数筛选+完全背包)

    题意 给出\(n\)和\(m\),将\(n\)拆成任意个数,求它们的最大的\(lcm\) 分析 1.可以证明\(n=p1^{s1}*p2^{s2}*...*pn^{sn}\)时\(lcm\)最大(其中 ...

  10. 在Visual studio 中解除 TFS 的账号绑定

    在Visual Studio中, 只要使用了TFS, 就会要求输入用户名密码验证 . 但是一旦点击验证对话框下部的:记住用户名密码 以后都不能再修改用户名了. 而且重装Visual Studio 听说 ...