(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. codeforces 447 A-E div2 补题

    A DZY Loves Hash 水题 #include<iostream> #include<cstdio> #include<cstdlib> #include ...

  2. 【BZOJ3625】【CF438E】小朋友和二叉树

    题目 传送门 思路&做法 我们可以用\(v_i\)表示\(i\)在\(c\)中出现了几次, 用\(f_i\)表示权值为\(i\)的神犇树的总数, 于是 \[ f_x = \sum_{i = 0 ...

  3. Go 使用自定义包(package)

    自定义包的分为两种: 1.同目录下的包: 2.不同目录下的包: *经测试,同目录下是不可以用不同包的文件的 同目录下的包: 不同文件中的变量和函数都可以直接访问 不同目录下的包: 1.把要在自定义包外 ...

  4. 557. 反转字符串中的单词 III

    给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出: &q ...

  5. [POI2008]CLO

    Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个t ...

  6. 数据结构之splay树

    https://www.bilibili.com/video/av19879546 https://blog.csdn.net/u014634338/article/details/42465089 ...

  7. hihoOffer收割练习20题目2

    题目2 : SCI表示法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示 ...

  8. Latex排版工具的使用(一) 分类: Latex 2014-06-14 22:52 448人阅读 评论(0) 收藏

    使用Latex可以排版出漂亮的论文,尤其适合对含有数学公式论文的排版. 下面编写第一Latex源文件,实现对两个数学公式的排版: 新建文件first.tex: \documentclass{artic ...

  9. 如何隐藏electron窗体的菜单栏

    electron中默认带有顶部菜单栏,有时候我们的应用不需要. 再main.js文件中设置 const electron = require('electron') const path = requ ...

  10. JDK常用类解读--StringBuffer、StringBuilder

    上一篇博客讲到String对象一旦被创建该内容就不能被修改了如: String s = "hello world"; s.substring(6); s.replace(" ...