路由的理解

  1. 路由就是一组key-value的对应关系,
  2. 多个路由,需要经过路由器的管理。

路由-基本切换效果

  1. 导航区、展示区
  2. 请来路由器
  3. 制定路由的具体规则(什么路径,对应着什么组件)
  4. 形成一个一个的路由

【两个注意点】

  1. 路由组件通常存放在pagesviews文件夹,一般组件通常存放在components文件夹。
  2. 通过点击导航,视觉效果上“消失”了的路由组件,默认是被卸载掉的,需要的时候再去挂载

【to的两种写法】

  1. to的字符串写法
    <router-link active-class="active" to="/home">主页</router-link>
  2. to的对象写法
    <router-link active-class="active" :to="{path:'/home'}">Home</router-link>

【路由器工作模式】

  1. history模式
    优点:URL更加美观,不带有#,更接近传统的网站URL
    缺点:后期项目上线,需要服务端配合处理路径问题,否则刷新会有404错误。
const router =createRouter({
history:createWebHistory(),//history模式
})
  1. hash模式
    优点:兼容性更好,因为不需要服务器端处理路径。
    缺点:URL带有#不太美观,且在SEO优化方面相对较差。
const router =createRouter({
history:createWebHashHistory(),//hash模式
})

【命名路由】

作用:可以简化路由跳转及传参。
给路由规则命名:

routes:[
{
name:'zhuye',
path:/home',
component:Home
},
{
name:'xinwen',
path:'/news',
component: News,
},
{
name :'guanyu',
path:'/about',
component:About}
]

【嵌套路由】

// 创建一个路由器,并暴露出去// 第一步:引入createRouter
import { createRouter, createWebHistory } from 'vue-router'
// 引入路由组件
import Home from '@/views/Home.vue'
import News from '@/views/News.vue'
import About from '@/views/About.vue'
import Detail from '@/views/Detail.vue'// 第二步:创建路由
const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'zhuye',path:'/home',component:Home},{name:'xinwen',path:'/news',component:News,children:[{name:'xiangqing',path:'detail',component:Detail}] },{name:'guanyu',path:'/about',component:About},]
})
// 第三步:导出
export default router
<template>
<div class="news"><!-- 导航区 -->
<ul>
<li v-for="item in newList" :key="item.id"><!-- 第一种写法 --><!-- <RouterLink :to="`/news/detail?id=${item.id}&title=${item.title}&content=${item.content}`">{{item.title}}</RouterLink> -->
</li>
</ul>
<!-- 展示区 --><div class="news-content"><RouterView></RouterView></div>
</div>
</template>
<script setup lang="ts" name="News">
import { reactive } from 'vue';
import { RouterLink, RouterView } from 'vue-router';
const newList=reactive([{id:'1',title:'一种很便宜的药物',content:'褪黑素'},{id:'2',title:'一种很好吃的水果',content:'芒果'},{id:'3',title:'一种很管报的主食',content:'大米'},{id:'4',title:'一种很催眠的课程',content:'数学'}
])
</script>
<style scoped>
/*新闻*/
.news{padding:0 20px;display:flex;justify-content:space-between;height:100%;
}
.news ul{margin-top:30px;/* list-style:none; */padding-left:10px;
}
.news li::marker{color: #64967E;
}
.news li>a{font-size:18px;line-height:40px;text-decoration:none;color:#64967E;text-shadow:00 1px rgb(0,84,0);
}.news-content {border: 2px solid #333;border-radius: 8px;padding: 15px;margin: 20px;background-color: #f9f9f9;box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
}</style>

【路由传参】

query参数
  1. 传递参数
<template>
<div class="news"><!-- 导航区 -->
<ul>
<li v-for="item in newList" :key="item.id"><!-- 第一种写法 --><!-- <RouterLink :to="`/news/detail?id=${item.id}&title=${item.title}&content=${item.content}`">{{item.title}}</RouterLink> --><!-- 第二种写法 --><RouterLink:to="{path:'/news/detail',query:{id:item.id,title:item.title,content:item.content}}">{{item.title}}</RouterLink>
</li>
</ul>
<!-- 展示区 --><div class="news-content"><RouterView></RouterView></div>
</div>
</template>
<script setup lang="ts" name="News">
import { reactive } from 'vue';
import { RouterLink, RouterView } from 'vue-router';
const newList=reactive([{id:'1',title:'一种很便宜的药物',content:'褪黑素'},{id:'2',title:'一种很好吃的水果',content:'芒果'},{id:'3',title:'一种很管报的主食',content:'大米'},{id:'4',title:'一种很催眠的课程',content:'数学'}
])
</script>
<style scoped>
/*新闻*/
.news{padding:0 20px;display:flex;justify-content:space-between;height:100%;
}
.news ul{margin-top:30px;/* list-style:none; */padding-left:10px;
}
.news li::marker{color: #64967E;
}
.news li>a{font-size:18px;line-height:40px;text-decoration:none;color:#64967E;text-shadow:00 1px rgb(0,84,0);
}.news-content {border: 2px solid #333;border-radius: 8px;padding: 15px;margin: 20px;background-color: #f9f9f9;box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
}</style>
  1. 接收参数
<template><ul class="news-list"><li>编号:{{query.id}}</li><li>标题:{{ query.title}}</li><li>内容:{{ query.content }}</li></ul>
</template>
<script setup lang="ts" name="About">
import { toRefs } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const {query}=toRefs(route)
</script>
params参数
  1. 传递参数
<!--跳转并携带params参数(to的字符串写法)-->
<RouterLink:to="'/news/detail/g01/新闻001/内容g01~">{{news.title}}</RouterLink>
<!--跳转并携带params参数(to的对象写法)-->
<RouterLink
:to="{
name:'xiang',//用name跳转
params:{
id:news.id,
title:news.title,
content:news.title
}
}"
>
{{news.title))
</RouterLink>
  1. 接收参数:
import {useRoute}from vue-router'
const route useRoute()
//打印params参数
console.log(route.params)

备注1:传递params参数时,若使用to的对象写法,必须使用name配置项,不能用path
备注2:传递params参数时,需要提前在规侧中占位。

【路由的props配置】

作用:让路由组件更方便的收到参数(可以将路由参数作为props传给组件)

{
name:'xiang',
path:detail/:id/:title/:content',
component Detail,
//propsi的对象写法,作用:把对象中的每一组key-value作为props传给Detail组件
//props:{a:1,b:2,c:3},
//props的布尔值写法,作用:把收到了每一组params参数,作为props传给Detail组件
//props:true
//props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
props(route){
return route.query
}
}

【replace属性】

  1. 作用:控制路由跳转时操作浏览器历史记录的模式。
  2. 浏览器的历史记录有两种写入方式:分别为pushreplace:
    • push是追加历史记录(默认值)
    • replace是替换当前记录。
  3. 开启replace模式:
    <RouterLink replace.......>News</RouterLink>

【编程式导航】

路由组件的两个重要的属性:$route$router变成了两个hooks

<template><div class="home"><img src="http://www.atguigu.com/images/index_new/logo.png" alt=""></div>
</template>
<script setup lang="ts" name="Home">
import { onMounted } from 'vue';
import { useRouter } from 'vue-router';
const router = useRouter();
onMounted(()=>{setTimeout(()=>{// 跳转router.push('/news')},2000)
})
</script>
<template>
<div class="news"><!-- 导航区 -->
<ul>
<li v-for="item in newList" :key="item.id"><button @click="showNewsDetail(item)">查看新闻</button><!-- 第二种写法 --><RouterLink:to="{name:'xiangqing',query:{id:item.id,title:item.title,content:item.content}}">{{item.title}}</RouterLink>
</li>
</ul>
<!-- 展示区 --><div class="news-content"><RouterView></RouterView></div>
</div>
</template>
<script setup lang="ts" name="News">
import { reactive } from 'vue';
import { RouterLink, RouterView, useRouter } from 'vue-router';
const newList=reactive([{id:'1',title:'一种很便宜的药物',content:'褪黑素'},{id:'2',title:'一种很好吃的水果',content:'芒果'},{id:'3',title:'一种很管报的主食',content:'大米'},{id:'4',title:'一种很催眠的课程',content:'数学'}
])
const router=useRouter();interface NewsInter{id:string,title:string,content:string
}
function showNewsDetail(item:NewsInter){
router.replace({name:"xiangqing",query:{id:item.id,title:item.title,content:item.content}
})
}
</script>
// 创建一个路由器,并暴露出去// 第一步:引入createRouter
import { createRouter, createWebHistory } from 'vue-router'
// 引入路由组件
import About from '@/views/About.vue'
import Detail from '@/views/Detail.vue'
import Home from '@/views/Home.vue'
import News from '@/views/News.vue'// 第二步:创建路由
const router = createRouter({history:createWebHistory(),//路由器的工作模式routes:[{name:'zhuye',path:'/home',component:Home},{name:'xinwen',path:'/news',component:News,children:[{name:'xiangqing',path:'detail',component:Detail,// 第二种写法:函数写法,可以自己决定将什么作为props传给路由组件props(route){return {id:route.query.id,title:route.query.title,content:route.query.content}}}]},{name:'guanyu',path:'/about',component:About},]
})
// 第三步:导出
export default router

pinia

【准备一个效果】

在这里插入图片描述

【存储+读取数据】

  1. Store是一个保存:状态、业务逻辑的实体,每个组件都可以读取、写入它。
  2. 它有三个概念:stategetteraction,相当于组件中的:datacomputedmethods
  3. 具体编码:src/store/count.ts
//引入defineStore用于创建store
import {defineStore}from pinia'
//定义并暴露一个store
export const useCountStore defineStore('count',{
//动作
actions:{},
//状态
state(){
return
sum:6
}
},
//计算
getters:{}
})
  1. 具体编码:src/store/talk.ts
//引入defineStore用于创建store
import {defineStore}from 'pinia'
//定义并暴露一个store
export const useTalkStore =defineStore('talk,{
//动作
actions:{},
//状态
state(){
return{
talkList:[
{id:'yuysada01',content:'你今天有点怪,哪里怪?怪好看的!'}{id:'yuysada02',content:'草莓、蓝莓、蔓越莓,你想我了没?'}{id:"yuysada83",content:"心里给你留了一块地,我的死心扇地"}
]
}
},
//计算
getters:{
})
<template><div class="talk"><button @click="getTalk()">获取一句土味情话</button><ul><li v-for="talk in loveTalkStore.talkList" :key="talk.id">{{ talk.title }}</li></ul></div>
</template><script setup lang="ts" name="LoveTalk">
import axios from 'axios';
import { nanoid } from 'nanoid';
import { reactive } from 'vue';
import { useLoveTalkStore } from '@/store/loveTalk';
const loveTalkStore = useLoveTalkStore();
const talkList = reactive([{id: '1', // 建议统一使用字符串ID,与nanoid生成的ID类型保持一致title: '今天你有点怪,哪里怪?怪好看的!'},{id: '2',title: '草莓、蓝莓、蔓越莓,今天想我了没'},{id: '3',title: '心里给你留了一块地,我的死心塌地',}
])async function getTalk() {// 请求新的土味情话const { data: { content: title } } = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')const obj = { id: nanoid(), title }// 添加到列表最前面talkList.unshift(obj)
}

【修改数据(三种方式)】

  1. 第一种修改方式,直接修改
    countStore.sum =666
  2. 第二种修改方式:批量修改
    countStore.$patch({ sum:999, school:'atguigu' })
  3. 第三种修改方式:借助action修改(action中可以编写一些业务逻辑)
import {defineStore} from pinia
export const useCountStore =defineStore('count',{
actions:{
//加
increment(value number){if (this.sum < 10){//操作countStore中的sumthis.sum +value}
},

【storeToRefs】

  • 借助storeToRefsstore中的数据转为ref对象,方便在模板中使用。
  • 注意:pinia提供的storeToRefs只会将数据做转换,而VuetoRefs会转换store中数据。
<template>
<div class="count">
<h2>当前求和为:{{sum}}</h2>
</div>
</template>
<script setup lang="ts"name="Count">
import {useCountStore} from '@/store/count'
/*引入storeToRefs*/
import {storeToRefs} from pinia'
/*得到countStore*/
const countStore =useCountStore()
/*使用storeToRefs:转换countStore,随后解构*/
const {sum}=storeToRefs(countStore)
</script>

【getters】

  1. 概念:当state中的数据,需要经过处理后再使用时,可以使用getters配置。
  2. 追加getters配置。
//引入defineStore用于创建store
import {defineStore} from pinia'
//定义并暴露一个store
export const useCountStore =defineStore('count',{
//动作
actions:{
/**********/
},
//状态
state(){
return
sum:1,
school:'atguigu'
}
},
//计算
getters:{bigSum:state=>state.sum*10,upperSchool(state){return state.school.toUpperCase()}}
})

【$subscribe】

通过store的$subscribe()方法侦听state及其变化

talkStore.$subscribe((mutate,state)=>{
console.log('LoveTalk',mutate,state)
localStorage.setItem('talk',JSON.stringify(talkList.value))
})

【store组合式写法】

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

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

相关文章

【go】实现BMI计算小程序与GUI/WEB端实现

好的&#xff0c;下面是用 Go 语言实现的一个简单的 BMI&#xff08;Body Mass Index&#xff0c;身体质量指数&#xff09;计算器&#xff0c;包含中文注释与完整代码&#xff0c;可以直接运行。 一、BMI 计算公式 BMI体重&#xff08;kg&#xff09;身高2&#xff08;m2&…

Windows系统优化命令-记录

闲着无聊&#xff0c;近来电脑有些卡顿&#xff0c;记录一下相关命令。最好的命令还是格式化╮(╯▽╰)╭ 1. 磁盘清理相关命令 cleanmgr - 磁盘清理工具 cleanmgr启动磁盘清理工具&#xff0c;可清理临时文件、回收站等内容 diskpart - 磁盘分区工具 diskpart用于磁盘管理&…

BFCP协议学习

BFCP是为了SIP呼叫中实现presentation的二进制协议。开源库libbfcp 如何协商角色 SIP 消息的SDP中有BFCP 的部分&#xff0c;其中s-only 代表要当服务器角色&#xff0c;c-only 代表要当client角色。confid, userid 都是需要在后续消息中对齐的。 通过port信息可以为后续bfcp…

常用设计模式系列(十七)—命令模式

常用设计模式系列&#xff08;十七&#xff09;—命令模式 第一节、前言 各位老铁好&#xff01; 今天我来跟大家分享对象行为型模式第二章节——《命令模式》&#xff0c;“命令”一词&#xff0c;通俗易懂&#xff0c;我们在生活中经常会发出各种各样的命令&#xff0c;就像你…

【AI绘画】Stable Diffusion 全面指南:安装、版本对比、功能解析与高级应用

引言&#xff1a;Stable Diffusion 概述 在人工智能图像生成领域&#xff0c;商业工具如Midjourney凭借其集成化服务与高质量输出占据市场&#xff0c;而Stable Diffusion&#xff08;简称SD&#xff09;则以开源特性构建了差异化优势。与商业工具依赖云端资源、受限于订阅费用…

kafka使用kraft

window 使用kafka-storage生成生成一个uuid .\kafka-storage.bat random-uuid格式化存储 在这里插入代码片.\kafka-storage.bat format -t 对应的uuid D:\configure\fisher\kafka\config\kraft\server.properties 启动命令 .\kafka-server-start.bat D:\configure\fisher\kafka…

HCIA-Datacom认证笔记:IP路由基础——核心概念与路由分类

网络技术学习中&#xff0c;IP路由是绕不开的核心知识点&#xff0c;对于备考HCIA-Datacom认证的朋友来说&#xff0c;掌握路由基础能为后续学习打下良好基础。今天带朋友们梳理一下IP路由的核心概念、路由表结构及路由分类一、路由核心概念什么是路由&#xff1f; 简单来说&am…

FFmpeg 安装与使用

文章目录1. 环境部署&#xff08;Windows&#xff09;1.1. 安装包下载1.2. 配置环境变量1.3. 验证安装2. FFmpeg 基础使用教程2.1. 常用命令格式2.2. 基础功能示例2.2.1. 视频转码&#xff08;MP4 → MKV&#xff09;2.2.2. 调整分辨率&#xff08;1080p → 480p&#xff09;2.…

Python 数据分析(四):Pandas 进阶

目录 1. 概述2. 缺失项3. 分组聚合4. 数据合并5. 数据可视化 5.1 折线图5.2 条形图5.3 直方图5.4 散点图5.5 饼图 1. 概述 我们在上一篇文章初识 Pandas中已经对 Pandas 作了一些基本介绍&#xff0c;本文我们进一步来学习 Pandas 的一些使用。 2. 缺失项 在现实中我们获…

结构化文本文档的内容抽取与版本重构策略

结构化文本文档的内容抽取与版本重构策略 摘要 本文深入探讨了结构化文本文档处理领域中的两大核心技术——内容抽取与版本重构。文章首先分析了结构化文档的特点及其在现代信息管理中的重要性&#xff0c;随后系统性地介绍了文档内容抽取的技术路线与方法论&#xff0c;包括…

【BUUCTF系列】[HCTF 2018]WarmUp1

本文仅用于技术研究&#xff0c;禁止用于非法用途。 Author:枷锁 点开题目显示一个图片&#xff0c;没有任何交互功能&#xff0c;我们直接查看网页源代码我们可以看到有一个歆慕的注释source.php&#xff0c;我们进行拼接&#xff0c;访问一下这个文件在url后加上/source.php进…

Flutter Chen Generator - IconFont Generator

Flutter Chen Generator &#x1f680; 一个强大的Flutter代码生成工具包&#xff0c;包含多个实用的代码生成器。 ✨ 功能特性 &#x1f4c1; 资源生成器 (Assets Generator) &#x1f504; 自动扫描assets目录并生成Dart常量&#x1f9e0; 智能驼峰命名转换&#xff0c;保…

【MATLAB】(二)基础知识

一.MATLAB命令1.指令行“头首”的 “>>” 是 “指令输入提示符” &#xff0c;它是自动输入的。“>>” 为运算提示符&#xff0c;表示MATLAB处于准备就绪状态。如在提示符后输入一条命令或一段程序后按Enter键&#xff0c;MATLAB将给出对应的结果&#xff0c;并将结…

Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零

文章链接 1049. 最后一块石头的重量 II 解题关键&#xff1a;找到重量和尽量相等的两堆 确定dp数组以及下标的含义 dp[j]表示容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为j的背包&#xff0c;最多可以背最大重量为dp[j]。 确定递推公式 01背包…

【A*/BFS】P5507 机关

# P5507 机关 题目描述 这扇门上有一个机关&#xff0c;上面一共有12个旋钮&#xff0c;每个旋钮有4个状态&#xff0c;将旋钮的状态用数字111到444表示 每个旋钮只能向一个方向旋转&#xff08;状态&#xff1a;1->2->3->4->1&#xff09;&#xff0c;在旋转时&am…

终结集成乱局:模型上下文协议(MCP)如何重构AI工具生态?

AI 助手正处于能力发展的初级阶段。它们擅长处理独立任务——例如解析 PDF、编写 SQL 语句、等等——但当你要求它们在 Slack、Gmail 和 Jira 等平台间协同操作时&#xff0c;整个流程就变得异常复杂且脆弱&#xff0c;如同调试一套由众多 API 密钥串联的精密机械&#xff08;鲁…

谈谈毕业工作一年后的变化

文章目录谈谈毕业工作一年后的变化工作篇生活篇谈谈毕业工作一年后的变化 工作篇 2025.7.30 21:49 呼~再次打开这个网站发布文章&#xff0c;是多么陌生。仿佛有说不完的话&#xff0c;但如今时间却不允许我无限制的长篇大论的写下去了。 先说下工作吧。 毕业后工作好快啊&…

huggingface下载问题

国内使用git clone下载huggingfaceTOC 国内直接git clone连接不上问题 git clone https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA Cloning into ‘Emotion-LLaMA’… fatal: unable to access ‘https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA/’: Fai…

anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package

conda issuehttp://t.csdnimg.cn/ndZZK 目录 常规安装 检索包资源 获取指定包的安装源&安装指令 安装指定包 常规安装 conda 常规安装xxx包 conda install xxx conda install有可能会受限于channel导致报错PackagesNotFoundError: The following packages are not av…

python cli命令 cli工具命令 自定义cli命名 开发 兼容 window、mac、linux,调用示例

前言需求背景整个项目基于Python开发&#xff0c;需求方期望不直接调用Python脚本执行&#xff0c;希望封装为cli命令执行Python脚本&#xff0c;使其更为简单而又“优雅”。类似直接使用 adb devices 的方式直接调用运行&#xff0c;而不是 python adbToolls.py devices的方式…