vue笔记3 VueRouter VueX详细讲解

vueRouter & vueX

看到这里的朋友如果没有看过前几期,可以通过文章的链接跳转到第一期,从第一期的 vue2 语法开始学习,如果是复习的朋友,也可以看本期只学习 vueRouter & VueX

项目初始化

经过上期,我们学习了 vue cli 和组件通信以及插槽,这期来学习 vueRouter & vueX

首先这次也是使用 vue cli 创建一个项目,但是这次我们需要自己选择依赖,先选择一个文件夹,放置项目

使用cmd

vue create vue2-vuerouter

这里选择 Manually select features

把 router 和 vuex 选择上

这里通过上下键移动, 空格键选择

选择完成按回车创建项目

选择 vue2

这里选择 y

使用 history 的方式,下面会讲解 history 和 hash 方式的区别

这里不选择 eslink ,就选择第一个

选择 link on sava

选择 in package.json

这里不要选择保存历史,因为现在只是学习阶段

等待安装依赖项目

这里安装完成后,可以使用命令启动项目。

cd vue2-vuerouter

npm run serve

项目启动成功在 8080 端口,打开浏览器访问:

然后这个 Home 和 About 就可以让我们在不切换页面的情况下作页面内容的跳转,其实这是一个但也应用

hash 和 history的区别:

其实路由是有两种表现样式的:

第一种:http://localhost:8080/about (history)

优点: 看起来好看,不容易让用户察觉出这是一个单页面应用

缺点: 可能不兼容低版本浏览器

第二种:http://localhsot:/#/about (hash)

优点: 兼容低版本浏览器

缺点: 看起来不好看,用户知道是单页面应用

分析目录结构:

打开项目使用开发者工具:

vue2-vuerouter/
├── .idea/                  # IDE 配置文件 (WebStorm/IntelliJ)
├── node_modules/           # 第三方依赖库 (标记为 libraryroot)
├── public/                 # 静态公共资源
├── src/                    # 源代码目录
│   ├── assets/             # 静态资源(图片/样式等)
│   ├── components/         # 公共组件
│   ├── router/             # 路由配置
│   ├── store/              # Vuex 状态管理
│   ├── views/              # 页面级组件
│   ├── App.vue             # 根组件
│   └── main.js             # 应用入口文件
├── .gitignore              # Git忽略规则
├── babel.config.js         # Babel配置
├── jsconfig.json           # JS路径配置
├── package.json            # 项目配置和依赖
├── package-lock.json       # 依赖版本锁定
├── README.md               # 项目说明文档
└── vue.config.js           # Vue自定义配置

这里发现多了 router 还有 store 还有 view 这几个包,这是我们引入的 vueRouter 还有 Vuex

vueRouter

仔细观察,会发现,这里主页的两个页面分别是 view 包中的两个组件

也就是说,我们只要通过 vueRouter 的配置,就可以添加页面

这里我们新建一个 testView 页面试试

<script setup></script><template>
<div>这是test测试页面
</div>
</template><style scoped></style>

找到 router/index.js 添加配置

这里我们先可以分析一下源代码

首先导入 Vue 实例, 导入 VueRouter 实例,导入 HomeView 组件,并且 Vue.use 使用开启 VueRouter

紧接着是一个数组,这个数组种放置我们的路由配置

最后 new 了一个 VueRouter , 使用 history 模式, base 是我们服务器的默认地址, routes 是上面定义的页面配置文件

最后导出 router 实例

所以 Vue cli 都帮我们做好配置了, 我们只需要添加页面

这里再 routes 数组中添加我们的页面

这里我们添加了,但是注意一个点,我们还需要一个按钮,来跳转到这个界面,这是需要我们自己定义的

在 app.vue 中添加 router-link to=“/test”

这里需要讲解一下这两个标签的作用了:

router-link to

这个标签是用来进行路由跳转的时候,需要我们自己有一个跳转的 link 位置

router-view

这个标签也就是我们 Home 或者 About 或者 Test ,他会根据我们点的标签的路由, 渲染我们在 routes 数组中配置的路由地址

动态路由:

这里为了方便演示,我们再次添加一个路由:

  1. 新建 ArticleView 组件

  1. 配置文件 routes 添加

  1. 添加一个router-link to

代码:

App.vue

<template><div id="app"><nav><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link>|<router-link to="/test">Test</router-link>|<router-link to="/article">Article</router-link></nav><router-view/></div>
</template><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}nav {padding: 30px;
}nav a {font-weight: bold;color: #2c3e50;
}nav a.router-link-exact-active {color: #42b983;
}
</style>
<script setup lang="ts">
</script>

/router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import TestView from "../views/TestView.vue";
import ArticleView from "@/views/ArticleView.vue";Vue.use(VueRouter)const routes = [{path: '/',name: 'home',component: HomeView},{path: '/test',name: 'test',component: TestView,},{path: '/article',name: 'article',component: ArticleView,},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (about.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')}
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router

view/Article.vue

<script setup></script><template>
<div>这是一个文章组件
</div>
</template><style scoped></style>

先看效果:

这里如何修改为动态路由呢?

  1. 在 routes 中的 path 添加 /: id

并且 props :true,这部很重要,可以使用 props 接收

/ : 加上你的参数

这就是一个动态路由

  1. router-link to 添加一个id

由于我们现在是静态的只能这样演示

我们可以在文章组件中获取到当前文章 id ,这样可以展示文章详情

嵌套路由:

对于每一个路由,都可以有子路由

这里配置一个 Article 文章组件的子路由

  1. 配置 routes 为路由配置 children 子路由属性

  {path: '/article/:id',name: 'article',component: ArticleView,props: true,children:[{path:'info1',name:'info1',component: info1View,},{path:'info2',name:'info2',component: info2View,},]},
  1. 添加 link to

<script>
export  default  {name: 'ArticleView',props:{id:{type:Number,required:true}}
}
</script><template>
<div>这是一个文章组件<div>文章id为:{{id}}</div><div><router-link :to="`/article/${id}/info1`">info1</router-link> |<router-link :to="`/article/${id}/info2`">info2</router-link></div><router-view></router-view>
</div>
</template><style scoped></style>

这里的 link to 大家需要注意, 由于我们的上一级是动态 id 路由,所以我们需要进行模板字符串的拼接

并且要使用 v-bind 的方式动态绑定数据,这里简写 :to

  <router-link :to="`/article/${id}/info1`">info1</router-link> |
  1. view-router 渲染

其实我们发现,不管是使用一级路由还是二级路由,都是需要这几步

routes配置, link to 跳转位置, view-router 渲染内容

编程式导航与路由传参:

大家发现了吗,在我们这里的导航都是需要自己去手动的单击路由入口,我们也可以使用代码做页面跳转,这就是编程式导航,比如说,我们点进去 info2 页面,过三秒钟跳转到 home

我们可以在 info2 界面使用一个 vue 的生命周期函数 created 函数,这是在我们的组件创建完成,但是 Dom 尚未挂载时,可以访问数据的一个函数。

使用 this.router做跳转,这里的this.router 做跳转, 这里的 this.router做跳转,这里的this.router 并不是我们刚刚开始实例的 router 对象,这个对象是 Vue 帮我们创建的一个代理对象,与原对象隔离。

这里可以使用它做跳转

<script>export default  {name: "info1View",created() {setTimeout(()=>{this.$router.push({path:'/',query:{id: 3}})},3000);}
}
</script><template>
<div>这是子路由info1</div>
</template><style scoped></style>

这里使用 push 跳转的同时通过 path + query 的方式传递参数,等同于在地址上拼接了一个

baseUrl + ?id = 3的方式

这样携带参数的方式有两种:

// ✅ 正确:path + query
this.$router.push({path: '/user',query: { id: '123' } // → /user?id=123
})// ⚠️ 错误:path + params 会被忽略!
this.$router.push({path: '/user',params: { id: '123' } // params 无效!
})// ✅ 正确:name + params
this.$router.push({name: 'user',params: { id: '123' } // → /user/123
})

如何获取携带的参数:

我们只需要在组件创建完成的时候,使用 this.$route.query.id接受

对于 this.router和this.router 和 this.routerthis.route 这两个代理实例

我的理解是 this.$router 是包含路由行为的一个实例对象,也就是做跳转导航方法等

this.$route 这更像是一个路由信息表,存储我们的一些路由信息

导航守卫:

这里就要使用到 router 了

为了方便起见,我们可以在路由配置文件中,使用 router 对象的 beforEach 做一个导航守卫

其实导航守卫的作用就是可以让我们在路由跳转前后进行不同的操作

比如这里在每次路由跳转前都打印一些路由跳转信息

这里解释一些 to from next

to 是去到哪一个路由

from 是从哪一个路由来

next 是放行

这里可以看见我切换路由的信息

通常这个导航守卫是可以做加载动画,或者权限校验,对于一些不允许用户权限访问的页面,可以进行拦截

vueX

上一期,我们讲了组件之间传递参数的用法

  1. 父传子 props属性
  2. 子传父 使用this.$emit(自定义事件,返回的数据)

这里有一个问题,就是当我们的需要传递的组件层次很深,比如给父组件下子组件的子组件的子组件传参数,反过来也是,如果一层一层的套 props 或者 emit 事件,是不是很麻烦。

这里就可以用到全局状态管理了 vuex

当你使用 vuex 管理一个状态的时候,可以全部组件共享这个状态

回到项目,我们找到 store/index.js

可以发现这里的代码

导入 vue ,导入 vuex, 使用 vuex 在 vue 上,这不是和 router/index.js 也就是路由的使用方法类似吗?

也就是说我们只需要弄懂下面的代码是什么含义,如何使用,我们就会使用 vuex 做状态管理了

state

state:存放全局状态

这是存放全局状态的地方,你可以在这里定义全局状态

比如这里定义一个 userLoginState: “未登录”

现在这个状态就可以全局访问了,我们试试

在文章页面使用:

这样就能访问了 this.$store.state.userLoginState

代码:

store/index.js

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {userLoginState:"未登录"},getters: {},mutations: {},actions: {},modules: {}
})

Article.vue

<script>
export  default  {name: 'ArticleView',props:{id:{type:Number,required:true}},methods:{getLoginState(){return this.$store.state.userLoginState;}}
}
</script><template>
<div><div>用户登录态:{{getLoginState()}}</div>这是一个文章组件<div>文章id为:{{id}}</div><div><router-link :to="`/article/${id}/info1`">info1</router-link> |<router-link :to="`/article/${id}/info2`">info2</router-link></div><router-view></router-view>
</div>
</template><style scoped></style>

mutations & actions

mutations: 修改全局状态同步的方式

你说他是一个全局管理状态,那我为什么一定要使用 mutation 的方式修改了,这是因为通过 mutation 修改的状态都会被我们的 vue develop 调试工具记录起来,而且一个全局状态管理库,只有通过规定的方式管理才不会很混乱

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {userLoginState:"未登录"},getters: {},mutations: {changeLoginState(state,loginState) {state.userLoginState = loginState;}},actions: {},modules: {}
})

我们需要修改可以调用mutation:

actions:修改全局状态异步的方式(异步逻辑执行完还要调用mutation进行状态更新)

这里的假设我们是需要几秒后在修改状态,这是一个异步执行逻辑, 可以在actions中定义

这里也是使用了mutation中的方法修改,在内部只需要使用 store

在外部调用这个异步方法就是 this.$store.dispatch

因为这里要使用异步,最常见的应用场景就是用户登录的时候,我们需要修改用户登录态,这个时候,首先会向后端发送请求获取用户登录态,这个请求是一个异步操作。

所以需要使用 await / async 包一层,也就是 promice

getters & modules

getters:获取state的一些属性,相当于 computed 计算属性,缓存计算

这里我们写了一个测试案例,在 getters 中打印用户登录态的字段长度

打开控制台发现只算了一次

这就是 getters,当你需要获取这个 state 的一些属性,并且需要经常调用就可以使用它

modules:模块化

如果你的项目有多个状态,你可以每一状态分一个模块管理

首先可以在 store 中新建 modules 文件

在modules文件中新建一个 a.js

然后你可以在 a 里面写上你的状态,比如这里是一个 count

注意export default 中 namespaced :true 打开命名空间

然后可以在 index.js 中导入这个模块

a.js

export  default  {namespaced: true,state:{aCount: 1},mutations:{update(state, count) {state.aCount = count}}
}

index.js

import Vue from 'vue'
import Vuex from 'vuex'
import a from "@/store/modules/a";Vue.use(Vuex)export default new Vuex.Store({state: {userLoginState:"未登录"},getters: {len(state) {console.log("开始算 state 长度");return state.userLoginState.length;}},mutations: {changeLoginState(state,loginState) {state.userLoginState = loginState;}},actions: {changeLoginStateTime(store,loginState){setTimeout(()=>{store.commit('changeLoginState',loginState);})}},modules: {a: a}
})

最后使用:

这里的使用就多了一个却别,就是

this.$store.state.模块.状态

也就是比原来 this.$store.state.状态

到这里vuex基本使用就讲完了

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

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

相关文章

从当下需求聊聊Apifox 与 Apipost 的差异

作为一名长期投身于复杂项目开发的工程师&#xff0c;我深切体会到一款适配的接口管理工具对提升开发效率的关键意义。当团队在进行工具选型时&#xff0c;我对 Apifox 和 Apipost 展开了全面且系统的对比分析&#xff0c;其中的诸多发现&#xff0c;值得与大家深入探讨。 一、…

蓝牙协议栈高危漏洞曝光,攻击可入侵奔驰、大众和斯柯达车载娱乐系统

OpenSynergy BlueSDK关键漏洞&#xff0c;可远程执行代码入侵数百万车辆系统PCA网络安全公司的研究人员在OpenSynergy BlueSDK蓝牙协议栈中发现了一组被统称为"完美蓝"&#xff08;PerfektBlue&#xff09;的关键漏洞。利用这些漏洞可能对数百万辆汽车实施远程代码执…

Android 性能优化:启动优化全解析

前言 Android应用的启动性能是用户体验的重要组成部分。一个启动缓慢的应用不仅会让用户感到烦躁&#xff0c;还可能导致用户放弃使用。 本文将深入探讨Android应用启动优化的各个方面&#xff0c;包括启动流程分析、优化方法、高级技巧和具体实现。 一、Android应用启动流程深…

前沿重器[69] | 源码拆解:deepSearcher动态子查询+循环搜索优化RAG流程

前沿重器栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

Vue+axios

1. axios简介axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;主要用于浏览器和 Node.js 环境中发送 HTTP 请求。它是目前前端开发中最流行的网络请求库之一&#xff0c;被广泛应用于各种 JavaScript 项目&#xff08;如 React、Vue、Angular 等框架或原生 JS 项目&#x…

通过Tcl脚本命令:set_param labtools.auto_update_hardware 0

1.通过Tcl脚本命令&#xff1a;set_param labtools.auto_update_hardware 0 禁用JTAG上电检测&#xff0c;因为2016.1 及更高版本 Vivado 硬件管理器中&#xff0c;当 FPGA正连接编程电缆时 重新上电&#xff0c;可能会出现FPGA无法自动加载程序的故障。 2.还可以通过 hw_serv…

Spring Boot 安全登录系统:前后端分离实现

关键词&#xff1a;Spring Boot、安全登录、JWT、Shiro / Spring Security、前后端分离、Vue、MySQL 详细代码请参考这篇文章&#xff1a;完整 Spring Boot Vue 登录 ✅ 摘要 在现代 Web 应用中&#xff0c;用户登录与权限控制是系统安全性的基础环节。本文将手把手带你实现…

Docker高级管理--Dockerfile 镜像制作

目录 一&#xff1a;Docker 镜像管理 1:Docker 镜像结构 &#xff08;1&#xff09; 镜像分层核心概念 &#xff08;2&#xff09;镜像层特性 &#xff08;3&#xff09;关键操作命令 &#xff08;4&#xff09;优化建议 2&#xff1a;Dockerfile介绍 &#xff08;1&…

Leetcode力扣解题记录--第42题 接雨水(动规和分治法)

题目链接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

宝塔配置pgsql可以远程访问

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客户端认证&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses关键字&#xff1b;第三步&#xff1a;在navicat里配…

小架构step系列12:单元测试

1 概述 测试的种类很多&#xff1a;单元测试、集成测试、系统测试等&#xff0c;程序员写代码进行测试的可以称为白盒测试&#xff0c;单元测试和集成测试都可以进行白盒测试&#xff0c;可以理解为单元测试是对某个类的某个方法进行测试&#xff0c;集成测试则是测试一连串的…

SpringBoot3-Flowable7初体验

目录简介准备JDKMySQLflowable-ui创建流程图要注意的地方编码依赖和配置控制器实体Flowable任务处理类验证启动程序调用接口本文源码参考简介 Flowable是一个轻量的Java业务流程引擎&#xff0c;用于实现业务流程的管理和自动化。相较于老牌的Activiti做了一些改进和扩展&…

phpMyAdmin:一款经典的MySQL在线管理工具又回来了

phpMyAdmin 是一个免费开源、基于 Web 的 MySQL/MariaDB 数据库管理和开发工具。它提供了一个直观的图形用户界面&#xff0c;使得我们无需精通复杂的 SQL 命令也能执行大多数数据库管理任务。 phpMyAdmin 项目曾经暂停将近两年&#xff0c;不过 2025 年又开始发布新版本了。 …

存储服务一NFS文件存储概述

前言&#xff1a; 网络文件系统&#xff08;Network File System&#xff0c;NFS&#xff09;诞生于1984年&#xff0c;由Sun Microsystems首创&#xff0c;旨在解决异构系统间的文件共享需求。作为一种基于客户端-服务器架构的分布式文件协议&#xff0c;NFS允许远程主机通过T…

libimagequant 在 mac 平台编译双架构

在 macOS 上编译 libimagequant 的双架构&#xff08;aarch64 x86_64&#xff09;通用二进制库&#xff0c;以下是完整步骤&#xff1a;​​1. 准备 Rust 工具链​​ # 安装两个目标平台 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 确认安装成功 rustup ta…

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟&#xff1a; 今天我认为最重…

Flutter基础(前端教程⑧-数据模型)

这个示例展示了如何创建数据模型、解析 JSON 数据&#xff0c;以及在 UI 中使用这些数据&#xff1a;import package:flutter/material.dart; import dart:convert;void main() {// 示例&#xff1a;手动创建User对象final user User(id: 1,name: 张三,age: 25,email: zhangsa…

SSRF10 各种限制绕过之30x跳转绕过协议限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种&#xff1a; 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲30x跳转绕过域名限制 30x跳转绕过域名限制 之前我们使用ssrf漏洞时可以…

DNS解析过程和nmap端口扫描

目录 DNS解析流程&#xff1a; nmap端口扫描 指定扫描方式 TCP全连接扫描 -sT SYN半连接扫描 -sS -sT和 -sS的区别 Linux提权 利用好谷歌语法查找敏感信息 如果自己搭建了网站文件要放在phpstudy_pro\WWW下。 如果想要使用域名访问网站&#xff0c;需要在phpstudy_pro…

【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】

1. 开源大模型技术发展现状1.1 DeepSeek等主流开源大模型的技术特性分析 DeepSeek作为当前最具代表性的开源大模型之一&#xff0c;其技术架构具有多项创新特性。该模型采用混合专家架构(MoE)&#xff0c;通过将视觉编码分离为"理解"和"生成"两条路径&…