【Vue3 第二十七章】路由和状态管理

news2024/12/25 12:58:39

一、路由

1.1 服务端路由 与 客户端路由

  • 服务端路由
    服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服务端获得全新的 HTML,然后重新加载整个页面。
  • 客户端路由
    客户端路由和服务端路由类似,只不过它是在浏览器中运行,使用 JavaScript 处理逻辑,并利用一些基于 JS 的模板引擎或其它方式呈现页面。客户端路由通常用于单页面应用程序中,这时服务器端代码主要用于为客户端代码提供通过 ajax 技术请求的 API 接口数据。
    在单页面应用中,客户端的 JavaScript 可以拦截页面的跳转请求,动态获取新的数据,然后在无需重新加载的情况下更新当前页面。这样通常可以带来更顺滑的用户体验,尤其是在更偏向“应用”的场景下(这类场景下用户通常会在很长的一段时间中做出多次交互)。
    客户端路由可以通过 History API 或者 hashchange 事件 来管理应用当前应该渲染的视图。

1.2 实现一个简单的路由

如果你只需要一个简单的页面路由,而不想为此引入一整个路由库,你可以通过动态组件的方式,监听浏览器 hashchange 事件或使用 History API 来更新当前组件。
如下图,通过点击的方式,达到路由切换的目的:
在这里插入图片描述
主要代码如下:

<script setup>
import { ref, computed } from 'vue'
import A from './A.vue'
import B from './B.vue'
import NotFound from "./NotFound.vue"

const routes = {
    '/': A,
    '/b': B
}

const currentPath = ref(window.location.hash)
window.addEventListener('hashchange', () => {
    currentPath.value = window.location.hash
})
const currentView = computed(() => {
    return routes[currentPath.value.slice(1) || '/'] || NotFound
})
</script>
<template>
    <div>
        <div>
            <a href="#/">A</a>
            <a href="#/b" style="margin-left: 20px">B</a>
        </div>
        <br>
        <Transition name="fade">
            <component :is="currentView" style="margin-top:50px" tag="div"></component>
        </Transition>
    </div>
</template>
<style scoped lang="less">
.fade-enter-from {
    opacity: 0;
}

.fade-enter-active {
    transition: opacity 1s 0.5s ease;
}https://code.7-plan.com/web/operation-management

.fade-leave-to {
    opacity: 0;
}

.fade-leave-active {
    transition: opacity .5s ease;
}
</style>

1.3 官方路由库 - Vue Router

Vue Router - 为 Vue.js 提供富有表现力、可配置的、方便的路由
在这里插入图片描述
Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。功能包括:

  • 嵌套路由映射
  • 动态路由选择
  • 模块化、基于组件的路由配置
  • 路由参数、查询、通配符
  • 展示由 Vue.js 的过渡系统提供的过渡效果
  • 细致的导航控制
  • 自动激活 CSS 类的链接
  • HTML5 history 模式或 hash 模式
  • 可定制的滚动行为
  • URL 的正确编码

关于项目路由的详细配置和使用,详见官方文档

二、状态管理

2.1 在 Vue 中,每一个组件实例都是一个独立的单元,包含三个部分:

  • 状态
    驱动整个应用的数据源

  • 视图
    对状态的一种声明式映射

  • 交互
    状态根据用户在视图中的输入而做出响应变更的可能方式
    在这里插入图片描述
    当多个组件共享一个共同状态时,可以利用 Vue 提供的 API,在抽取的公共组件上做状态管理:

  • props 属性传递(深层次组件嵌套,会造成 prop 逐级透传问题,会显得非常麻烦)
    在这里插入图片描述

  • provide/inject 穿透(可以解决深层次数据传递问题)
    在这里插入图片描述

  • event 自定义事件

  • ref 引用获取父/子实例

  • globalProperties 定义全局状态

  • eventBus 公交总线

2.2 通过 Vue 响应式 API 实现一个简单的状态管理
创建一个共享组件,并使用 reactive 创建一个响应式状态对象

// store.js
import { reactive } from 'vue'

export const store = reactive({
  count: 0
})

在需要这个状态的组件中分别引入并使用

<!-- ComponentA.vue -->
<script setup>
import { store } from './store.js'
</script>

<template>From A: {{ store.count }}</template>
<!-- ComponentB.vue -->
<script setup>
import { store } from './store.js'
</script>

<template>From B: {{ store.count }}</template>

在这两个组件中,尝试去修改 store 对象,看一下视图是否会自动更新

<template>
  <button @click="store.count++">
    From B: {{ store.count }}
  </button>
</template>

刷新页面,发现点击操作后,两个引用的组件中,这个状态都同步更新了。
然而,我们学习JS高级或者设计模式的时候,再三强调不建议这么做!为什么,想一想,随意一个组件都可以轻易的去修改状态,这符合代码的健壮性和可维护性原则吗?
所以为了确保状态改变的逻辑像状态本身一样集中,建议在 store 上,通过方法的方式来表达修改状态的意图,提供对应的接口去进行响应的操作,而不是随意修改。

共享组件代码增加操作接口函数如下

// store.js
import { reactive } from 'vue'

export const store = reactive({
  count: 0,
  increment() {
    this.count++
  }
})

其它组件中通过对应的接口,完成状态的处理操作

<template>
  <button @click="store.increment()">
    From B: {{ store.count }}
  </button>
</template>

请注意这里点击的处理函数使用了 store.increment(),带上了圆括号作为内联表达式调用,因为它并不是组件的方法,并且必须要以正确的 this 上下文来调用。

2.3 通过上面不难看出,Vue 组件本身其实已经实现了对响应式状态的管理。那既然这样,为什么我们还要使用 Pinia 或 Vuex 这些状态管理器呢?
这是因为在大规模的生产应用中,还有很多其它事项要考虑:

  • 更强的团队协作约定
  • 与 Vue DevTools 集成,包括时间轴、组件内部审查和时间旅行调试
  • 模块热更新 (HMR)
  • 服务端渲染支持

下面来展开讲一讲状态管理的应用

Pinia - 符合直觉的 Vue.js 状态管理库。类型安全、可扩展性以及模块化设计。甚至让你忘记正在使用的是一个状态库。
在这里插入图片描述

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

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

相关文章

人机交互学习-2 人机交互基础知识

人机交互基础知识 交互框架作用执行/评估活动周期 EEC四个组成部分七个阶段和两个步骤 执行隔阂&评估隔阂扩展EEC模型四个部分两个阶段 交互形式命令行交互菜单驱动界面基于表格的界面直接操纵问答界面隐喻界面自然语言交互交互形式小结 理解用户信息处理模型信号处理机人类…

“秩序与自由”——超详细的低代码开发B端产品前端页面设计规范

Hi&#xff0c;我们是钟茂林和李星潮&#xff0c;来自万应低代码 UI 设计团队。 编辑搜图 编辑搜图 左&#xff1a;钟茂林 右&#xff1a;李星潮 在过去&#xff0c;B 端应用通常只在企业内部员工中使用&#xff0c;与 C 端产品数以千万计的用户相比显得少之…

Pycharm 配置Django 框架(详解篇)

首先你必须具备pycharm 专业版 / 社区版也可以 打开pycharm专业版 找到在最下方菜单栏找到 Terminal 第二步&#xff1a;检查自己的python版本 python --version 第三步&#xff1a; 寻找和自己python版本匹配的django版本 &#xff08;图片来源&#xff1a; 化雨随风 …

【NLP模型】文本建模(2)TF-IDF关键词提取原理

一、说明 tf-idf是个可以提取文章关键词的模型&#xff1b;他是基于词频&#xff0c;以及词的权重综合因素考虑的词价值刻度模型。一般地开发NLP将包含三个层次单元&#xff1a;最大数据单元是语料库、语料库中有若干文章、文章中有若干词语。这样从词频上说&#xff0c;就有词…

华为OD机试真题 JavaScript 实现【最小传输时延】【2023 B卷 100分】,附详细解题思路

一、题目描述 某通信网络中有N个网络节点&#xff0c;用1到N进行标识。 网络通过一个有向无环图表示&#xff0c;其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i] {u,v,w}&#xff0c;u表示源节点&#xff0c;v表示目的节点&#xff0c;…

C++入门攻略

C补足C语言部分缺陷 1.命名空间&#xff1a;1.1 命名空间namespace关键字1.命名空间中可以定义变量、函数、类型2.命名空间可以嵌套3.相同命名空间共存 1.2 命名空间的使用方式&#xff1a;1.名称加用域作用限定符的方式访问&#xff08;同上&#xff09;2.使用using引入某个空…

现在学大数据还来得及么

种一棵树最好的时机是十年前&#xff0c;其次是现在。如果你想学&#xff0c;那么就一定来的及。 Python 已成利器 在大数据领域中大放异彩 Python&#xff0c;成为职场人追求效率的利器&#xff0c;因为不管什么工作&#xff0c;数据都会是工作的一部分&#xff0c;有数据的…

学习【菜鸟教程】【C++ 继承】

链接 1. 教程原文 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;您不需要重新编写新的…

精通postman教程(一)下载及安装详解

作为一名测试工程师&#xff0c;那么Postman绝对是大伙必备的工具之一。 在这个系列教程中&#xff0c;我将为大伙详细讲解如何使用Postman进行API测试。 今天我将先为大伙介绍Postman的下载安装方法&#xff0c;让你们快速上手这款工具。 一、下载 下载地址&#xff1a;Do…

基于Java学院党员管理系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Java学习笔记(视频:韩顺平老师)4.0

如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 因为作者能力水平有限&#xff0c;欢迎各位大佬指导。 目录 如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 控制结构 顺序 分…

【面试系列】2023金三银四面经

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

深入浅出RTA广告投放

一、RTA诞生背景 广告主在媒体投放广告时&#xff0c;往往需要将数据回传给DSP或媒体平台&#xff0c;供他们进行针对性优化。但是随着很多公司对数据隐私性的重视和保护&#xff0c;导致广告主不能或者不愿意将数据回传给DSP或媒体平台&#xff0c;但这样做又必然导致投放模型…

Lightroom Classic 2023(版本 12.3)主要新增功能

macw发布了Adobe Lightroom Classic 2023(版本 12.3)软件&#xff0c;该版本新增了哪些功能呢&#xff1f;随着小编一起了解一下吧&#xff01; 主要新增功能概述 轻松消除图像中的杂色 借助 AI 支持的降噪功能&#xff0c;可以轻松、有效地消除 RAW 图像中的杂色&#xff0c…

抽象工厂模式(六)

过气的&#xff0c;终究是过气了 上一章简单介绍了工厂方法模式(五), 如果没有看过,请观看上一章 一. 抽象工厂模式 引用 菜鸟教程里面的单例模式介绍: https://www.runoob.com/design-pattern/abstract-factory-pattern.html 抽象工厂模式&#xff08;Abstract Factory Pat…

记Gitlab备份与设置自动备份

今天给Gitlab做了一个备份&#xff0c;并且设置了每天自动备份&#xff0c;记录一下。 一、导出全部项目 由于Gitlab Web页面并没有自动备份的相关设置&#xff0c;只有各个项目有一个“导出项目”功能。为了保证安全&#xff0c;先把所有项目全部使用“导出项目”功能导出一…

Redis实战案例1-短信登录

Redis的共享session应用 1. 项目的相关工作 导入sql文件 找到对应的sql文件即可 基本表的信息 基本架构 导入对应的项目文件&#xff0c;启动相关的service服务; 在nginx-1.18.0目录下启动命令行start nginx.exe&#xff1b; 2. 基于session实现登录的流程 这里利用到Javaweb中…

脚踩Midjourney、Stable Diffusion,谷歌StyleDrop真要杀疯了!

脚踩Midjourney、Stable Diffusion&#xff0c;谷歌StyleDrop真要杀疯了 导语StyleDrop组件MuseMuse架构Muse图像生成实现流程 适配器微调Adapter TuningMuse中的Adapter Tuning 反馈迭代训练 最近&#xff0c;谷歌发布了一款引人瞩目的AI绘画工具——StyleDrop。这个工具通过学…

ZYNQ - 以太网远程更新贴片SD卡应用程序【SD NAND应用】

写在前面 对于ZYNQ系列的板卡固化&#xff0c;可以通过JTAG接口&#xff0c;使用SDK固化到FLASH中&#xff0c;或者可将SD卡取出将SD卡中保存的固化工程进行修改&#xff0c;但在很多情况下&#xff0c;离线更新会很不方便&#xff0c;本文借鉴网上常见的远程更新QSPI FLASH的…

解析Java异常机制:捕获编程中的错误,保障代码稳定性

工作中&#xff0c;程序遇到的情况不可能完美。比如&#xff1a;程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff1b;程序在运行着&#xff0c;但是内存或硬盘可能满了等等。 软件程序在运行过程中&#xff0c;非常可能遇到刚刚提到的这些问题&…