在vue3中创建多重布局的方法

news2024/12/24 8:26:50

在vue3中创建多重布局的方法

在本文中,会通过demo演示来讲解几个用于创建多重布局的方式。

demo需求:创建一个带有主页、营销页面和应用程序页面的 Web 应用程序

1. 导入Layouts作为常规组件来创建布局系

这是创建布局最简单的方法,但灵活性较差。

创建一个layouts文件夹,在其中创建 3 个包含slot的布局组件。

在这里插入图片描述
在这里插入图片描述
然后,只需在每个页面组件中导入所需的布局,如下所示:

在这里插入图片描述
该方法有两个主要问题:

  1. 需要导入每个页面的布局
    当然,可以使这些组件全局化,但仍然需要每次手动包装内容。

  2. 每次路由改变时,布局都会被卸载并销毁,即使下一个路由使用相同的布局

这对性能影响很小,但真正的问题是,即使它们使用相同的布局,我们也无法保留从一条路由到另一条路由的状态。

2.使用Vue Router、路由的meta属性和动态组件创建布局

为了避免在每个页面中导入布局,我们可以在路由器中导入一次,并为每个路由提供关联的布局。meta 元属性介绍

在这里插入图片描述
如此处所示,我们将每个布局组件对象直接与每个路由的元属性相关联。我们只导入一次所有布局。

为了避免布局被卸载和破坏,我们会将布局放在页面上方而不是页面内。

在这里插入图片描述
为了将布局放在页面上方,我们在 App.vue 组件中创建了一个动态组件

在模板中,我们可以通过$routepath来访问当前路由。我们可以访问它的元属性,这意味着我们可以访问之前设置的布局组件对象。

如果路由在元对象上没有布局属性,我们会回退到字符串使用 div 标签。

只导入一次布局,我们不需要导入甚至包装每个页面中的布局,现在,我们不会有性能问题,并且我们可以在从具有相同布局的 2 个路由导航时保持状态。

所以主页组件现在看起来像这样:

在这里插入图片描述
不再需要通过slot插入任何东西;所有内容都在 App.vue 中围绕 <router-view> 进行处理,<router-view> 代表路由更改时的每个页面。

此方法适用于大多数用例,但有 1 个问题:

仅当path改变时布局才会改变。

如果需要动态改变布局而不改变path,这个方法就行不通了。

虽然只有少数情况下我们希望动态更改布局,但这种情况可能会存在,比如:

  • 可能是在一段时间后显示锁定的页面
  • 可能是显示离线页面
  • 可能是显示错误页面

这些示例可以通过全屏弹窗来实现,但是弹窗很容易通过控制台从 DOM 中删除。

3.使用ShallowRef、Provide、Inj​​ect和Vue Router的afterEach钩子创建布局

为了能够从任何地方更改布局,而不仅仅是在path更改时,我们需要在整个应用程序中共享布局的状态。

我们可以使用VuexPina来实现这一点,但为了能简单的展示,本文使用 Vue 的原生响应式系统和组合 API

步骤如下:

  1. App.vue中,我们将创建一个布局常量,其中包含一个shallowRef来保存当前布局组件

  2. 在一个单独的文件中,我们将创建一个带有键/值对的对象,其中包含每个布局的名称及其组件。
    在这里插入图片描述

  3. App.vue 或其他地方,我们将使用路由的 afterEach 钩子监听每个路由变化,以动态更改当前布局

  4. App.vue 中,我们将向其后代提供 布局常量,以便 App.vue 树中的任何组件都可以注入 布局常量来更改其值。

  5. 在路由中,我们将元属性上的每个布局属性更改为仅包含要选择的布局名称的字符串。
    将路由中的元更改为仅字符串,因为它们将映射到第2步中的对象:
    在这里插入图片描述

现在让我们将所有代码整理一下:

在这里插入图片描述
为什么我们使用shallowRef而不是ref

ref 将使基值和所有嵌套值变为响应式,但 shallowRef 只会使基值变为响应式。

由于我们存储的是一个组件,它是一个具有大量嵌套值的复杂对象,因此使用 ref 会导致性能问题。

其实也没有必要纠结使用是否要使用ref,因为我们只需要知道整个组件何时更改,而不是嵌套值何时更改。

下面是一个可以通过单击更改其布局的主页示例:

在这里插入图片描述
如上面的代码所示,我们现在可以注入和访问布局的状态并将其更改为我们想要的任何组件。由于是响应式的,它将动态更改 App.vue 中的组件。

对于大多数场景来说,可以使用 VuexPinia 执行相同的操作来实现共享状态。

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

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

相关文章

ROS-2.ros工具简单认识

ROS命令工具 ros提供了丰富的命令行工具 命令作用rostopic主题相关工具rosservicerosnode节点相关工具rosparam参数相关工具rosmsg消息相关工具rossrv$1 运行小海龟 开启一个终端&#xff0c;启动ros master roscore开启一个终端&#xff0c;启动小海龟仿真器 rosrun tur…

图床项目进度(一)——UI首页

1. 前言 前面我不是说了要做一个图床吗&#xff0c;现在在做ui。 我vue水平不够高&#xff0c;大部分参考b站项目照猫画虎。 vue实战后台 我使用ts&#xff0c;vite&#xff0c;vue3进行了重构。 当然&#xff0c;我对这些理解并不深刻&#xff0c;许多代码都是游离于表面&am…

k8s之Pod及Probe 探针机制(健康检查机制)

文章目录 1、Pod1.1、定义1.2、Pod的形式1.2、Pod的使用1.3、 Pod生命周期1.4、生命周期钩子1.5、临时容器1.5.1、定义1.5.2、使用临时容器的步骤 1.6、静态Pod 2、Probe 探针机制&#xff08;健康检查机制&#xff09;2.1、探针分类2.2、Probe配置项2.3、编写yaml测试探针机制…

初阶c语言:实战项目三子棋

前言 大家已经和博主学习有一段时间了&#xff0c;今天讲一个有趣的实战项目——三子棋 目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 时间戳&#xff1a;推荐一篇 C语言生成随机数的方法_c语言随机数_杯浅…

成为创作者的第512天——创作纪念日

​ &#x1f4da;文章目录 &#x1f4e8;官方致信 &#x1f3af;我的第一篇文章 &#x1f9e9;机缘 &#x1f9e9;收获 &#x1f9e9;成就 &#x1f9e9;憧憬与目标 &#x1f4e8;官方致信 ​ &#x1f3af;我的第一篇文章 2022 年 03 月 26 日&#xff0c;那一天我在C…

【网络安全】防火墙知识点全面图解(一)

防火墙知识点全面图解&#xff08;一&#xff09; 1、什么是防火墙&#xff1f; 防火墙&#xff08;Firewall&#xff09;是防止火灾发生时&#xff0c;火势烧到其它区域&#xff0c;使用由防火材料砌的墙。 后来这个词语引入到了网络中&#xff0c;把从外向内的网络入侵行为看…

nodejs使用PassThrough流进行数据传递合并

在Node.js中&#xff0c;流&#xff08;stream&#xff09;是处理数据的强大工具&#xff0c;它们允许我们以流式方式处理大量数据&#xff0c;而不必一次性将所有数据加载到内存中。PassThrough是Node.js中的一个流类型&#xff0c;它在数据流传递过程中起到 无操作 的中间层&…

LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

设计模式——里氏替换原则

文章目录 里氏替换原则OO 中的继承性的思考和说明基本介绍一个程序引出的问题和思考解决方法 里氏替换原则 OO 中的继承性的思考和说明 继承包含这样一层含义&#xff1a;父类中凡是已经实现好的方法&#xff0c;实际上是在设定规范和契约&#xff0c;虽然它不强制要求所有的…

Web会话技术

会话:用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应 会话跟踪:一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来自于同一浏览器&#xff0c;…

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1&#xff0c;表示不进行缩放矩阵里的数字2等&#xff0c;表示缩放矩阵里的数字-3 表示缩放-3倍&#xff0c;并且反向矩阵里的数字的位置矩阵拆分为列向量…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中&#xff0c;存在两个不同的环境。 &#xff0…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的Bufferlist序列功能的技术背景CameraExplorer如何查看相机Bufferlist功能在BGAPI SDK里通过函数设置相机Bufferlist参数 Baumer工业相机通过BGAP…

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值&#xff0c;找到对应的空间会出现对应的值 btree树…

深度学习|自监督学习、MAE学习策略、消融实验

前言&#xff1a;最近在阅读论文&#xff0c;发现太多机器学习的知识不懂&#xff0c;把最近看的一篇论文有关的知识点汇总了一下。 自监督学习、MAE学习策略、消融实验 自监督学习MAE学习策略消融实验 自监督学习 Pretrain-Finetune&#xff08;预训练精调&#xff09;模式&…

从LeakCanary看如何判断对象被回收

前面已经了解了Service&#xff0c;Fragment&#xff0c;ViewModel对象的销毁时机&#xff0c;那么在触发销毁时机后&#xff0c;我们怎么判断这些对象有没有回收呢&#xff1f; 大家都知道在Java中有强引用&#xff0c;弱引用&#xff0c;软引用&#xff0c;虚引用四种引用方…

2、手写模拟Spring底层原理

创建BeanDefinition bean定义 设置BeanDefinition 的类信息&#xff0c;作用域信息 创建beanDefinitionMap scope为原型&#xff1a; scope为单例&#xff1a; 总结&#xff1a; 扫描ComponentScan注解上的包扫描路径&#xff0c;将Component注解修饰的类&#xff0c;生成Bea…

数据结构之并查集

并查集 1. 并查集原理2. 并查集实现3. 并查集应用3.1 省份数量3.2 等式方程的可满足性 4. 并查集的优缺点及时间复杂度 1. 并查集原理 并查表原理是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0…

Apache Doris 极简运维之BE扩缩容(1)

Apache Doris 极简运维之BE扩缩容&#xff08;1&#xff09; 一、环境信息硬件信息软件信息 二、缩容2.1 DROP BACKEND缩容2.2 DECOMMISSION BACKEND缩容2.2.1 缩容前2.2.2 缩容中2.2.3 缩容后 三、扩容3.1 扩容前3.2 扩容中3.3 扩容后 四、总结 一、环境信息 已部署三个BE节点…

十二、Linux如何修改文件/文件夹所属用户or用户组?chown命令

目录 1、基础语法 2、修改目标用户&#xff1a; 3、修改用户组&#xff1a; 4、使用-R命令&#xff0c;并同时修改用户/用户组 1、基础语法 chown [-R] [目标用户][:][目标用户组] 被修改文件/文件夹 &#xff08;1&#xff09;选项-R&#xff1a;同chmod&#xff0c;对文…