Vue之render函数

news2024/11/26 0:56:17

概述

render函数从名字上看就可以看出,它是一个用于渲染的函数,在Vue中我们要将我们写的界面展示到屏幕上时,使用的方式都是组件中的template:标签下编写内容后,由Vue将我们编写的界面渲染到屏幕上。而这个render函数就是比template更底层的函数,我们可以利用它直接渲染我们想渲染的内容。这样做的好处是性能更高,并且使用更加灵活。

实例解析

假设我们要在屏幕上展示如下图所示的内容:
在这里插入图片描述即编写一个组件,这个组件接收一个来自父组件的展示内容和展示的字体大小,子组件负责根据父组件的内容和展示的字体大小展示内容。上图分别是<h1></h1>-<h6></h6>的展示效果。根据我们前面学习的知识实现这个需求也不难,大致思路为:编写一个子组件,通过组件间传值,获得父组件传递过来的字体展示的level,level是多少,子组件就展示<h level>,展示的内容我们使用插槽相关的内容解决,步骤如下:
首先我们定义一个子组件,代码如下:

  app.component('my-title',{
        props:['level'],
        template:
        `
            <h1 v-if="level===1"><slot /></h1>
            <h2 v-if="level===2"><slot /></h2>
            <h3 v-if="level===3"><slot /></h3>
            <h4 v-if="level===4"><slot /></h4>
            <h5 v-if="level===5"><slot /></h5>
            <h6 v-if="level===6"><slot /></h6>
        `
    });

如上面代码所示吗,我们使用props接收一个来自父组件的展示标题是多少,然后通过slot接收父组件传递过来的内容,使用v-if来判断level是否是本标签需要展示的level类型,不是则不展示。

然后在父组件中我们可以使用定义的组件来展示我们想要展示的内容和level了,代码如下:

 const app = Vue.createApp({
        template: 
        `
         <my-title :level="1"> 
            hello world111
         </my-title>
         <my-title :level="2"> 
            hello world222
         </my-title>
         <my-title :level="3"> 
            hello world333
         </my-title>
         <my-title :level="4"> 
            hello 
         </my-title>
         <my-title :level="5"> 
            walt
         </my-title>
         <my-title :level="6"> 
            zhongxj
         </my-title> 
        `
    }); 

注意:在父组件中我们传递level值使用的是 :level=“6”的方式,前面学过这种方式,这里加冒号就表示我们传递的是一个数字,不加冒号表示的是字符串
这样我们就实现了我们想要展示的内容了,但是我们可以看到子组件中的展示内容部分的代码逻辑都差不多,显得有点冗余:

     template:
        `
            <h1 v-if="level===1"><slot /></h1>
            <h2 v-if="level===2"><slot /></h2>
            <h3 v-if="level===3"><slot /></h3>
            <h4 v-if="level===4"><slot /></h4>
            <h5 v-if="level===5"><slot /></h5>
            <h6 v-if="level===6"><slot /></h6>
        `

假设我们还有h6,h7,h8 ……,难道也要一直按照这个逻辑写下去吗?答案是否定的,所以这时候,render函数就派上用场了。我们看下如何使用render函数实现我们展示不同标题的需求。我们只需要修改子组件中的代码就可以了,我们直接使用render函数替代template就可以了,代码如下:

    app.component('my-title',{
        props:['level'],
        render(){
           const {h} = Vue;
           return h('h'+this.level,{},this.$slots.default()); 
        }
    });

如上所示,我们使用了Vue的一个render()函数,然后返回一个h函数,这个h函数传递的参数分别为:

h(标签名称,属性,需要渲染的内容)
标签名称:就是div,h1,span这类的html标签的名称
属性:属性就是我们在描述界面时在标签中定义的属性,例如:<div name="123"></div> 中的name="123"就是属性
需要渲染的内容:这里可以直接是内容,可以是一个h函数的返回值,也就是虚拟DOM

比如我们直接将需要渲染的内容改成字符串,代码如下:

 app.component('my-title',{
        props:['level'],
        render(){
           const {h} = Vue;
           return h('h'+this.level,{},'zhongxj'); 
        }
    });

运行结果:
在这里插入图片描述需要渲染的内容还可以使用一个数组表示多个渲染内容,比如我们不仅需要渲染父组件的内容,还要增加一个自己定义的内容,代码如下:

  app.component('my-title',{
        props:['level'],
        render(){
           const {h} = Vue;
           return h('h'+this.level,{},[this.$slots.default(),'walt-zhong']); 
        }
    });

运行结果:
在这里插入图片描述本文完整示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>render函数</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
    <div id="hello"></div>
</body>
<script>

 const app = Vue.createApp({
    // :level="1" 加冒号是一个数字,不加冒号后面的1就是一个字符串
        template: 
        `
         <my-title :level="1"> 
            hello world111
         </my-title>

         <my-title :level="2"> 
            hello world222
         </my-title>
         <my-title :level="3"> 
            hello world333
         </my-title>
         <my-title :level="4"> 
            hello 
         </my-title>
         <my-title :level="5"> 
            walt
         </my-title>

         <my-title :level="6"> 
            zhongxj
         </my-title> 
        `
    });  

    app.component('my-title',{
        props:['level'],
        render(){
            const{h} = Vue;
            // 虚拟DOM 

            // h函数返回一个虚拟DOM,Vue会做一个虚拟dom到真实DOM的映射然后渲染出来
            // template->render函数->h函数->虚拟DOM(JS对象) -> 真实DOM->展示到页面上
            return h('h' + this.level,{}, [
                this.$slots.default(),
            h('div',{name:1234},''),'zhongxj']) 
            // {} 中传的是<h1 name = "123" 
           //v-if="level===1"><slot /></h1> 中的name属性
        }
        // template:
        // `
        //     <h1 v-if="level===1"><slot /></h1>
        //     <h2 v-if="level===2"><slot /></h2>
        //     <h3 v-if="level===3"><slot /></h3>
        //     <h4 v-if="level===4"><slot /></h4>
        //     <h5 v-if="level===5"><slot /></h5>
        //     <h6 v-if="level===6"><slot /></h6>
        // `
    });
    const vm = app.mount('#root');
</script>

我们读者或许会很奇怪为啥使用h函数可以让我们的内容被渲染出来,其实h函数的返回值是一个虚拟DOM,这个虚拟DOM是一个JS对象,这个对象描述了我们要展示的界面描述,然后Vue会做一个转换,将虚拟DOM转换成真实DOM渲染出来。这个转换的流程大致如下:

template->render函数->h函数->虚拟DOM(JS对象) -> 真实DOM->展示到页面上

Vue为我们提供了template供我们简单描述界面,然后就会通过render函数将我们编写的界面转换成虚拟DOM,最后由Vue转化成真实DOM渲染出来,在特殊情况下,如本文例子中,需要优化简化代码,所以使用了render函数。所以render()函数可以用来做优化和代码简化用

总结

本文主要介绍了render()函数的使用,并且简单的解释了Vue的页面渲染原理,使用render函数可以优化我们页面的渲染速度和简化我们的逻辑重复的冗余代码。Vue的渲染过程可以描述为:template->render函数->h函数->虚拟DOM(JS对象) -> 真实DOM->展示到页面上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B. Divide Candies(数学 + 思维)

Problem - B - Codeforces Arkady和他的朋友们喜欢在一个n n的棋盘上玩跳棋。这个棋盘的行和列从1到n编号。 他的朋友们最近赢了一场比赛&#xff0c;所以Actady想用一些糖果来取悦他们。记得一则古老寓言(但不记得寓意)》&#xff0c;Arlady想给他的朋友们每个格子一个糖果组…

SpringMVC学习总结(一)SpringMVC简介入门案例

SpringMVC学习总结&#xff08;一&#xff09;SpringMVC简介/入门案例 一、SpringMVC简介 &#xff08;一&#xff09;什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分。 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的Ja…

手把手教你学会gitee的注册和代码的提交

欢迎来到壮壮的代码世界 gitee的注册和提交 一、gitee是什么&#xff1f;二、gitee怎么注册三、gitee的一些基本配置四、在gitee上创建远程仓库&#xff08;存储代码的地方&#xff09;五、clone远程仓库到本地电脑六、怎么把本地的代码推送到远程仓库去&#xff08;git的三板斧…

jQuery操作

文章目录 1. jQuery基本介绍1.1 原理示意图1.2 快速入门1.2 什么是jquery对象1.3 dom对象转jQuery对象1.4 jQuery对象转dom对象1.5 jQuery选择器1.5.1 jQuery基本选择器1.5.2 jquery层次选择器1.5.3 基础过滤选择器1.5.4 内容过滤选择器1.5.5 可见度过滤选择器1.5.6 属性过滤选…

Vue(Vue脚手架)

一、使用Vue脚手架&#xff08;Vue Cli&#xff09; Vue官方提供脚手架平台选择最新版本&#xff1a; 可以相加兼容的标准化开发工具&#xff08;开发平台&#xff09; 禁止&#xff1a;最新的开发技术版本和比较旧版本的开发平台 Vue CLI&#x1f6e0;️ Vue.js 开发的标准工…

AWS VPC 配置指南:快速创建和设置你的虚拟私有云

文章目录 一、前言二、创建 VPC2.1 进入 AWS VPC 服务2.2 创建 VPC2.3 选择所要创建的 VPC 资源2.4 输入 VPC 名称2.5 设置 IPv4 CIDR block&#xff08;IPv4 CIDR 块&#xff09;2.6 选择可用区2.7 选择公有子网的数量2.8 设置 NAT 网关和 VPC 终端节点2.9 完成创建 VPC2.10 查…

python ast 详解与用法

目录 基本概念节点类型ast.Assignast.Nameast.Constantast.Callast.Attribute 结点的遍历ast源码示例 结点的修改示例 参考链接 基本概念 python 语言在编译前会解析为抽象语法树&#xff0c;整个文件可以看作一棵树&#xff0c;树上的每个节点就代表一条语句&#xff0c;中序…

计算机中找不到msvcp140.dll无法继续执行代码,解决方法

DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。dll文件是电脑系统及软件运行的重要文件&#xff0c;电脑如果丢失dll文件&#xff0c;那么很多软件跟游戏都是无法运行的&#xff0c;msvcp140.dll丢失这个问题就有很多小伙伴遇到&#xff0c;小编今天就分享找不到…

山东专升本计算机第一章-计算机信息技术与计算机文化

计算机信息技术与计算机文化 计算机中的信息表示 数制及其转换 数制&#xff1a;用进位的原则进行计数数码&#xff1a;数制中表示基本数值大小的不同数字符号基数&#xff1a;一种数制所使用的数码个数位权&#xff1a;数码在不同位置的权值 数制的转换 • R进制转化为十进…

【操作系统和强化学习】1.内存管理策略

文章目录 前言1.内存是什么1.1 基本硬件保护措施 碎片1.2 分段机制1.2.1 分段硬件1.3 分页 前言 CPU的调度可以提高CPU的利用率和计算机的响应用户的速度。为了改进性能&#xff0c;应该将多个进程保存在内存中。也就是说必须共享内存。 本文讨论的是如管理内存。 1.内存是什么…

知识变现海哥:我是如何通过知识变现年赚100万的

我叫王海青&#xff0c;大家都称我海哥&#xff0c;是一名知识变现导师&#xff0c;海青教育创始人。从2011年开始&#xff0c;已经从事知识变现培训服务10多年&#xff0c;帮助3000人实现了个人知识技能变现&#xff0c;一直致力于帮助普通人&#xff0c;把自己的一项知识技能…

TiDB实战篇-操作系统参数TiDB Server

操作系统参数 CPU 绿色的是设置cpu用最高的频率去使用cpu。 专门有一个内存给指定的cpu使用。减少cpu的相应时间。 内存 大页的优化&#xff0c;操作系统关闭大页 。 磁盘 TiDB Server配置 cpu 同时多少个会话 如果负载很高那么就往下面调节。 控制优先级&#xff08;…

计算卸载论文阅读01-理论梳理

标题&#xff1a;When Learning Joins Edge: Real-time Proportional Computation Offloading via Deep Reinforcement Learning 会议&#xff1a;ICPADS 2019 一、梳理 问题&#xff1a;在任务进行卸载时&#xff0c;往往忽略了任务的特定的卸载比例。 模型&#xff1a;针…

BUUCTF ciscn_2019_c_1

小白垃圾做题笔记而已&#xff0c;不建议阅读。 1前期&#xff1a; 其实刚开始拿到程序的时候我还以为是逆向题放错地方了。唉&#xff0c;做题太少了。啥也不会。我是大笨蛋。 题目中用的是ubuntu18&#xff0c;我的ubuntu没怎么用过&#xff0c;vmtools都不能用&#xff0c…

【源码解析】canal核心功能源码解析

1. 项目地址 https://github.com/alibaba/canal.git2. 模块介绍 canal核心模块的功能&#xff1a; deployer模块&#xff1a;独立部署模块&#xff0c;用于canal-server的独立启动&#xff0c;包括本地配置解析、拉取远程配置、启动canal-server。server模块&#xff1a;cana…

山东专升本计算机第六章-数据库技术

数据库技术 SQL数据库与NOSQL数据库的区别 数据库管理系统 考点 6 数据库管理系统的组成和功能 组成 • 模式翻译 • 应用程序的翻译 • 交互式查询 • 数据的组织和存取 • 事务运行管理 • 数据库的维护 功能 • 数据定义功能 • 数据存取功能 • 数据库运行管理…

MySQL备份和恢复

文章目录 一、库的备份和恢复1.库的备份2.库的恢复 二、表的备份和恢复1.表的备份2.表的恢复 备份数据&#xff0c;其实就是生成一个 sql 文件&#xff0c;把创建数据库、创建表、插入数据等各种 SQL 语句都装载到这个文件中。恢复数据&#xff0c;其实就是按顺序执行 sql 文件…

操作系统进程概述、通信

进程 进程就是程序的一次执行过程&#xff0c;同一个程序多次执行对应多个进程&#xff1b; 一、进程的组成 1、PCB &#xff08;1&#xff09;进程描述信息&#xff1a;主要是PID等关键信息&#xff1b; &#xff08;2&#xff09;进程控制和管理信息&#xff1b; &#xf…

( 数组和矩阵) 566. 重塑矩阵 ——【Leetcode每日一题】

❓566. 重塑矩阵 难度&#xff1a;简单 在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵…

unity-VRTK-simulator开发学习日记3(射线样式|忽略层|有无效名单)

目录 射线样式 组成 可用状态 材质替换 射线激活设置为常态 忽略层级&#xff08;射线等&#xff09; 自定义忽略层级 &#xff08;射线等&#xff09; 有效名单和无效名单 有效名单 无效名单 创建一个模拟手柄的按钮&#xff08;键盘键入按钮&#xff09; 输入系统…