vue3专栏项目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 页面

首页有专栏列表(ColumnList组件),专栏列表中有很多专栏,然后点击某个专栏就进入专栏详情页(ColumnDetail组件),专栏详情页中有很多文章,点击某个文章就进入文章详情页()这样子

数据我们是设计成什么样子呢,如下

testData是专栏数据,testPosts是文章数据,就是每个专栏里面都对应着它们相对应的文章们,它们是怎么联系起来的呢也就是说怎么知道这个文章是哪个专栏里的呢?通过文章中的columnId=专栏中的id,则说明这个文章是这个专栏的。

那url中参数怎么与专栏和文章联系起来呢,我们之前做路由跳转的时候跳转到columnDetail专栏详情页的时候不是做了动态路由嘛,通过加:id,到时候url中我们通过在url的column/后加2,那么它就会跳转到query中id为2的数据页面中。所以我们url中这个参数我们让它等于专栏的id,即url中这个参数是2时,则让它是id为2的专栏。

所以当url中该参数为2时,则找出专栏中id为2的数据,因为专栏详情页中需要展示出该专栏下的文章,所以还需要获取这个专栏下的文章们,而专栏和文章是以专栏id(和url那个id其实是相等了) = 文章columnId,即过滤出columnId等于2的即可找出这个专栏下的文章了

如下

数据获取到了,然后专栏详情页中不是有文章们嘛,就建个PostList组件,专门放该专栏详情页下的文章列表

二、vuex

1、什么是状态管理工具

我们现在有3个页面了,分别是首页、登录页、专栏详情页,这三个页面中都有一些共同的数据需要获取和处理,现在我们的做法是把这些共用的数据都保存在一个全局的js对象中

全局对象的弊端:

·数据不是响应式的

·数据修改无法追踪

·不符合组件开发的原则

状态管理工具的基本原则:

·一个类似object 的全局数据结构 - 称为store (里面的数据是不能随便更改的,只能通过action修改)

·只能调用一些特殊的方法来实现数据修改(所以store中的数据变化是可追溯可控制的)

2、vuex 简介 和 安装

单向数据流理念,state决定了view长什么样,view上可以通过actions方法修改state

但是,当多个组件共享状态时,单向数据流就容易被破坏。

vuex的核心是store,store就像一个仓库,store包含应用中大多数状态(state)

vuex的特点:

·状态存储是响应式的

·不能直接改变store中的状态,唯一途径就是显式地提交(commit) mutation

安装vuex:npm install vuex --save

3、vuex 整合当前应用

创建一个store.ts如下

然后我们需要把这个store和vue联合起来,去main.ts,如下即把store和整个应用整合到了一起

接下来看看在组件中怎么拿到数据,在home.vue中举个例子,如下

我们哪里要用就引入vuex的useStore,然后通过 useStore() 就可以拿到vuex中的store了

如下发现没有自动补全,我们可以引入store的GlobalDataProps

当做泛型传入进去后就可以出现自动补全了

由于vuex的状态存储是响应式的,从store实例中读取状态最简单的方法是在计算属性中返回某个状态,如下

第二个任务就是修改数据

我们希望登录以后,vuex数据发生变化,然后触发页面上的变化。登录后就把vuex中当前登录人的信息从未登录变成登录,从某某人变成当前人这样子

然后到App.vue中引入vuex,然后 useStore() 拿到vuex中的store,然后在computed中通过store.state.user拿到store中的user信息

到login.vue中,我们希望它登录后跳转到首页去,并且尝试修改,注意修改一定要用commit。

如下,commit就会去触发store中的mutations,commit('login') 即触发mutations中的login函数,如下这个login函数中就会去修改store中的user信息

如此,去登录,发现登录成功后就跳转到了首页了

4、使用vuex getters

前面我们知道了怎么给整个页面添加vuex store,同时知道了怎么在vue组件中获取store的数据,以及怎么触发mutation,从而引起应用的更新。

接下来我们了解getter,有时候我们需要从store的state中派生出一些状态,比如说我们对专栏们进行过滤,找出id大于2的有多少专栏,我们就需要这样:store.state.columns.filter(c=>c.id>2).length,通过这么一长串逻辑就拿到了有多少专栏id大于2

假如我们在多个页面当中都要使用的话,就需要反复重复这么长的代码,就比较麻烦

vuex就允许我们在store中定义一个叫getter的东西,可以认为是store的一个计算属性,就和计算属性一样,getter返回值会根据它的依赖被缓存起来,且当它依赖值发生改变才会重新计算。

如下,接下来我们使用getter,就直接通过store.getters.biggerColumnsLen就可以拿到id大于2的专栏数量了

我们来到专栏详情页,我们想通过getters,查询具体是哪个column

如下是还没用getters的

这里和之前的区别就是,我们需要传入一个称为currentId的值,因为这个值是在页面上才能拿到的,所以你在页面拿到后,你得传入到getters中,然后拿currentId做上面的这些操作

在getters中我们可以让它返回一个函数来实现给getters传参,它在你对store里的数组进行查询的时候非常有用,如下

三、添加新建文章页面

每个column专栏都有一个作者(有columnId,id等),它们两个是一对一的关系,这个作者信息和当前这个用户登录信息使用的是同一个数据结构,所以我们在新建文章的时候,可以从当前登录用户的信息中拿到这个columnId,然后创建定义的文章

就是你创建文章,你得知道这个文章是谁写的?(这里有点?)

views中新建一个CreatePost.vue即新建文章页面,新建文章中也是用的validate-input

然后到router.ts中加入新建文章的页面路径,并且在新建文章按钮中把a标签变成router-link标签,:to指向/create,这样点击新建文章时就会跳转到新建文章页面

应该让validateInput支持textarea,添加一个属性让它判断要显示哪个节点就好

如下,设置一个类型是input或者textarea,然后props中接入一个tag,这个tag就是要展示input还是textarea,然后input标签中就通过v-if来判断是input类型还是textarea类型框

然后新建文章这里,我们传入tag=textarea,这样子在新建文章页面

如果要创建文章,我们就需要拿到用户信息的columnId,所以我们给我们的数据结构做一些修改

如下:在mutations中定义createPost,接收newPost即新建的文章,把传过来的新建的文章追加到state的posts中

如下:新建文章点击提交按钮后,触发onFormSubmit事件,从当前用户中获取columnId做当前新建文章的columnId,然后新建newPost对象,这个对象中放置这个新建文章的信息,然后commit调用vuex的mutation,把当前新建文章追加到state中的posts中,并且往router中push如下路径

四、vue router 添加路由守卫

1、 前置守卫

接下来谈谈不同路由的权限问题,有些路由有某些特定权限才能使用,比如新建文章页面只有在用户登录以后才可以使用,如果用户未登录,直接访问新建页面的话,一般会重定向到另外一个路由,比如说此时重定向到login页面去登录;比如说登录和注册页面,在未登录的时候就可以访问,如果已经登录,此时去访问这两个页面一般会重定向到首页去。

由于我们整体应用是SPA,即所说的单页面,那我们的路由使用了vue-router,我们就去看看vue-router怎么完成这个任务,就是这个导航守卫

现在我们就来注册一个全局前置守卫,判断一下加入用户是否登录,如果没有登录,那么就让页面跳转到login页面,如上,注册守卫其实很简单,我们需要在router的实例上拿到beforeEach方法,

beforeEach方法就是当一个导航触发的时候,这个beforeEach要全局前置守卫,就按照创建顺序调用,守卫是一步一个解析执行,此时导航的所有守卫resolve完之前一直处于等待中

to就是即将到达的路由,from是正在离开的路由,next是一个function

 从首页到新建文章页,可以看到to即将到达的路由变成/create,from当前路由是首页

但是此时我们发现,已经点击新建文章按钮了,却没有跳转到新建文章页面,这是因为最后一个参数next在作祟

next是一个function,我们一定要调用该方法来resolve这个钩子,让这个路由继续前进到下一个钩子,此时我们就直接让它next()继续前进不要停在这里即可到新建文章页面

如果为false则不能跳转了

然后我们来完成,当没有登录的时候就跳转到登录页面去

如下,如果不是跳转到登录页,并且当前没有登录,即当前没有登录还想跳到非登录页就让它重定向回登录页得先登录再去其他页面

此时如果没有登录,那么到首页就会重定向到登录页,或者到新建文章页也会重定向回登录页

这个功能是实现了,但是这不是我们最终想要的结果,因为有些页面即使没有登录也是可以访问的,只有特定的页面才需要登录后才能访问,所以我们还需要再把这个功能进化一下

2、使用元信息完成权限管理

现在路由可以被这个守卫操控,在跳转之前进行对应的检查,但是现在我们的规则是眉毛胡子一起抓,用一个规则把所有页面都拒之门外。

第一种是home和columndetail这两个页面是无论有没有登录都是可以访问的;第二种是create页面是只有登录的用户才可以访问的;第三种是login这个页面,用户登录以后他访问就会直接跳转到首页;所以有三种对应的路由,又代表了三种不同的行为,也就是说我们需要在特定种类的路由上面添加独特的信息进行区分,看文档如下

要知道怎么在路由上添加元信息,即在路由上添加meta: { xx: xx }

路由元信息,也就是说我们在定义路由的时候可以配置一个叫meta的字段,这个就是这个元信息,这个meta字段下面我们可以使用Object形式写出来我们所需要的一些额外的信息

这时候我们就在create页面上面添加一个元信息,添加完了后我们需要到beforeEach中访问这个信息,如下

我们访问create可以看到打印出了requiredLogin:true,既然我们能拿到这个信息,后面的判断就可以做了

我们只需要用meta中的信息判断该路由是否登录就可以了

如下create页面是只有登录的用户才可以访问的

登录用户访问登录页面就会跳转到首页

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

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

相关文章

经开区创维汽车车辆交接仪式顺利举行,守护绿色出行助力低碳发展

5月10日,“创维新能源汽车进机关”交车仪式于徐州顺利举行,20辆创维EV6 II正式交付经开区政府投入使用。经开区陈琳副书记、党政办公室副主任张驰主任、经开区公车管理平台苑忠民科长、创维汽车总裁、联合创始人吴龙八先生、创维汽车营销公司总经理饶总先…

配置管理与IT资产管理:差异与协同共生

在信息技术日新月异的今天,高效、可靠的IT服务管理成为企业竞争力的关键一环。ITIL4 作为业界公认的IT服务管理框架,为我们提供了一套全面而系统的实践指南。在这一框架下,配置管理和IT资产管理作为两大核心实践,虽各有侧重&#…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻,而且还有对地电导,会消耗一部分能量。但是因为雷击所涉及的传输距离很短,所以几乎可以忽略这…

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

【计算机网络】计算机网络概述、计算机网络性能指标 习题1

0 1. 计算机网络可被理解为( )。 A.执行计算机数据处理的软件模块 B. 由自治的计算机互连起来的集合体 C.多个处理器通过共享内存实现的紧耦合系统 D. 用于共同完成一项任务的分布式系统 0 2.计算机网络最基本的功能是( )。 A.数据通信 B. 资源共享 C. 分布式处理 D. 信息综合…

python的deap库使用记录

主要是在遗传符号回归的代码中添加了注释和根据一部分源码做了一点改动 import operator import random import numpy as np import matplotlib.pyplot as plt from deap import algorithms, base, creator, tools, gp from operator import attrgetter##生成数据 def generat…

【Python系列】字节串与字典字节串

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ASP.NET WebApi 如何使用 OAuth2.0 认证

前言 OAuth 2.0 是一种开放标准的授权框架,用于授权第三方应用程序访问受保护资源的流程。 OAuth 2.0 认证是指在这个框架下进行的身份验证和授权过程。 在 OAuth 2.0 认证中,涉及以下主要参与方: 资源所有者(Resource Owner&…

【.NET Cote】你真的了解HttpRuntime类吗

【.NET Cote】你真的了解HttpRuntime类吗 文章目录 【.NET Cote】你真的了解HttpRuntime类吗一、HttpRuntime概述二、HttpRuntime是什么包三、HttpRuntime属性四、HttpRuntime方法五、HttpRuntime.Cache方法六、HttpRuntime.Cache应用 一、HttpRuntime概述 C# HttpRuntime是一…

JAVA基础之下载,socket实现网络聊天

目录 一、如何利用正则表达式找到img标签 compile编译编制 二、下载图片的方法 三、socket实现网络聊天 1.inputStreamReader 字节的读取流--->字符的读取流 2.outputStreamWriter 字节的写入流--->字符的写入流 一、如何利用正则表达式找到img标签 compile编译编制…

antd组件状态变换为啥要使用剪头函数

先看下代码 import React, {useState} from react; import {Switch, Typography} from antd;const {Paragraph, Text} Typography;const App: React.FC () > { const [ellipsis, setEllipsis] useState(true);return (<>//正确的<Switch checked{ellipsis}onCh…

掌握SQL的时间序列分析利器:LEAD与LAG函数详解

在SQL中&#xff0c;处理时间序列数据时&#xff0c;经常需要查看当前行与相邻行之间的关系。这时&#xff0c;LEAD和LAG两个窗口函数就显得尤为重要。它们允许我们访问结果集中的前一行或后一行的数据&#xff0c;为数据分析和处理提供了极大的便利。本文将详细介绍LEAD和LAG函…

steam_api64.dll是什么东西?steam_api64.dll缺失的多个详细解决方法

在现代PC游戏领域&#xff0c;Steam无疑是最具影响力的游戏分发和社交平台之一。它不仅提供了一个庞大的游戏市场&#xff0c;还集成了好友系统、成就系统、云存储等多种功能&#xff0c;为数百万玩家提供了便捷的游戏体验。在这庞大的生态系统中&#xff0c;steam_api64.dll作…

Windows10环境搭建http服务器

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

基于 Wireshark 分析 IP 协议

一、IP 协议 IP&#xff08;Internet Protocol&#xff09;协议是一种网络层协议&#xff0c;它用于在计算机网络中实现数据包的传输和路由。 IP协议的主要功能有&#xff1a; 1. 数据报格式&#xff1a;IP协议将待传输的数据分割成一个个数据包&#xff0c;每个数据包包含有…

[Markdown]是时候该学学使用markdown写文章了

&#x1f495;&#x1f495;&#x1f495;欢迎各位来到我的博客&#xff0c;今天我们的主题是markdown&#xff0c;你将在这里学习到最全的markdown知识&#x1f495;&#x1f495;&#x1f495; 你还在使用富文本编辑器写文档或文章吗&#xff1f; 你还在用word一点一点地进行…

算法训练营day29

一、组合 参考链接77. 组合 - 力扣&#xff08;LeetCode&#xff09; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {public List<List<Integer>> combine (int n, int k) …

C语言----斐波那契数列

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

选购洗地机有哪些技巧?2024洗地机全面解析,618洗地机综合对比

洗地机作为人们生活中智能清洁工具的代表&#xff0c;它自带清/污水箱&#xff0c;不用手洗滚刷&#xff0c;既可以吸尘也可以自动识别并清洗地板上的干湿垃圾和顽固污渍&#xff0c;它以多功能一体化的设计改善了家务清洁的效率和体验。那么如何在众多洗地机品牌中&#xff0c…

C#实现简单音乐文件解析播放——Windows程序设计作业2

1. 作业内容 编写一个C#程序&#xff0c;要求实现常见音乐文件的播放功能&#xff0c;具体要求如下&#xff1a;     1). 播放MP3文件&#xff1a; 程序应能够读取MP3文件&#xff0c;并播放其中的音频。     2). 播放OGG文件&#xff1a; 应能够播放ogg文件。     …