前端框架Vue3(三)——路由和pinia

路由的理解

  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的方式…