vue3.0之Router的使用你了解嗎
vue3.0之Router的使用
先創(chuàng)建一個(gè) vue項(xiàng)目
命名式 路由
命名式 路由
- 就是給路由添加 name屬性
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/home/Home.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: '/reg', name: 'Reg', component: () => import('../views/reg/Reg.vue'), }, ], }) export default router
使用 RouterLink
<script setup lang="ts"> import { RouterLink, RouterView } from 'vue-router' </script> <template> <div> <RouterView /> <RouterLink :to="{ name: 'Login' }">login</RouterLink> <RouterLink style="margin-left: 10px" :to="{ name: 'Reg' }">reg</RouterLink> </div> </template> <style> @import '@/assets/base.css'; #app { max-width: 1280px; margin: 0 auto; padding: 2rem; font-weight: normal; } </style>
效果
編程式導(dǎo)航
router / index.ts
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/home/Home.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: '/login', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: '/reg', name: 'Reg', component: () => import('../views/reg/Reg.vue'), }, ], }) export default router
App.vue 跳轉(zhuǎn)到路由
router.push(’/login’) 跳轉(zhuǎn)字符串
<template> <div> <button @click="loginClick">登錄</button> <button @click="regClick">注冊(cè)</button> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() const loginClick = () => { router.push('/login') } const regClick = () => { router.push('/reg') } </script> <style> @import '@/assets/base.css'; #app { max-width: 1280px; margin: 0 auto; padding: 2rem; font-weight: normal; } </style>
效果
router.push({ path: url }) 對(duì)象的形式
<template> <div> <button @click="toPage('/login', 'Login')">登錄</button> <button @click="toPage('/reg', 'Reg')">注冊(cè)</button> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() const toPage = (url: string, name: string) => { // 對(duì)象的形式 router.push({ path: url, }) } </script>
命名式路由模式 router.push({ name: name })
<template> <div> <button @click="toPage('/login', 'Login')">登錄</button> <button @click="toPage('/reg', 'Reg')">注冊(cè)</button> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() const toPage = (url: string, name: string) => { // 命名式路由模式 router.push({ name: name, }) } </script>
歷史記錄
- replace的使用
- 采用replace進(jìn)行頁面的跳轉(zhuǎn)會(huì)同樣也會(huì)創(chuàng)建渲染新的Vue組件,但是在history中其不會(huì)重復(fù)保存記錄,而是替換原有的vue組件
RouterLink 跳轉(zhuǎn)路由
<template> <div> <RouterLink replace :to="{ name: 'Login' }">login</RouterLink> <RouterLink replace style="margin-left: 10px" :to="{ name: 'Reg' }">reg</RouterLink> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() </script>
效果
編程式導(dǎo)航
<template> <div> <button @click="toPage('/login', 'Login')">登錄</button> <button @click="toPage('/reg', 'Reg')">注冊(cè)</button> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() const toPage = (url: string, name: string) => { // 字符串的形式 router.replace(url) // 對(duì)象的形式 // router.push({ // path: url, // }) // 命名式路由模式 // router.push({ // name: name, // }) } </script>
非歷史 記錄的導(dǎo)航 還可以使用 方法
- 使用 router.push的方式,是存在歷史記錄的
- 因此可以使用 router.go的方法
- router.go(1) 前進(jìn)一個(gè)路由
- router.go(-1) 后退一個(gè)路由
<template> <div> <button @click="toPage('/login', 'Login')">登錄</button> <button @click="toPage('/reg', 'Reg')">注冊(cè)</button> <button @click="nextClick">next</button> <button @click="prerClick">prer</button> <RouterView /> </div> </template> <script setup lang="ts"> import { RouterLink, RouterView, useRouter } from 'vue-router' const router = useRouter() const toPage = (url: string, name: string) => { // 字符串的形式 router.push(url) } const prerClick = () => { router.go(-1) } const nextClick = () => { router.go(1) } </script>
路由傳參
query 方式傳參(拼接在url上)
- 注意點(diǎn):就是使用路由的跳轉(zhuǎn),是使用 router這個(gè)對(duì)象
import { useRouter } from 'vue-router'
const router = useRouter()
router.push( { name: "Reg" , query : Obj })
- 注意點(diǎn)2:使用路由的獲取參數(shù),是使用 route這個(gè)對(duì)象,去獲取url參數(shù)的數(shù)據(jù)(也就是路由傳遞的參數(shù)數(shù)據(jù))
import { useRoute } from 'vue-router'
const route = useRoute()
route.query.XXX數(shù)據(jù)
商品頁
<template> <div class="login"> <div>Login</div> <div v-for="item in data" :key="item.id">{{ item.name }} -- {{ item.price }} <button @click="view(item)">詳情</button></div> </div> </template> <script setup lang="ts"> import { reactive } from 'vue' import { useRouter } from 'vue-router' import { data } from './List.json' const router = useRouter() type List = { name: string price: number id: number } const view = (List: List) => { router.push({ name: 'Reg', query: List, }) } </script> <script lang="ts"> export default { name: 'Login', } </script> <style lang="scss" scoped> .login { width: 400px; height: 400px; background: pink; } </style>
List.json
{ "data": [{ "name": "菜雞", "price": 111, "id": 1 }, { "name": "菜狗", "price": 222, "id": 2 }, { "name": "菜鳥", "price": 333, "id": 3 }] }
詳情頁
<!-- 描述: 作者:xzl 時(shí)間:03月25日201225 --> <template> <div class="reg"> <div>我是詳情頁面 -- <button @click="router.back()">返回</button></div> <div> <div>唯一值:{{ route.query.id }}</div> <div>名稱:{{ route.query.name }}</div> <div>價(jià)格:{{ route.query.price }}</div> </div> </div> </template> <script setup lang="ts"> import {} from 'vue' import { useRoute, useRouter } from 'vue-router' const route = useRoute() const router = useRouter() console.log('route', route.query) </script> <script lang="ts"> export default { name: 'Reg', } </script> <style lang="scss" scoped> .reg { width: 400px; height: 400px; background: orange; } </style>
效果
params傳遞參數(shù) (不會(huì)顯示在url上,但是一刷新會(huì)丟失數(shù)據(jù))
商品頁
<!-- 描述: 作者:xzl 時(shí)間:03月25日201105 --> <template> <div class="login"> <div>Login</div> <div v-for="item in data" :key="item.id">{{ item.name }} -- {{ item.price }} <button @click="view(item)">詳情</button></div> </div> </template> <script setup lang="ts"> import { reactive } from 'vue' import { useRouter } from 'vue-router' import { data } from './List.json' const router = useRouter() type List = { name: string price: number id: number } const view = (List: List) => { // router.push('/reg') router.push({ name: 'Reg', params: List, }) } </script> <script lang="ts"> export default { name: 'Login', } </script> <style lang="scss" scoped> .login { width: 400px; height: 400px; background: pink; } </style>
詳情頁
<!-- 描述: 作者:xzl 時(shí)間:03月25日201225 --> <template> <div class="reg"> <div>我是詳情頁面 -- <button @click="router.back()">返回</button></div> <div> <div>唯一值:{{ route.params.id }}</div> <div>名稱:{{ route.params.name }}</div> <div>價(jià)格:{{ route.params.price }}</div> </div> </div> </template> <script setup lang="ts"> import {} from 'vue' import { useRoute, useRouter } from 'vue-router' const route = useRoute() const router = useRouter() console.log('route', route.query) </script> <script lang="ts"> export default { name: 'Reg', } </script> <style lang="scss" scoped> .reg { width: 400px; height: 400px; background: orange; } </style>
動(dòng)態(tài)路由的 傳參(需要在路由的path添加一個(gè)動(dòng)態(tài)參數(shù),瀏覽器刷新后,數(shù)據(jù)不會(huì)丟失)
- 注意點(diǎn):就是在路由之中,對(duì)path路徑添加一個(gè)動(dòng)態(tài)的路由參數(shù)
- 在商品頁之中,使用router.push的方式去跳轉(zhuǎn),里面用params的形式去接受那個(gè)動(dòng)態(tài)參數(shù)
- 在詳情頁之中,使用route對(duì)象的形式去拿到數(shù)據(jù),
route.params.id
路由
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/home/Home.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: '/login', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: '/reg/:id', name: 'Reg', component: () => import('../views/reg/Reg.vue'), }, ], }) export default router
商品頁
<template> <div class="login"> <div>Login</div> <div v-for="item in data" :key="item.id">{{ item.name }} -- {{ item.price }} <button @click="view(item)">詳情</button></div> </div> </template> <script setup lang="ts"> import { reactive } from 'vue' import { useRouter } from 'vue-router' import { data } from './List.json' const router = useRouter() type List = { name: string price: number id: number } const view = (List: List) => { router.push({ name: 'Reg', params: { id: List.id, }, }) } </script> <script lang="ts"> export default { name: 'Login', } </script> <style lang="scss" scoped> .login { width: 400px; height: 400px; background: pink; } </style>
詳情頁
<template> <div class="reg"> <div>我是詳情頁面 -- <button @click="router.back()">返回</button></div> <div> <div>唯一值:{{ item.id }}</div> <div>名稱:{{ item.name }}</div> <div>價(jià)格:{{ item.price }}</div> </div> </div> </template> <script setup lang="ts"> import {} from 'vue' import { useRoute, useRouter } from 'vue-router' const route = useRoute() const router = useRouter() import { data } from '../login/List.json' const item = data.find((item) => item.id === Number(route.params.id)) </script> <script lang="ts"> export default { name: 'Reg', } </script> <style lang="scss" scoped> .reg { width: 400px; height: 400px; background: orange; } </style>
效果
嵌套路由 與 路由重定向
路由
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/home/Home.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', name: 'home', component: Home, children: [ { path: '', redirect: 'login', // 路由重定向 默認(rèn)顯示 login組件 }, { path: 'login', name: 'Login', component: () => import('../views/login/Login.vue'), }, { path: 'reg', name: 'Reg', component: () => import('../views/reg/Reg.vue'), }, ], }, ], }) export default router
App.vue
<template> <div> <router-view /> </div> </template> <script setup lang="ts"> import { RouterView } from 'vue-router' </script> <style> @import '@/assets/base.css'; #app { max-width: 1280px; margin: 0 auto; padding: 2rem; font-weight: normal; } </style>
Home.vue
<template> <div> <router-view></router-view> <div>我是父路由Home</div> <button @click="router.push('/reg')">去注冊(cè)</button> </div> </template> <script setup lang="ts"> import { RouterView } from 'vue-router' import { useRouter } from 'vue-router' import {} from 'vue' const router = useRouter() </script> <script lang="ts"> export default { name: 'Home', } </script> <style lang="scss" scoped></style>
登錄
<template> <div>Login</div> </template>
注冊(cè)
<template> <div>Reg</div> </template>
效果
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue項(xiàng)目結(jié)構(gòu)目錄超詳細(xì)介紹
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目結(jié)構(gòu)目錄超詳細(xì)介紹的相關(guān)資料,Vue項(xiàng)目目錄結(jié)構(gòu)是指在開發(fā)Vue項(xiàng)目時(shí),為了更好地組織和管理代碼,將不同的文件按照一定的規(guī)則和層次結(jié)構(gòu)進(jìn)行分類和存放的方式,需要的朋友可以參考下2023-12-12vue通信方式EventBus的實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了vue通信方法EventBus的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06vue自定義加載指令v-loading占位圖指令v-showimg
這篇文章主要為大家介紹了vue自定義加載指令和v-loading占位圖指令v-showimg的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁以及右鍵菜單功能
這篇文章主要給大家介紹了關(guān)于Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁以及右鍵菜單功能的相關(guān)資料,Vue?3和Element?Plus提供了一種簡單的方法來實(shí)現(xiàn)側(cè)邊菜單欄與標(biāo)簽頁之間的聯(lián)動(dòng),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09vue項(xiàng)目使用electron進(jìn)行打包操作的全過程
我們都知道Electron項(xiàng)目分為了主進(jìn)程和渲染進(jìn)程,主進(jìn)程其實(shí)就是我們的Electron,渲染進(jìn)程就相當(dāng)于我們的Vue項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目使用electron進(jìn)行打包操作的全過程,需要的朋友可以參考下2023-03-03Vue computed實(shí)現(xiàn)原理深入講解
computed又被稱作計(jì)算屬性,用于動(dòng)態(tài)的根據(jù)某個(gè)值或某些值的變化,來產(chǎn)生對(duì)應(yīng)的變化,computed具有緩存性,當(dāng)無關(guān)值變化時(shí),不會(huì)引起computed聲明值的變化。產(chǎn)生一個(gè)新的變量并掛載到vue實(shí)例上去2022-10-10