【卷起来】VUE3.0教程-08-路由管理

news2024/11/24 7:17:21

在Vue中,我们可以通过vue-router路由管理页面之间的关系。

Vue Router是Vue.js的官方路由,它与Vue.js核心深度集成,让用Vue.js构建单页应用变得轻而易举。

🌲 在Vue中引入路由

  • 安装路由
npm install --save vue-router

  • 建立三个vue组件

<template>
    <h1>关于我们</h1>
</template>

<script setup>
</script>
<template>

    <h1>管理系统主页</h1>
</template>
<template>
    <h1>展示消息</h1>
</template>
  • 配置独立的路由文件

在src中新建一个文件夹router,在其中新建一个index.js

import {createRouter,createWebHistory} from 'vue-router'

const routes = [
    {
        path:'/',
        name:'home',
        component:()=> import('../components/HomeView.vue')
    },{
        path:'/about',
        name:'about',
        component:()=> import('../components/AboutDemo.vue')
    },{
        path:'/show',
        name:'show',
        component:()=> import('../components/ShowDemo.vue')
    }
]

const router=createRouter({
    history:createWebHistory() // 去掉请求后面的#
    ,routes
})

export default router;
  • 在main.js中挂载路由
import axios from 'axios'

import { createApp } from 'vue'
import App from './App.vue'
// 挂载目录
import router from './router'

const app = createApp(App)
app.config.globalProperties.$axios = axios
app.use(router)
app.mount('#app')
  • 指定路由入口和路由跳转
<script setup>

  
</script>

<template>
  <!-- <AxiosDemo></AxiosDemo> -->
  <!-- <RequestAxiosDemo></RequestAxiosDemo> -->
  <div>
    <nav>
      <!--指定路由显示入口和跳转路径 -->
      <RouterLink to="/">Home</RouterLink> | 
      <RouterLink to="/about">About</RouterLink> | 
      <RouterLink to="/show">Show</RouterLink>
    </nav>
  </div>
  <div>
    <!--路由入口  -->
    <RouterView></RouterView>
    <!-- <router-view></router-view> -->
  </div>
 
</template>


  • 配置好后,可以使用<router-view> 或者<RouterView>指定路由入口
  • 可以使用<router-link> 或者<RouterLink> 指定路由跳转

🌲 路由传参

页面跳转过程中,是可以携带参数的,这也是很常见的业务

比如:在一个列表项,点击进入查看每个列表项的详情

  • 第一步:在路由配置中指定参数的key
{
    path:'/hero/:id',
    name:"delete",
    component:()=>import("../components/DeleteDemo.vue")
}
  • 第二步:在跳转过程中携带参数
<nav>
  <RouterLink to="/">Home</RouterLink> | 
  <RouterLink to="/about">About</RouterLink> | 
  <RouterLink to="/show">Show</RouterLink>|
  <router-link :to="{name:'delete', params: {id:23}}"> 删除数据</router-link>  
</nav>  
  • 第三步:在详情页面读取路由携带的参数:
    • 模板中读取: this.$route.params.id }
template>
    <h1>删除消息</h1>
    <!-- <div>{{ result }}</div> -->
    <div >{{ this.$route.params.id }}</div>
</template>
    • js中读取:route.params.id
<script setup>
    import axios from 'axios';
    import { reactive,ref } from 'vue';
  import router  from '../router'
    import { useRoute } from 'vue-router';
    //获取通过函数获取route对象
    const route = useRoute()
    const result = reactive({})
    axios.delete("/api/hero/"+route.params.id).then(res=>{
        result.value = res.data
        console.log(res.data)
      // 路由跳转:类似于Servlet中的重定向
        router.push("/show")
    })
</script>

完整案例代码:

import {createRouter,createWebHistory} from 'vue-router'


const routes = [
    {
        path:'/',
        name:'home',
        component:()=> import('../components/HomeView.vue')
    },{
        path:'/about',
        name:'about',
        component:()=> import('../components/AboutDemo.vue')
    },{
        path:'/show',
        name:'show',
        component:()=> import('../components/ShowDemo.vue')
    },{
        path:'/hero/:id',
        name:"delete",
        component:()=>import("../components/DeleteDemo.vue")
    }
]

const router=createRouter({
    history:createWebHistory() // 去掉请求后面的#
    ,routes
})

export default router;
<template>
    <h1>删除消息</h1>
    <!-- <div>{{ result }}</div> -->
    <div >{{ this.$route.params.id }}</div>
</template>

<script setup>
    import axios from 'axios';
    import { reactive,ref } from 'vue';
    import router  from '../router'
    import { useRoute } from 'vue-router';
    //获取通过函数获取route对象
    const route = useRoute()
    const result = reactive({})
    axios.delete("/api/hero/"+route.params.id).then(res=>{
        result.value = res.data
        console.log(res.data)
        
        // 路由跳转:类似于Servlet中的重定向
        router.push("/show")
    })
</script>

<script setup>

  
</script>

<template>
  <!-- <AxiosDemo></AxiosDemo> -->
  <!-- <RequestAxiosDemo></RequestAxiosDemo> -->
  <div>
    <nav>
      <RouterLink to="/">Home</RouterLink> | 
      <RouterLink to="/about">About</RouterLink> | 
      <RouterLink to="/show">Show</RouterLink>|
      <router-link :to="{name:'delete', params: {id:26}}"> 删除数据</router-link>
      
    </nav>  
  </div>
  <div>
    <RouterView></RouterView>
    <!-- <router-view></router-view> -->
  </div>
 
</template>


🌲VUE的状态管理(VUEX)

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采 用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

简单来说,状态管理可以理解成为了更方便的管理组件之间的数据交互,提供了一个集中式的管理方案,任何组件都可以按照指定的方式进行读取和改变数据

🌿 引入Vuex的步骤

第一步:安装VueX

npm install --save vuex

第二步:配置Vuex文件

在src目录下,新建一个store文件夹,并在其中新建一个index.js,内容如下:


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:20
    }
})

第三步,在main.js中引入vuex

import axios from 'axios'

import { createApp } from 'vue'
import App from './App.vue'
// 挂载路由目录
import router from './router'
//引入状态管理
import store from './store'

const app = createApp(App)
app.config.globalProperties.$axios = axios
// 使用路由
app.use(router)
// 使用状态管理
app.use(store)
app.mount('#app')

第四步:在需要的位置获取状态管理中的数据

  • 在模板中获取:{{$store.state.counter  }}
  • 在js中获取: computed(() => store.state.counter)

具体写法:


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}"次"</p>
    <p>当下访问了{{counter }}"次"</p>
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    const counter = computed(() => store.state.counter)
    
</script>

🌿 Getter

对Vuex中的数据进行过滤


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
        getCount(state){
            return state.counter>18?state.counter:
              "当前访问人数太少,才"+state.counter
        }
    }
})

getter的访问方式:


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.getters.getCount  }}"次"</p>
    <p>当下访问了{{counter }}"次"</p>
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    const counter = computed(() => store.getters.getCount)
    
</script>

🌿 Mutaion

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数.


import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
        getCount(state){
            return state.counter>18?state.counter:"当前访问人数太少,才"+state.counter
        
        }
    },
    mutations:{
        setCounter(state,num){
            state.counter += num
        }
    }
})

在js中调用修改数据的方法


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}次</p>
    <!-- <p>当下访问了{{counter }}"次"</p> -->
 
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    // const counter = computed(() => store.getters.getCount)
    
    // 修改count属性值
    store.commit("setCounter",20)     
</script>

在另一个vue文件中访问状态管理的值,看是否能正常访问到修改后的值

<template>

    <h1>管理系统主页</h1>

    <p>当下访问了{{$store.state.counter  }}次</p>
</template>

<script setup>

</script>

🌿 Action

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态
  • Action 可以包含任意异步操作

import axios from 'axios'
import {createStore} from 'vuex'

export default createStore({
    state:{
        // 当下状态管理中,存的数据
        counter:18
    },
    getters:{
  		  //自定义的方法名
        getCount(state){
            return state.counter>18?state.counter:"当前访问人数太少,才"+state.counter
        
        }
    },
    mutations:{
       //自定义的方法名
        setCounter(state,num){
            state.counter += num
        }
    },
    actions:{
        //自定义的方法名
        asyncSetCount({commit}){
            axios.get("http://iwenwiki.com/api/generator/list.php")
                .then(res => {
                    console.log(res.data)
                    commit("setCounter",res.data[0])
                })
        }
    }
})

在js中调用自定义的actions方法:

store.dispatch("asyncSetCount")


<template>
    <h1>关于我们</h1>
    <!-- 在模板中获取状态管理中存的值 -->
    <p>当下访问了{{$store.state.counter  }}次</p>
    <!-- <p>当下访问了{{counter }}"次"</p> -->
 
</template>

<script setup>
    import { computed } from 'vue';
    // 在js中获取状态管理中存的值
    import { useStore } from "vuex"
    const store = useStore()
    // 需要通过计算属性
    // const counter = computed(() => store.getters.getCount)
    
    // 修改count属性值
    // store.commit("setCounter",20)

    store.dispatch("asyncSetCount")
  
    
</script>

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

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

相关文章

【C++登堂入室】类和对象(中)——类的6个默认成员函数

目录 一、类的6个默认成员函数 ​编辑二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特征 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 六、日期类的实现 七、const成员 八、…

气膜建筑:设备吊装口临时封闭的理想选择—轻空间

在设备吊装作业中&#xff0c;吊装口的临时封闭对于保障工作环境安全、设备保护及操作顺利至关重要。传统封闭方式&#xff0c;如钢结构或简易的盖板封闭&#xff0c;不仅耗时耗力&#xff0c;还可能影响施工效率。气膜建筑技术凭借其轻便、快速和高效的特点&#xff0c;为设备…

亚信安全亮相2024国家网安周主会场,多样活动助推行业新发展

9月9日至15日&#xff0c;2024年国家网络安全宣传周在全国范围内统一开展。本届网安周以“网络安全为人民&#xff0c;网络安全靠人民”为主题&#xff0c;亚信安全网安周系列活动在全国30多个城市全面展开&#xff0c;通过线下展览、专题论坛和网络安全知识宣讲等多种形式&…

【软件方案】大屏可视化智能展示平台解决方案(word原件完整版)

构建综合大屏可视化展示平台&#xff0c;旨在整合各业务板块&#xff0c;打造统一大数据分析引擎。此平台将深度融合数据驾驶舱与智慧调度系统&#xff0c;实现对企业运营的全面洞察与高效指挥。我们深入钻研客户信息数据&#xff0c;秉承“大数据”精髓&#xff0c;推动业务模…

【测试八股】软件测试面试八股文

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 以下是软件测试相关的面试题及答案&#xff0c;希望对各位能有帮助&#xff01; 1、测试分为哪几个阶段? 一般来说分为5个阶段&#xff1a;单元测试、集成测试…

警惕!血糖升高初期,这10大微妙信号你捕捉到了吗?

在这个快节奏的时代&#xff0c;饮食不规律、缺乏运动等生活习惯悄然间让高血糖这一“隐形杀手”潜伏在我们身边。然而&#xff0c;高血糖并非悄无声息&#xff0c;它在早期往往会通过一系列微妙却重要的身体信号向我们发出警告。今天&#xff0c;就让我们一同揭开血糖高早期的…

【Unity错误】No cloud project ID was found by the Analytics SDK

在编译默认的URP 2D项目时&#xff0c;出现这样一个错误&#xff1a;No cloud project ID was found by the Analytics SDK. This means Analytics events will not be sent. Please make sure to link your cloud project in the Unity editor to fix this problem. 原因&…

yolov5明厨亮灶检测系统,厨师帽-口罩检测,带pyqt界面-可检测图片和视频,支持中文标签,检测接口已封装好并优化,代码可读性强!

明厨亮灶检测系统是一个专门用于餐饮业厨房安全监管的智能系统。该系统结合了先进的计算机视觉技术&#xff0c;尤其是使用YOLOv5模型进行厨师帽和口罩的实时检测&#xff0c;并通过PyQt5构建了一个用户友好的图形界面。该系统不仅能够检测图片和视频中的目标&#xff0c;而且支…

如何看待 IBM 中国研发部裁员?

文章目录 引言背景趋势与影响人才发展对 IT 人才市场的影响IT 从业者积极应对全球化挑战 产业发展IT 产业的应对策略提升核心竞争力 结语 引言 近日&#xff0c;IBM 中国宣布撤出在华两大研发中心&#xff0c;引发了 IT 行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅…

共享打印机无法连多种错误代码原因分析及解决方法

日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;在添加共享或使用共享打印机过程中&#xff0c;经常会遇各种问题。然后我们在添加共享打印机遇到最多的向种错误&#xff1a;0x0000011b、0x000004005、0x000006d9、0x00000040等等&#xff0c;然后这…

ggplot2 缩小的/一般长度的、带箭头的坐标轴 | R语言

1. 效果图 左侧为DimPlot2()效果图。 右侧为DimPlot()效果图&#xff0c;原图。 2. 代码 axis.line element_line(arrow arrow(type "open", length unit(0.3, "cm"))), 其中: type"open"表示是开放箭头&#xff0c;type“closed” 表示是…

云手机哪一款好用?手游专用云手机一览!VMOS云手机

云手机&#xff0c;顾名思义&#xff0c;是一台运行在云端服务器上的虚拟手机。它具备传统手机的所有功能&#xff0c;但无需实际设备支持运算和存储。所有的计算、存储以及应用运行都由云端服务器承担。用户只需通过浏览器或客户端访问云手机的操作界面&#xff0c;就可以像操…

挖耳勺可以和别人共用吗?口碑好的可视耳勺!

人体分泌的耳垢会有细菌&#xff0c;如果与别人共用挖耳勺很有可能会交叉感染&#xff0c;所以一般建议自己有专用的挖耳勺。小编可以给大家分享一款超好用又能实现一人一用的挖耳勺--可视挖耳勺&#xff0c;它有着高清内窥镜可以进入耳道实时查看情况&#xff0c;并且耳勺头采…

用Postman调试是英文导致系统语言变成英文,SQL语句查询不出来对应的字段,出现SAP系统里面调试是有值的,但是外部调用是没有值的!

用Postman调试是英文导致系统语言变成英文&#xff0c;SQL语句查询不出来对应的字段&#xff0c;出现SAP系统里面调试是有值的&#xff0c;但是外部调用是没有值的&#xff01;后面调试了非常久&#xff0c;一直以为是有特殊字符导致的&#xff0c;后面处理了特殊字符之后还是不…

学生宿舍安全用电的重要性

一、宿舍用电安全的重要性 宿舍是学生学习和生活的场所&#xff0c;也是人员密集的地方。一旦发生用电安全事故&#xff0c;不仅会造成财产损失&#xff0c;还会危及学生的生命安全。因此&#xff0c;宿舍用电安全是学校和学生必须高度重视的问题。 二、宿舍用电安全注意事项 1…

QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?

文章目录 一、什么是 qgis&#xff1f;二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新&#xff0c;保证是最新数据&#xff1f;五、总结 一、什么是 qgis&#xff1f; QGIS&#xff08;原称Quantum GIS&#xff09;是一个用户界面友好的开源桌面端软件&…

python安装包的三种区别

python安装包的三种区别&#xff1a; Download Windows x86 web-based installer Download Windows x86 executable installerDownload Windows x86 embeddable zip fileDownload Windows x86-64 web-based installerDownload Windows x86-64 executable installerDownload W…

【C++】入门基础(上)

Hi&#xff0c;好久不见&#xff01; 目录 1、C入门小基础 1.1 祖师爷--Bjarne Stroustrup&#xff08;本贾尼斯特劳斯特卢普&#xff09; 1.2 C参考文献 1.3 书籍推荐 2、C的第一个程序 3、命名空间 3.1 namespace的价值 3.2 namespace的定义 3.3 命名空间的使…

乐学英语四六级学习系统小程序的开发---附源码78055

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1经济可行性 2.1.2技术可行性 2.1.3社会可行性 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 …

Java 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)

给定两条线段(p1, q1)和(p2, q2)&#xff0c;判断给定的线段是否相交。 在讨论解决方案之前&#xff0c;让我们先定义方向的概念。平面中有序点三元组的方向可以是 –逆时针 –顺时针 –共线 下图显示了&#xff08;a&#xff0c;b&#xff0c;c&#xff09; 的不同可能方…