Vue 前端路由 vue-router


1、前端路由

后端路由:多頁面,服務器端渲染好返回給瀏覽器。

前端路由:改變url不向服務器發送請求;前端可以監聽url變化;前端可以解析url並執行相應操作。

 

前后端分離:后端只提供API來返回數據,前端通過ajax獲取數據后,在通過一定的方式渲染到頁面上。

SPA:前后端分離+前端路由。

SPA只有一個html文件,整個網站的所有內容都在這一個html里,通過js來處理。

 

2、vue-router

路由不同的頁面實時上就是加載不同的組件。

 

3、示例

github地址:https://github.com/MengFangui/VueRouter

需要安裝vue-router

(1)加載插件

import Vue from 'vue'; import VueRouter from 'vue-router'; import App from './app.vue'; //加載vue-router插件
Vue.use(VueRouter);

 注意:from后的模塊都是小寫

(2)路由設置

// 路由配置,配置路由匹配列表 //webpack會把每一個路由打包為一個js文件,在請求該頁面時,加載這個頁面的js,異步實現懶加載(按需加載)
const Routers = [ { //匹配的路徑
        path: '/index', //  meta: { title: '首頁' }, //映射的組件
        component: (resolve) => require(['./views/index.vue'], resolve) }, { path: '/about', meta: { title: '關於' }, component: (resolve) => require(['./views/about.vue'], resolve) }, { //路由到同一個頁面,數據不同
        path: '/user/:id', meta: { title: '個人主頁' }, component: (resolve) => require(['./views/user.vue'], resolve) }, //訪問的路徑不存在時,重定向到首頁。
 { path: '*', redirect: '/index' } ]; const RouterConfig = { // 使用 HTML5 的 History 路由模式,通過‘/’設置路徑
    mode: 'history', routes: Routers }; const router = new VueRouter(RouterConfig);

 注意:path屬性值后有'/'.

component: (resolve) => require(['./views/user.vue'], resolve)
resolve實現異步加載,按需加載


命名路由使用:
{ //匹配的路徑
        path: '/index', //常量參數定義
 meta: { title: '首頁' }, //命名路由
        name:'index', //映射的組件
        component: (resolve) => require(['./views/index.vue'], resolve) }
 
        
<router-link :to="{name:'about'}">跳轉到 about</router-link>

命名路由的配置好處是:路徑都在main.js中配置好了,改變路徑的話只需要在main.js中配置即可,不需要在所有使用的地方進行配置

 

(3)將將每個頁面的樣式都打包到一個css文件,webpack.config.js

plugins: [ //css單獨打
        new ExtractTextPlugin({ filename: '[name].css', //將每個頁面的樣式都打包到一個css文件
            allChunks: true }) ]

 

(4)配置webpack-dev-server支持history路由

"scripts": { "dev": "webpack-dev-server --open --history-api-fallback --config webpack.config.js", "bulid": "webpack --progress --hide-modules --config webpack.prod.config.js" },
--history-api-fallback  所有的路由都指向index.html

(5)掛載路由組件
<template>
    <div>
        <router-view></router-view>
    </div>
</template>
<script> export default { } </script>

 

(6)跳轉

方式1:

<template>
    <div>
        <h1>首頁</h1>
        <!--router-link會渲染為一個a標簽 實現跳轉的方式1-->
        <!--router-link 的tag屬性 指定渲染成什么標簽-->
        <!--router-link 的replace屬性 不會留下history記錄,不能使用后退鍵-->
        <!--router-link 的active-class屬性 路由匹配成功時會自動給當前元素設置為一個名為router-link-active的class-->
        <router-link to="/about">跳轉到 about</router-link>
    </div>
</template>
<script> export default { } </script>

to是一個屬性,同樣可以使用v-bind進行動態設置。如:

 

<router-link :to="{name:'about'}">跳轉到 about</router-link>

 

 

 

 

方法二:

<template>
    <div>
        <h1>介紹頁</h1>
        <button @click="handleRouter">跳轉到 user</button>
    </div>
</template>
<script> export default { methods: { handleRouter () { //實現跳轉的方式2
                this.$router.push('/user/123'); //不會向history添加新紀錄
                //this.$router.replace('/user/123');
                //在hsitory中前進或者后退多少步
                this.$router.go(-1); } } } </script>

 

(7)導航鈎子

//導航鈎子,beforeEach路由改變前觸發 //to形參 即將進入的路由對象 //from 即將離開的路由對象 //next 調用改方法后才能進入下一個鈎子,設置為false時,可以取消導航,設置為具體路徑時可以導航到指定的頁面next(‘/login’)
 router.beforeEach((to, from, next) => { window.document.title = to.meta.title; next(); }); 

//導航鈎子,afterEach路由改變后觸發

router.afterEach((to, from, next) => { window.scrollTo(0, 0); });

 next(false):next的參數設置為false時,取消導航/跳轉效果

 (8)虛擬DOM

new Vue({ el: '#app', router: router11, render: h => { return h(App) } });

注意:Vue 在創建 Vue 實例時,通過調用 render 方法來渲染實例的 DOM 樹。

h就是createElement,只是換了一個名稱

Vue 在調用 render 方法時,會傳入一個 createElement 函數作為參數,也就是這里的 h 的實參是 createElement 函數,然后 createElement 會以 APP 為參數進行調用

 

(9)Vue組件需要一個標簽進行包裹(如div)

<template>
    <div>
        <h1>首頁</h1>
        <!--router-link會渲染為一個a標簽 實現跳轉的方式1-->
        <!--router-link 的tag屬性 指定渲染成什么標簽-->
        <!--router-link 的replace屬性 不會留下history記錄,不能使用后退鍵-->
        <!--router-link 的active-class屬性 路由匹配成功時會自動給當前元素設置為一個名為router-link-active的class-->
        <router-link to="/about">跳轉到 about</router-link>
    </div>
</template>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM