Vue3(Ⅱ)

Vue3(Ⅱ)

  • 3、 进阶 —— 路由
    •       3.1、示例
    •       3.2、to 的两种写法
    •       3.3、命令路由
    •       3.4、嵌套路由
    •       3.5、query 参数
    •       3.6、params 参数
    •       3.7、路由的 props 配置
    •       3.8、replace 属性
    •       3.9、编程式导航
    •       3.10、重定向
  • 4、 进阶 —— Pinia
    •       4.1、概述
    •       4.2、环境搭建
    •       4.3、示例
    •       4.4、修改数据(三种方法)
    •       4.5、storeToRefs
    •       4.6、getters
    •       4.7、$subscribe
    •       4.8、store组合式的写法
  • 5、 进阶 —— 组件通信
    •       5.1、props(父 ↔ 子)
    •       5.2、自定义事件(子 → 父)
    •       5.3、mitt(任意组件间进行通信)
    •       5.4、$attrs(父 → 子孙)
    •       5.5、$refs、\$parent(父 ↔ 子)
    •       5.6、v-model(父 ↔ 子)
    •       5.7、provide、inject(父 → 子孙)
    •       5.8、pinia(任意组件间进行通信)
    •       5.9、插槽(父 → 子)
      •             5.9.1 匿名插槽
      •             5.9.2 具名插槽
      •             5.9.3 作用域插槽
  • 6、 进阶 —— 其它一些常用的 API
    •       6.1、shallowRef 和 shallowReactive
      •             6.1.1 shallowRef
      •             6.1.2 shallowReactive
    •       6.2、readonly 和 shallowReadonly
      •             6.2.1 readonly
      •             6.2.2 shallowReadonly
    •       6.3、toRaw 和 markRaw
      •             6.3.1 toRaw
      •             6.3.2 markRaw
    •       6.4、customRef
  • 7、 进阶 —— Vue3 新组件
    •       7.1、Teleport
    •       7.2、Suspense
    •       7.3、全局API
    •       7.4、非兼容性改变

3、 进阶 —— 路由

      3.1、示例

安装: npm i vue-router

         ① 在 pages/ (或者 view/ )下创建路由组件

<!-- src/pages/About.vue -->
<template><h1>About</h1>
</template>
<script lang="ts" setup name="About"></script><!-- src/pages/News.vue -->
<template><h1>News</h1>
</template>
<script lang="ts" setup name="News"></script><!-- src/pages/Home.vue -->
<template><h1>Home</h1>
</template>
<script lang="ts" setup name="Home"></script>

         ② 编写路由配置文件

// src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/pages/Home.vue'
import News from '@/pages/News.vue'
import About from '@/pages/About.vue'const router = createRouter({// 路由器的工作模式选用historyhistory: createWebHistory(),// 创建一个个路由规则routes: [{path: '/home',component: Home},{path: '/news',component: News},{path: '/about',component: About}]
})
export default router

使用 History 模式的 API:createWebHistory
使用 Hash 模式的 API:createWebHashHistory

         ③ 让 vue 实例来使用这个配置文件

// src/main.ts
// 引入
import { createApp } from 'vue';
import router from './router'
// 组件
import App from './App.vue';
// 创建实例
const app = createApp(App);
// 使用
app.use(router)
// 挂载
app.mount('#app')

         ④ 编写 App 组件

<!-- src/App.vue -->
<template><h2 class="title">Vue路由测试</h2><!-- 导航区 --><div class="navigate"><span class="rlink"><RouterLink to="/home">首页</RouterLink></span><span class="rlink"><RouterLink to="/news">新闻</RouterLink></span><span class="rlink"><RouterLink to="/about">关于</RouterLink></span></div><!-- 展示区 --><div class="content"><RouterView></RouterView></div>
</template><script lang="ts" setup name="App">
</script><style>.rlink {margin-right: 10px;}.content {background-color: cadetblue;}
</style>

Hash模式的缺点之一:在 SEO 优化方面相对较差,SEO(Search Engine Optimization,搜索引擎优化)是一组策略和技术,用于提高网站在搜索引擎结果页面(SERP)中的排名,从而增加网站的可见性和流量。SEO 涉及多个方面,包括关键词优化、内容质量、网站结构、外部链接和技术因素等

      3.2、to 的两种写法

类型写法
字符串to=“/home”
对象:to=“{path:‘/home’}”
to 前要加冒号,这样才能把双引号的内容解析为对象,否则只是一个字符串

      3.3、命令路由

         在路由配置文件中,为路由规则添加 name 配置,例如

// src/router/index.ts
{name:'myhome',path:'/home',component:Home
}

         在使用的时候,需要配合 to 的对象型写法使用,例如

<RouterLink :to="{name:'myhome'}">首页</RouterLink >

      3.4、嵌套路由

         在路由配置文件中,为路由规则添加 children 配置,例如

// src/router/index.ts
{path: '/news',component: News,// 相当于一个 routes 也是一个数组children: [{name: 'xiangqing',path: 'detail', // 前面不能加 / 否则这个component: Detail}]
}

         相应的在使用时如下

<RouterLink to="/news/detail">Detail</RouterLink>
<!-- 或 -->
<RouterLink :to="{path:'/news/detail'}">Detail</RouterLink>
<!-- 或 -->
<RouterLink :to="{name:'xiangqing'}">Detail</RouterLink>

      3.5、query 参数

         传递参数有两种写法:字符串、对象

<!-- src/pages/News.vue -->
<template><!-- 写法1:字符串 --><span class="rlink"><RouterLink to="/news/detail?id=SWE19059&name=niki">详情(字符串</RouterLink></span><!-- 写法2:对象 --><span class="rlink"><RouterLink:to="{name: 'xiangqing',query: { id: 'SWE20059', name: 'pyy' },}">详情(对象)</RouterLink></span><div class="content"><RouterView></RouterView></div>
</template>
<script lang="ts" setup name="News"></script>

         使用 useRoute() 这个 hook 接收

<!-- src/pages/Detail.vue -->
<template><h1>id:{{ id }}</h1><h1>name:{{ name }}</h1>
</template><script lang="ts" setup name="Detail">import { useRoute } from "vue-router";const route = useRoute();let { id, name } = route.query;
</script>

      3.6、params 参数

         修改路由配置

// src/router/index.ts
{path: '/news',component: News,children: [{name: 'xiangqing',path: 'detail/:id/:name', //表示在使用 path 时,detail路径后面出现的部分作为 params 参数,id 和 name 是参数名component: Detail}]
},

         同样地,传递参数有两种写法:字符串、对象

<!-- src/pages/News.vue -->
<template><!-- 写法1:字符串 --><span class="rlink"><RouterLink to="/news/detail/SWE19059/niki">详情(字符串)</RouterLink></span><!-- 写法2:对象 --><span class="rlink"><RouterLink:to="{name: 'xiangqing',params: { id: 'SWE20059', name: 'pyy' },}">详情(对象)</RouterLink></span><div class="content"><RouterView></RouterView></div>
</template><script lang="ts" setup name="News"></script>

关于对象写法
1、query 可以搭配 path 或 name使用
2、params 只能搭配 name 使用

         使用 useRoute() 接收

<!-- src/pages/Detail.vue -->
<template><h1>id:{{ id }}</h1><h1>name:{{ name }}</h1>
</template><script lang="ts" setup name="Detail">import { useRoute } from "vue-router";const route = useRoute();let { id, name } = route.params;
</script>

      3.7、路由的 props 配置

         在路由配置文件中,为路由规则添加 props 配置,一共有三种写法:对象、布尔值、函数式

{path: '/news',component: News,children: [{name: 'xiangqing',path: 'detail/:id/:name',component: Detail,// 写法1:布尔值 ,为true则把params传给子组件// props: true// 写法2:对象// props:{gender:'male',school:'MIT'}// 写法3:函数props(route) {return route.query //需要返回一个对象}}],
},

         在 News 组件中使用 /news/detail/SWE19059/niki?hobby=rap 进行跳转,然后在 Detail 组件中使用 defineProps 进行接收

<!-- src/pages/Detail.vue -->
<template><!-- 对应布尔值写法 --><!-- <h1>id:{{ id }}</h1><h1>name:{{ name }}</h1> --><!-- 对应对象写法 --><!-- <h1>gender:{{ gender }}</h1><h1>school:{{ school }}</h1> --><!-- 对应函数式写法 --><h1>hobby:{{ hobby }}</h1>
</template><script lang="ts" setup name="Detail">// 对应布尔值写法// defineProps(["id", "name"]);// 对应对象写法// defineProps(["gender", "school"]);// 对应函数式写法const { hobby } = defineProps(["hobby"]);console.log(hobby)
</script>

      3.8、replace 属性

         replace 属性用于控制路由跳转时操作浏览器历史记录的模式,浏览器的历史记录有两种写入方式:分别为 push 和 replace

方式描述
push(默认)追加历史记录
replace替换当前的记录

         开启 replace 模式的方法只需要在 RouterLink 标签中进行声明即可,例如

<RouterLink replace ...>xxx</RouterLink>

      3.9、编程式导航

         跳转要使用 useRouter() 这个 hook 来完成

<!-- src/pages/News.vue -->
<template><button @click="toDetail">跳转</button><RouterView></RouterView>
</template><script lang="ts" setup name="News">import { useRouter } from "vue-router";const router = useRouter();function toDetail() {router.push({   //相应的有 route.replace 这个方法name: "xiangqing",params: {id: "SWE19059",name: "niki",},});}
</script>

Tip
1、Vue2 中的 $route、$routes 在 Vue3 中变成了 useRoute、useRouter 这两个 hook
2、在 Vue2 中使用编程式导航重复跳转时会报错,但是 Vue3 中不会

      3.10、重定向

         可以用于设置默认呈现的组件,不然一般是需要先点击某个 RouterLink 才会显示出相应的组件,例如现在配置一组路由规则如下,那么在访问 / 时,会自动激活其下的 /home 对应的组件

{path:"/",redirect:'/home'
},

4、 进阶 —— Pinia

      4.1、概述

        Pinia 是 Vue 3 的一个符合直觉的 Vue.js 状态管理库,是 Vuex 的替代品。Pinia 提供了一种简洁、类型安全的方式来管理应用中的状态。它具有更好的 TypeScript 支持、简洁的 API 设计以及模块化的状态管理方式

安装:npm install pinia

特性描述
模块化设计每个状态存储(store)都是一个模块,可以根据需要创建多个 store
类型安全对 TypeScript 友好,提供了良好的类型推导和类型检查
简洁的 API使用更简洁的 API 设计来管理状态、定义 getter 和 actions
响应式使用 Vue 3 的响应性系统,自动追踪依赖
支持插件可以通过插件扩展功能,例如持久化插件等

      4.2、环境搭建

        修改 src/main.ts 如下

// 引入
import { createApp } from 'vue';
import router from './router'
import { createPinia } from 'pinia'// 组件
import App from './App.vue';// 创建实例
const app = createApp(App);// 使用
// 使用路由配置
app.use(router)
// 使用Pinia
const pinia = createPinia()
app.use(pinia)// 挂载
app.mount('#app')

        完成之后观察 Vue Devtools 可以看到多出一个菠萝🍍的选项,说明环境搭建成功
在这里插入图片描述

      4.3、示例

        Store是一个保存:状态业务逻辑实体,每个组件都可以读取写入它。它有三个概念:state、getter、action,相当于组件中 data、computed 和 methods 的概念
        ① 存储数据:编写 store 定义文件 src/store/count.ts 如下

// 引入defineStore用于创建store
import {defineStore} from 'pinia'// 定义并暴露一个store,推荐用 hook 的命名方式即 use...
export const useCountStore = defineStore(// 仓库名'count',// 配置{// 动作actions: {},// 状态state() {return {count1: 0,count2: 100}},// 计算getters: {}}
)

        ② 读取数据

<!-- src/pages/Home.vue -->
<template><h2>count1:{{ countStore.count1 }}</h2><h2>count2:{{ countStore.count2 }}</h2>
</template><script lang="ts" setup name="Home">import { useCountStore } from "@/store/count";// 获取 store 实体,Pinia 会确保不同组件返回的是同一个 store 实例const countStore = useCountStore();
</script>

      4.4、修改数据(三种方法)

        方法一:在组件中直接修改

<!-- src/pages/Home.vue -->
<template><h2>count1:{{ countStore.count1 }}</h2><h2>count2:{{ countStore.count2 }}</h2><button @click="change1">修改count1</button><button @click="change2">修改count2</button>
</template><script lang="ts" setup name="Home">import { useCountStore } from "@/store/count";const countStore = useCountStore();// 直接修改function change1() {countStore.count1 = 10;}// 批量修改function change2() {countStore.count1 = 50;countStore.count2 = 200

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

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

相关文章

LayerSkip:加速大模型推理的端到端解决方案

大模型&#xff08;LLMs&#xff09;在多种应用中表现出色&#xff0c;但其高昂的计算和内存需求导致部署成本昂贵&#xff0c;尤其是在GPU服务器上。现有加速方案在部署到普通GPU时往往会导致准确性显著下降&#xff0c;而将大模型&#xff08;LLMs&#xff09;进一步加速以部…

Java邮件客户端设计实现:使用JavaMail向QQ邮箱发邮件

目录 JavaMail 用JavaMail向qq邮箱发消息 ▐ 授权码的获取 JavaMail JavaMail 是一个用于发送和接收电子邮件的 Java API。它提供了一个平台无关和协议无关的框架&#xff0c;允许开发人员通过标准电子邮件协议&#xff08;如 SMTP、POP3 和 IMAP&#xff09;来创建、发送…

网络工程师---第四十六天

1、逻辑网络结构设计阶段中&#xff0c;要想实现核心层与汇聚层交换机全部互相连接&#xff0c;组网技术有哪些&#xff1f; 2、工作区子系统的通信布线规范有哪些&#xff1f; 3、综合布线中施工规范有哪些&#xff1f; 4、综合布线系统中核心机房通常包括哪些设备&#xff1f…

SpringBoot——整合拦截器(Interceptor)

目录 拦截器&#xff08;Interceptor&#xff09; 项目总结 新建一个SpringBoot项目​编辑 MyInterceptor自定义拦截器 InterceptorConfig配置类 InterceptorController控制器 SpringbootInterceptorApplication启动类 在开发SpringBoot项目时&#xff0c;开发人员经常需要…

SAP-FICO总账科目案例

1、资产科目 2、负债科目

计网期末复习指南(三):数据链路层(CRC冗余校验码计算、PPP协议、CSMA/CD协议、交换机的自学习能力、VLAN)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

iOS 通过PacketLogger 抓包蓝牙数据包

当使用iOS平台调试蓝牙外设时&#xff0c;需要抓取蓝牙数据包&#xff0c;那么如何获取iOS端设备与蓝牙设备之间通信的蓝牙数据包呢&#xff1f; 一、资料准备 1、苹果手机 2、Xcode开发工具 3、Apple开发者账户 二、环境搭建 2.1、手机环境搭建 手机浏览器访问地址&…

Meta的开源力作:Lexical框架,富文本的未来

引言 Lexical 是一个由 Facebook&#xff08;现在称为 Meta&#xff09;开源的可扩展 JavaScript Web 文本编辑器框架。 这个框架特别强调了三个核心特性&#xff1a;可靠性、可访问性以及高性能。 旨在为开发者创造最优的开发体验。 以下是 Lexical 框架的几个关键特点和能…

使用conda环境安装pythonocc-core

conda环境安装pythonocc库 基本环境 操作系统:Ubuntu 22.04 conda 23.11.0 安装pythonocc-core conda create --name pyocc python3.10 conda activate pyocc conda install -c conda-forge pythonocc-core7.8.1也可参考下面的官方地址 pythonocc-core 官方git地址 conda官…

苏宁电商数据揭秘:掌握苏宁API接口,一键解锁无限商机

苏宁API接口是一套开放的、基于HTTP协议的接口&#xff0c;它允许开发者通过编程方式访问苏宁平台上的商品、订单、用户等信息。这些接口支持多种数据格式&#xff0c;如JSON和XML&#xff0c;并提供了完善的错误处理和权限控制机制。 要使用苏宁API接口&#xff0c;首先需要在…

wireshark 二次开发

一、 Windows 准备 1、源代码下载 Git&#xff1a;https://github.com/wireshark/wireshark 2、 准备Visual C 要编译wireshark&#xff0c;开发电脑上应该安装了Visual Studio并包括了Visual C&#xff0c;请至少安装Visual Studio 2010以减少不必要的麻烦。 visual studio …

媳妇面试了一家公司,期望月薪20K,对方没多问就答应了,只要求3天内到岗,可我总觉得哪里不对劲。

“20k&#xff01;明天就来上班吧&#xff01;” 听到这句话&#xff0c;你会不会两眼放光&#xff0c;激动得差点跳起来&#xff1f; 朋友媳妇小丽&#xff0c;最近就经历了这样一场“梦幻面试”。然而&#xff0c;事情的发展却远没有想象中那么美好…… “这公司也太好了吧…

新闻发稿:14种新闻媒体推广中的成功案例-华媒舍

新闻媒体推广是企业宣传与推广的重要手段之一。通过合理选择和运用新闻媒体&#xff0c;企业可以有效地提升品牌知名度和影响力&#xff0c;吸引更多的目标受众。本文将介绍14种新闻媒体推广中的成功案例&#xff0c;通过这些案例的分享&#xff0c;希望能为企业在新闻媒体推广…

AWS EC2服务器开启root密码,SSH登录

1) EC2 Instance Connect连接&#xff0c;更改root密码 sudo passwd root 2&#xff09;接着切换到切换到 root 身份&#xff0c;编辑 SSH 配置文件 $ sudo -i$ vi /etc/ssh/sshd_configPasswordAuthentication no&#xff0c;把 no 改成 yes #PermitRootLogin prohibit-passw…

论文降重技巧:AI工具如何助力论文原创性提升?

论文降重一直是困扰各界毕业生的“拦路虎”&#xff0c;还不容易熬过修改的苦&#xff0c;又要迎来降重的痛。 其实想要给论文降重达标&#xff0c;我有一些独家秘诀。话不多说直接上干货&#xff01; 1、同义词改写&#xff08;针对整段整句重复&#xff09; 这是最靠谱也是…

动态规划1:1137. 第 N 个泰波那契数

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;1137…

Python管理PVE(Proxmox VE)云平台--节点资源统计2

一、前言 承接上文&#xff1a;Python管理PVE&#xff08;Proxmox VE&#xff09;云平台–节点资源统计 将cpu、内存、磁盘融入到一个脚本中&#xff0c;新增总资源占用计算模块&#xff0c;更直观的看出剩余未分配资源。 二、步骤 1.代码 # -*- coding: utf-8 -*- import o…

城市低空经济“链接力”指数报告(2024)

来源&#xff1a;城市进化论&火石创造 近期历史回顾&#xff1a;2024年NoETL开启自动化数据管理新时代白皮书.pdf 创新引领用户“换新生活”-从AWE2024看家电及消费电子行业发展趋势报告&#xff08;精简版&#xff09;.pdf 2024智能网联汽车“车路云一体化”规模建设与应用…

3DMAX样条线轮廓修改器插件SplineOffset安装使用方法

3DMAX样条线轮廓修改器插件安装使用教程 3DMAX样条线轮廓插件SplineOffset是3dMax的一个修改器&#xff0c;它可以创建多个样条线克隆&#xff0c;并可以选择增量增加或减少偏移、平移和旋转。在许多方面&#xff0c;它类似于3dMax的内置阵列工具与样条线偏移功能相结合。 3DM…

Go 编程风格指南 - 最佳实践

Go 编程风格指南 - 最佳实践 原文&#xff1a;https://google.github.io/styleguide/go 概述 | 风格指南 | 风格决策 | 最佳实践 注意&#xff1a; 本文是 Google Go 风格 系列文档的一部分。本文档是 规范性(normative) 但不是强制规范(canonical)&#xff0c;并且从属于Goo…