vue之Render函数
(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函数的更多相关文章
- 终于搞懂了vue 的 render 函数(一) -_-|||
终于搞懂了vue 的 render 函数(一) -_-|||:https://blog.csdn.net/sansan_7957/article/details/83014838 render: h ...
- 如何理解Vue的render函数
第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> < ...
- vue 之 render 函数不能渲染非全局自定义函数-方案
import customCom from 'xxx.vue' render: (h) => { return h(customCom) }
- 大白话Vue源码系列(03):生成render函数
阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...
- 大白话Vue源码系列(04):生成render函数
阅读目录 优化 AST 生成 render 函数 小结 本来以为 Vue 的编译器模块比较好欺负,结果发现并没有那么简单.每一种语法指令都要考虑到,处理起来相当复杂.上篇已经生成了 AST,本篇依然对 ...
- Vue学习笔记进阶篇——Render函数
基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template ...
- vue render函数
基础 vue推荐在绝大多数情况下使用template来创建你的html.然而在一些场景中,你真的需要javascript的完全编程能力.这就是render函数.它比template更接近编译器 < ...
- [转]iview render函数常用总结(vue render函数)
原文地址:https://blog.csdn.net/weixin_43206949/article/details/89385550 iview 的render函数就是vue的render函数ivi ...
- VUE3 之 render 函数的使用 - 这个系列的教程通俗易懂,适合新手
1. 概述 老话说的好:不用想的太多.太远,做好当天的事,知道明天要做什么就可以了. 言归正传,今天我们来聊聊 VUE 中 render 函数的使用. 2. render 函数 2.1 一个简单的例子 ...
随机推荐
- codeforces 447 A-E div2 补题
A DZY Loves Hash 水题 #include<iostream> #include<cstdio> #include<cstdlib> #include ...
- 【BZOJ3625】【CF438E】小朋友和二叉树
题目 传送门 思路&做法 我们可以用\(v_i\)表示\(i\)在\(c\)中出现了几次, 用\(f_i\)表示权值为\(i\)的神犇树的总数, 于是 \[ f_x = \sum_{i = 0 ...
- Go 使用自定义包(package)
自定义包的分为两种: 1.同目录下的包: 2.不同目录下的包: *经测试,同目录下是不可以用不同包的文件的 同目录下的包: 不同文件中的变量和函数都可以直接访问 不同目录下的包: 1.把要在自定义包外 ...
- 557. 反转字符串中的单词 III
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出: &q ...
- [POI2008]CLO
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个t ...
- 数据结构之splay树
https://www.bilibili.com/video/av19879546 https://blog.csdn.net/u014634338/article/details/42465089 ...
- hihoOffer收割练习20题目2
题目2 : SCI表示法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示 ...
- Latex排版工具的使用(一) 分类: Latex 2014-06-14 22:52 448人阅读 评论(0) 收藏
使用Latex可以排版出漂亮的论文,尤其适合对含有数学公式论文的排版. 下面编写第一Latex源文件,实现对两个数学公式的排版: 新建文件first.tex: \documentclass{artic ...
- 如何隐藏electron窗体的菜单栏
electron中默认带有顶部菜单栏,有时候我们的应用不需要. 再main.js文件中设置 const electron = require('electron') const path = requ ...
- JDK常用类解读--StringBuffer、StringBuilder
上一篇博客讲到String对象一旦被创建该内容就不能被修改了如: String s = "hello world"; s.substring(6); s.replace(" ...