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 一个简单的例子 ...
随机推荐
- 2018.10.20 XMYZ Day1总结
上周的忘写了……题目没有作者…… T1.backpack 期望得分100,实际得分100. 感觉我自己真是不如以前了……以前做这种题都是秒掉的,现在怎么想了10分钟啊…… 因为物品的体积和价值都非常小 ...
- 最好的6个Go语言Web框架
原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...
- Python基础第七天
一.内容 二.练习 练习1 题目:编写函数,函数执行的时间是随机的 图示: 代码: import time import random def func(): s = 1 l = [] for i i ...
- Java Socket编程如何建立两者关系
转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...
- HDU 4891 The Great Pan (题意题+模拟)
题意:给定一个文章,问你有多少种读法,计算方法有两种,如果在$中,如果有多个空格就算n+1,如果是一个就算2的次方,如果在{}中, 那么就是把每个空格数乘起来. 析:直接模拟,每次计算一行,注意上一行 ...
- tar.xz格式文件的解压方法(转载)
转自:http://bbs.chinaunix.net/thread-3610738-1-1.html 现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件 ...
- maven仓库错误
1.jai_core 时间:2018年3月21日10:04:57 URL:https://mvnrepository.com/artifact/javax.media/jai_core/1.1.3 / ...
- 【原创】MapReduce备份Elasticsearch数据到HDFS(JAVA)
一.环境:JAVA8,Elasticsearch-5.6.2,Hadoop-2.8.1二.实现功能:mapreduce读elasticsearch数据.输出parquet文件.多输出路径三.主要依赖 ...
- jsonp处理跨域
什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”.而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略 ...
- python 闭包 Closure 函数作为返回值
一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...