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.pswp.cn/web/10364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10364.shtml
英文地址,請注明出處:http://en.pswp.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文件。 ????…