vue-router詳解——小白速會

来源:https://www.cnblogs.com/chaixiaozhi/archive/2018/04/15/8836306.html
-Advertisement-
Play Games

一、概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用。 vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。 而傳統的多頁面應用,是用一些超鏈接來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是 ...


一、概述

vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用

vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。

而傳統的多頁面應用,是用一些超鏈接來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也就是組件的切換。

路由中有三個基本的概念 route, routes, router。

1. route,它是一條路由,由這個英文單詞也可以看出來,它是單數, Home按鈕  => home內容, 這是一條route,  about按鈕 => about 內容, 這是另一條路由。

2. routes 是一組路由,把上面的每一條路由組合起來,形成一個數組。[{home 按鈕 =>home內容 }, { about按鈕 => about 內容}]

3. router 是一個機制,相當於一個管理者,它來管理路由。因為routes 只是定義了一組路由,它放在哪裡是靜止的,當真正來了請求,怎麼辦? 就是當用戶點擊home 按鈕的時候,怎麼辦?

這時router 就起作用了,它到routes 中去查找,去找到對應的 home 內容,所以頁面中就顯示了 home 內容。

4. 客戶端中的路由,實際上就是dom 元素的顯示和隱藏。當頁面中顯示home 內容的時候,about 中的內容全部隱藏,反之也是一樣。客戶端路由有兩種實現方式:基於hash 和基於html5 history api.

 

二、vue-router基本用法

在vue中實現路由還是相對簡單的。因為我們頁面中所有內容都是組件化的,我們只要把路徑和組件對應起來就可以了,然後在頁面中把組件渲染出來。

2.1 一個簡單的單頁應用

直接來看一個demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue-router</title>
</head>
<body>
    <div id="app">
        <header>
            <router-link class="red" to="/home">Home</router-link>  //用於跳轉
            <router-link to="/about">About</router-link>
            <!--  增加兩個到user組件的導航,展示動態路由,可以看到這裡使用了不同的to屬性 -->
            <router-link to="/user/123">User123</router-link>
            <router-link to="/user/456">User456</router-link>
        </header>
        <router-view></router-view>  //用於被替換渲染
    </div>
</body>
</html>
<script src="../lib/vue.js"></script>
<script src="../lib/vue-router.js"></script>
<script src="../js/demo1.js"></script>
//1.創建組件
var Home = Vue.extend({
    template: '<div>' +
                    '<h1>Home</h1>' +
                    '<p>{{msg}}</p>' +
              '</div>',
    data: function() {
        return {
            msg: 'Hello, vue router!'
        }
    }
});

var About = Vue.extend({
    template: '<div>' +
                '<h1>About</h1>' +
                '<p>This is the tutorial about vue-router.</p>' +
             '</div>'
});

var User = Vue.extend({  //展示動態路由
    template: '<div>' +
                '<h1>User</h1>' +
                '<p>我是user組件,動態部分是{{dynamic}}</p>' +
              '</div>',
    computed: {
        dynamic: function () {
            //當整個vue-router 註入到根實例後,在組件的內部,可以通過this.$route來獲取到router實例。它有一個params 屬性,就是來獲得這個動態部分的。
            return this.$route.params.id
        }
    },
    watch: {
        //利用watch來監聽$route的變化,可以進行更多的操作。to表示的是你要去的那個組件,from 表示的是你從哪個組件過來的,它們是兩個對象。
        $route: function (to, from) {
            console.log(to),
            console.log(from)
        }
    }
});

//2.創建router,並映射路由;
var router = new VueRouter({
    routes: [
        {
            path: '/home',     //映射路徑
            component: Home    //映射組件
        },
        {
            path: '/about',
            component: About
        },
        {
            path: '/user/:id',      //配置動態的id,實現動態路由
            component: User
        },
        {
            path: '/',
            redirect: '/home'   // 預設重定向
        }
    ]
});

//3.把創建好的路由掛載在根組件下麵就可以了,即掛載到#app元素下麵
const app = new Vue({
    router
}).$mount('#app');

//4.使用標簽<router-link> ,<router-link> 有一個非常重要的屬性 to,定義點擊之後,要到哪裡去
//5.使用<router-view>標簽: 在頁面上使用<router-view></router-view>標簽,它用於渲染匹配的組件。

 

 

2.2嵌套路由

嵌套路由,主要是由我們的頁面結構所決定的。當我們進入到home頁面的時候,它下麵還有分類,如手機系列,平板系列,電腦系列。當我們點擊各個分類的時候,它還是需要路由到各個部分,如點擊手機,它肯定到對應到手機的部分。

在路由的設計上,首先進入到 home ,然後才能進入到phone, tablet, computer.  Phone, tablet, compute 就相當於進入到了home的子元素。所以vue  提供了children屬性,它也是一組路由,相當於我們所寫的routes。

我們把上面的Demo簡單修改一下:html頁面不動,只是簡單改一些js的部分

var Home = Vue.extend({
    template: '<div>' +
                    '<h1>Home</h1>' +
                    '<p>{{msg}}</p>' +
                    '<p>'+
                        '<router-link to="/home/phone">手機 </router-link>'+      //加入子路由跳轉方式
                        '<router-link to="/home/tablet">平板 </router-link>'+
                        '<router-link to="/home/computer">電腦 </router-link>'+
                    '</p>'+
                    '<router-view></router-view>'+    //在父頁面的裡面加入子路由頁面,用於子路由頁面的替換和渲染
              '</div>',
    data: function() {
        return {
            msg: 'Hello, vue router!'
        }
    }
});

// 子路由組件
var phone = Vue.extend({
    template: '<div>This is phone</div>'
});

var tablet = Vue.extend({
    template: '<div>This is tablet</div>'
});

var computer = Vue.extend({
    template: '<div>This is computer</div>'
});

var router = new VueRouter({
    routes: [
        {
            path: '/home',     //映射父頁面路徑
            component: Home,    //映射父組件
            children: [    //利用children屬性實現子路由
                {
                    path: "phone",  //映射子路由頁面路徑
                    component: phone  //映射子組件
                },
                {
                    path: "tablet",
                    component: tablet
                },
                {
                    path: "computer",
                    component: computer
                },
                // 當進入到home時,下麵的組件顯示
                {
                    path: "",
                    component: phone
                }
            ]
        },
        {
            path: '/about',
            component: About
        },
        {
            path: '/user/:id',      //配置動態的id,實現動態路由
            component: User
        },
        {
            path: '/',
            redirect: '/home'   // 預設重定向
        }
    ]
});

 

2.3命名路由

命名路由,很簡單,因為根據名字就可以知道,這個路由有一個名字,那就直接給這個路由加一個name 屬性,就可以了。 給user 路由加一個name 屬性:

        {
            name: 'user',
            path: '/user/:id', 
            component: User
        },

命名路由的使用, 在router-link 中用動態的to屬性就可以使用對象了

            <router-link to="/user/123">User123</router-link>
            <router-link :to="{name:'user',params: {id:456}}">User456</router-link>
       //這兩個是等價的,當使用對象作為路由的時候,to前面要加一個冒號,表示綁定

 

2.4跳轉

vue-router 有兩種跳轉頁面的方法

第一種是使用內置的<router-link>組件,它會被渲染為一個<a>標簽,如:

<router-link to="/home">Home</router-link>

< router-link>除了to還有其他的一些屬性, 常用的有:

• tag
tag 可以指定渲染成什麼標簽,比如<router-link to = "/about ” tag=” li ”〉渲染的結果就是<li >而不是<a>。

• replace
使用replace 不會留下History 記錄,所以導航後不能用後退鍵返回上一個頁面,如<router-link to =”/about” replace>。

• active-class
當<router-link> 對應的路由匹配成功時,會自動給當前元素設置一個名為router-link-active的class,如需要修改樣式,直接修改router-link-active就可以.

 有時候,跳轉頁面可能需要在JavaScript 里進行,類似於window. location.href。這時可以用第二種跳轉方法,使用router 實例的方法。

以demo中的about為例:

var About = Vue.extend({
    template: '<div>' +
                '<h1>About</h1>' +
                '<p>This is the tutorial about vue-router.</p>' +
                '<button @click="handleRouter">返回home頁</button>'+  //在about頁面增加一個跳轉按鈕
             '</div>',
    methods: {
        handleRouter: function () {
            this.$router.push('/home')  //使用$router中的push方法就行路由跳轉
        }
    }
});
$router 還有其他一些方法:
• replace
類似於<router-link>的replace 功能,它不會向history 添加新記錄,而是替換掉當前的history 記錄,如this.$router.replace (’/user/123'); 。

• go
類似於window.history.go(),在history 記錄中向前或者後退多少步,參數是整數,例如:
//後退1 頁
this.$router.go(-1) ;
//前進2 頁
this.$router.go(2);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Promise簡介 promise是非同步編程的一種解決方案,它出現的初衷是為瞭解決回調地獄的問題。 打個比方,我需要: --(延遲1s)--> 輸出1 --(延遲2s)--> 輸出2 --(延遲3s)--> 輸出3 通常寫法: setTimeout(()=> { console.log('1' ...
  • 前言 1 一列佈局 一列佈局: HTML部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>一列佈局</title> </head> <body> <div class="head">head</div> <div cla ...
  • 項目在微信環境開發,需要獲取access_token進行授權登錄和獲取用戶信息。 特意把這塊功能拿出來封裝一個自定義module 之前appid和secret是在本地配置文件寫死的,後來要求系統後臺可以配置公眾號。 就需要從後臺請求來獲取配置參數。這就遇到問題了。 我的服務會在開啟以及每小時來獲取新 ...
  • h5的新特性(目前個人所瞭解)如下 語義化標簽 表單新特性 視頻(video)和音頻(audio) canvas畫布 svg繪圖 地理定位 為滑鼠提供的拖放API webworker (重點)Storage (重點)Websocket HTML語義化是什麼? 語義化是指根據內容的結構化(內容語義化) ...
  • 使用DOM樹 一、訪問元素 1、選擇單個元素節點 (1)getEelementById() 使用元素的id屬性 (2)使用CSS選擇器,返回第一個匹配的元素 querySelector() VarhotItem=document.querySelectorAll('li .hot"); 2、選擇多個 ...
  • <!--strong語氣著重加強--> lorem亂序銘文 <!--em斜體--> Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt, nihil? Lorem ipsum dolor sit amet, conse ...
  • 問題 在使用echart去創建圖表時,發現圖表只占了容器的一個角落,如圖,並沒有充滿容器。 第一反應是容器元素的樣式有問題,於是我把容器的寬高都改為px指定的(之前是百分比設定的,查詢資料發現說echart容器寬高要明確指定),修改之後,還是和上面一樣的展示,依舊有問題。 定位 於是我想是不是渲染圖 ...
  • css選擇器 有通配符選擇器書寫格式:*+{聲名塊} 並集選擇器/組合選擇器 書寫格式;元素或類或id+“”+元素或類或id+“,”+元素或類或id{聲明塊} 列:h1,h2,h3{color:red;} 層次選擇器 : 子集選擇器: 格式:父級元素名稱+">"+子級元素名稱+{聲明塊} 例:div ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...