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 一个简单的例子 ...
随机推荐
- 有向图强连通分量的Tarjan算法(转)
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- TibetanFont | ཡིག་གཟུགས། | 藏文字体
1.Microsoft Himalaya 微软喜马拉雅字体 2007年1月30日,微软公司向全球市场同步发布了其最新操作系统Windows Vista,并自带藏文字体和输入法,Windows Vist ...
- 并不对劲的Loj6031:「雅礼集训 2017 Day1」字符串
题目传送门:-> 看到题目的第一反应当然是暴力:对于串s建后缀自动机,每次询问中,求w对应的子串在s的SAM中的right集合.O(qmk)听上去显然过不了. 数据范围有个∑w<=1e5, ...
- BZOJ_3620_似乎在梦中见过的样子_KMP
BZOJ_3620_似乎在梦中见过的样子_KMP Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka ...
- JavaScript 算法与数据结构(转载)
JavaScript 算法与数据结构 https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
- bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
其实并不会分数规划 因为要最大化 ans=总收益/总路程 ,所以考虑二分答案,找到一条 ans<=总收益/总路程 的回路.先预处理出d(i,j)为(i,j)最短路,w(i,j)为在i买某个物品在 ...
- nmcli 学习小结
nmcli 是Redhat提供的网络配置编辑工具, 它可直接编辑/etc/sysconfig/network-scripts/ifcfg-xxx , 它是NetworkManager服务的客户端工具, ...
- [ZPG TEST 111] 奶牛的新家【DP】
3.奶牛的新家 [问题描述] 由于奶牛们纷纷表示破旧的房子实在是太丑陋了,DD决定给他们建造新家.现在有许多奶牛决定将家建造在n*m的城市中.然而奶牛们分成了k帮派,不同帮派的奶牛不能住在同列或同行上 ...
- 使用 JSX 描述 UI 信息
这一节我们通过一个简单的例子讲解 React.js 描述页面 UI 的方式.把 src/index.js 中的代码改成: import React, { Component } from 'react ...