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 一个简单的例子 ...
随机推荐
- JAVASCRIPT 和 AJax 实现局部验证
JSP页面 <td width="10%" class="main_matter_td">真实姓名</td> <td width= ...
- sqlserver游标使用误区
在使用游标出现逻辑错误时,查阅资料,只有改掉while中的游标取值在while循环最后,没有说明while以前会出现的错误,而且没有具体说明原因,今天在工作中解决了这个问题,写了这个博客,希望对使用游 ...
- 腾讯微博 JS-SDK接入
官方文档: open.js api查询 api调试接口 1.接口初始化 加载openjs源代码. <script type="text/javascript" src=&qu ...
- asp.net mvc razer
Asp.net MVC Razor模板引擎技巧分享 http://www.cnblogs.com/JustRun1983/p/3545303.html 全新的membership框架Asp.net I ...
- 三步升级已安装的 Android SDK 和 ADT 插件(转载)
转载:http://www.tfan.org/update-adt-and-android-sdk-in-five-minutes/ 如何快速地把已安装的 Android SDK 及 Eclipse ...
- bzoj 1661: [Usaco2006 Nov]Big Square 巨大正方形【枚举】
每句两个顶点确定正方形,取max即可 #include<iostream> #include<cstdio> using namespace std; int n,x,y,s, ...
- React 事件 传参
绑定事件用 bind方法,第一个参数是 this,第二个参数是需要传入的值如下: <a onClick={this.updateLabel.bind(this,'参数1','参数2')} > ...
- php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行?
问答 问答详情 php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行? centos apache linux html php 3.2k 次浏 ...
- [POI2004]GRA
Description 让我们考虑一个在m x 1 的板子上玩的游戏,板子被从1 到 m编号. 现在板子上有n 个棋子, 每个都严格占据板子上的一个格子. 没有一个棋子占据格子m. 每个单独的移动遵循 ...
- bitset优化背包问题
https://blog.csdn.net/HowardEmily/article/details/77340566 留坑待填