js 刷新div_vue.js備忘記錄(五) vue-router

如果我們采用SPA(單網頁應用)的設計方式,服務器會把前端文件一次性發過來,前端通過監聽url的改變,選擇展示那些內容,也就是前端路由

一. 如何改變url但是頁面不刷新?

方式一: 改變哈希值hash

比如,我們隨便找一個網頁

e6938c9ff993f67bcc3b34ccc110b147.png

我們在瀏覽器控制臺輸入

08e96193dfa1764a350598acc59d14e4.png

發現網站的url有了些改變

b02ce224aeb692c2f1753edc95bcc1d6.png

查看network卻沒有任何請求

97aed763b0beb791f211e388eaf71794.png

方式二 history模式的方法

(1). history.pushState()壓棧式

比如,我們隨便找一個網頁

e6938c9ff993f67bcc3b34ccc110b147.png

我們在瀏覽器控制臺輸入

history.pushState({},'','home')

13a6e2c3c405b3f11b6e33e44a21f6bf.png

發現網站的url有了些改變

f239628bf835816411504301052dedcc.png

查看network卻沒有任何請求

456daa3f3feb5c181af3af512d69e6f1.png

這種壓棧式方法,可以使用瀏覽器返回上一頁按鈕彈棧,實際上是在調用

history.back()

也可以使用history.go() 操作棧

history.forward()  等價于  history.go(1)
history.back()  等價于  history.go(-1)

(2): history.replaceState()非壓棧式

history.replaceState({},'','home')

二. 認識vue-router

1.安裝 vue-router

cnpm install vue-router --save

我們也可以在用CLi項目創建時就選擇好 vue-router 這樣項目創建時會送我們一個hello world的例子,我們可以先體驗一下

6d068ca340cd232a53c8f41d7eea7831.png

c9dda600c544042d1d0ba21a832990bc.png

2.創建文件夾router,創建index.js

用來存放我們的路由配置

3.路由創建過程

首先,我們在index.js創建一個vuerouter并暴露

//1.導入VueRouter
import VueRouter from 'vue-router'
//2.導入Vue   (因為后面要用Vue.use())
import Vue from 'vue'//3.通過Vue.use安裝一下插件
Vue.use(VueRouter)//4.創建路由對象
routes=[]const router = new VueRouter({routes
})//5.暴露路由對象
export default router

在main.js中,我們掛載這個vuerouter

import Vue from 'vue'
import App from './App.vue'
import router from './router'     //6.導入暴露的vuerouter (/index.js是默認,路徑中省略了)Vue.config.productionTip = falsenew Vue({router,      //7. 將導入的router傳給自己的router屬性render: h => h(App),
}).$mount('#app')

4.配置映射關系

上面的模板中,routes=[], 我們沒有配置映射關系, 現在我們來配置一下:

  • 第一步,導入頁面組件
  • 第二步,創建映射關系
  • 第三步,在app.vue模板中(上級組件),添加router-link標簽,這是一個觸發url改變的入口
  • 第四步,在app.vue模板中(上級組件),添加router-view占位符標簽,確定請求過來的內容的占位

在router/index.js中

import VueRouter from 'vue-router'
import Vue from 'vue'
import Home from '../components/Home'  //1. 導入第一個組件Home
import About from '../components/About' //1. 導入第二個組件AboutVue.use(VueRouter)
const routes = [{path: '/',       //2.添加映射關系component: Home},{path: '/about',  //2.添加映射關系component: About}
]const router = new VueRouter({routes
})export default router

在App.js中

<template><div id="app"><router-link to="/home">首頁</router-link>   <!-- 3.使用路由 通過router-link標簽,配置to屬性提供鏈接目標,點擊此標簽會觸發對應的url請求--><router-link to="/about">關于</router-link><!-- 3.使用路由 通過router-link標簽,配置to屬性提供鏈接目標,點擊此標簽會觸發對應的url請求--><router-view></router-view><!-- 4.使用路由 通過router-view占位符標簽,確定請求過來的內容的占位--></div>
</template><script>
export default {name: 'App',
}
</script><style scoped>
</style>

路由重定向:

const routes = [{path:'',redirect:'home'},
]

5.將默認的哈希方式改為history模式

vue默認是使用hash方式的,

e230520628e10b9bec9395adf9f29e02.png

我們可以給它改成history模式,

這需要,我們在router/index.js中創建VueRouter時傳入另一個參數

const router = new VueRouter({routes,mode:'history'
})

7be7c9b0cd51179fe6960e15073f96c7.png

此外我們在cli初始化項目時,也可以默認history模式

cebb1cfb9eb799b19ec49010ac316ed3.png

6.router-link 屬性

  • to屬性 :指向的url地址
  • tag屬性: 默認是a標簽,如果tag='button',則渲染成標簽.此外還可以是 <li>等
  • replace屬性: 采用非壓棧式跳轉,不可返回

同時,我們注意到,當某個標簽被點擊時,他的class會自動添加兩個類:router-link-exact-active和router-link-active

45b282e98d592c18077af16e67a4276b.png

有了這兩個class,我們可以方便的寫樣式了

912507bb277abeb3f687d73c17392cfe.png

7. 不用router-link,通過代碼修改路徑 $router.push

上面的我們都是使用的 <router-link>來觸發的url改變 有沒有辦法用普通的表單元素觸發呢?

有的.比如一個button 我們綁定了他的單擊事件 btnClick,則我們可以在方法里寫:

每個組件都有一個全局對象叫$router,這個

btnClick(){this.$router.push('/home')
}

上面是壓棧式,當然也有非壓棧式

btnClick(){this.$router.replace('/home')
}

三. 動態路由 /:參數

很多時候我們的url可能是不固定的,訪問的頁面的具體信息也會隨著url改變,這就稱之為動態路由. 例如: 我們訪問張三的資料 /user/zhangsan 李四的是 /user/lisi

注冊動態路由的方法是 /:參數

我們注冊映射關系時,這樣注冊

  {path:"/user/:userId",component:User}

我們觸發url時這樣觸發

//在<router-link>上動態綁定
<router-link :to="'/user/'+userId">用戶</router-link> //或者通過普通標簽的事件:btnClick(){this.$router.push('/user/'+this.userId)}

那么url跳轉后如何在先頁面中拿到跳轉的參數呢? 用$route

$route   :當前活躍路由 每個組件都有一個全局對象$route
一定要和$router區分開!!!!!

每個組件都有一個$route全局對象 (不是$router,少了一個r)

c457a11a10ae764585863600c11deb0f.png

我們看到這個 對象里有一個屬性params ,里面有一個鍵值對 就是我們想要的,這時我們制作一個計算屬性放在我們想顯示的位置就好了

  computed: {userId(){return this.$route.params.userId }},

四. 路由的懶加載

當我們打包時,我們的bundle.js會變得特別大,太大的bundle會使得加載變慢,從而出現瀏覽器空白.但其實即使是單頁程序,也無需浪費這段時間,同時給用戶不好的體驗.我們完全可以使用懶加載,將剛開始用不到的代代碼先不加載,等用戶觸發了相關路由時再加載

懶加載說白了就是不同的路由打包到不同的js里去

9106e87893e00c72c394ed509b9c0041.png

懶加載如何實現??

我們不要在一開始就import 而是在用到的地方,用箭頭函數直接匿名import

    path: '/about',  //2.添加映射關系component: ()=>import('../components/About')},

這樣,我們可以讓首頁之外的路由選擇懶加載,都懶加載也可以

五. 路由的嵌套

為什么要路由嵌套?看下圖:

我們想在home頁面請求路由,把路徑改為/home/news, 但是頁面還是在home頁,只不過綠框里的內容改為了news組件的內容

023ec7390fea6cf6a3c9c7e250e4b625.png

如何實現路由嵌套?

5386ab34978de3a620301b9645fd01ce.png

1.映射路由

因為還是在home頁面,所以不能直接寫路由映射,而是將路由映射嵌套在home的映射中

具體做法是,將子映射寫在父映射的children屬性里

  {path: '/home',       //這是home的映射component: Home,children:[           //它里面可以定義一個children,里面放子映射{path: '',       //添加默認子映射redirect:'news'},{path: 'news',                   //添加子映射關系 路徑只寫名字 newscomponent: ()=>import('../components/HomeNews')},{path: 'msgs',                   //添加子映射關系component: ()=>import('../components/HomeMsg')},]},

接下來我們在home.vue中確定顯示位置 路徑照實寫

<template><div><h2>我是首頁</h2><p>我是首頁內容</p><router-link to="/home/news">看看新聞</router-link><router-link to="/home/msgs">看看消息</router-link><router-view></router-view></div>
</template><script>
export default {name: "Home"
};
</script><style scoped>
</style>

六. 傳遞參數的路由

傳遞參數的兩種方式

  • 配置動態路由 /router/:參數
  • query類型的傳遞 請求路徑還是/router 但是同時會傳一個query,如: /router?id=123

如果只需要傳遞一個符號,則選擇第一種,如果信息較多,傳遞第二種

第一種我們之前已經接觸了,現在看

1. 如何用query傳遞參數

只需要在<router-link> 的to屬性里綁定一個對象,對象有如下屬性:

<router-link :to="{path:'/profile',     <--path屬性還是路由鏈接-->query:{              <--query屬性里面傳入一個對象,對象里都是鍵值對--> id:'lili',age:20,gender:'girl'}}">Profile</router-link>

新頁面里如何取?還是用之前用過的$route對象

this.$route.query

2.不用<router-link>怎么傳query??

$router.push和$router.replace傳入上述對象即可

  methods: {btnClick(){this.$router.push({path:'/profile',query:{name:"lili",age:18,gender:'girl'}})}}

七. keep-alive

一個頁面如果跳轉到了另一個頁面,那么這個頁面會被銷毀,此時如果用戶又返回這個頁面,又需要重新加載.

keep-alive主要解決離開頁面又返回時,頁面需要重構的問題,這種重構很多時候都是沒必要的

1. 如何使用keep-alive?

  • <router-view>其實也是個組件,如果它直接被包在<keep-alive>里面,所有涉及到的視圖組件都會被緩存
  • <keep-alive>是定義在Vue中的內置組件,目的是為了避免重新渲染

例:我們想讓home的兩個次級路由的組件來回切換時不重新構建,可以給控制他們顯示的<router-view>用<keep-alive>包起來

<template><div><h2>我是首頁</h2><p>我是首頁內容</p><router-link to="/home/news">看看新聞</router-link><router-link to="/home/msgs">看看消息</router-link><keep-alive><router-view></router-view></keep-alive></div>
</template><script>
export default {name: "Home"
};
</script><style>
</style>

6a037859144092baba5e583105533d25.png

2. 因為被keep-alive,子組件多了兩個屬性

被keep-alive的組件都會多兩個屬性 activated 和 deactivated,里面可以傳入方法,當活躍/不活躍時調用

舉例:

<template><div><h1>您有4條短消息</h1><ul><li>短消息1</li><li>短消息2</li><li>短消息3</li><li>短消息4</li></ul></div>
</template><script>
export default {name:"HomeMsg",activated() {console.log("我真活躍");},deactivated() {console.log("我不活躍了");},
}
</script><style></style>

26bb342d6b9ec52a09a4a53d200150c8.png

3.<keep-alive> 的包含和例外

如果又4個標簽,我們想其中3個keep-alive怎么辦???

這時我們需要用keep-alive的屬性

51477877b6ff179001d2dd5d0e2ac36e.png
    <keep-alive exclude="HomeMsg,User">    這會排除這兩個組件的keep-alive<router-view></router-view></keep-alive>

八. 導航守衛

有時我們需要監聽頁面跳轉

比如,我們要監聽頁面跳轉,跳轉時,將我們的網站的title該為對應頁面的名稱

1.前置守衛

前置守衛是跳轉前的守衛

我們可以在index.js里,給我們的router調用一個前置守衛(鉤子)函數:router.beforeEach()

router.beforeEach((to,from,next)=>{   //這就是頁面跳轉過程document.title= to.meta.matched[0].title  //將頁面標題改為了to路由的meta信息里的標題next()  // 必須調用next(),以維護鏈式
})

前提是to路由里有meta,如: meta(描述信息)

  {path:"/profile",component:()=>import('../components/Profile'),meta:{title:'檔案'},},

為什么有個 .matched[0], 因為有時我們進入嵌套路由,比如, home/news,

但此時我們還想顯示home的meta, 就可以通過這種方法找到它的第一級路由的meta

2.后置守衛

其實還有后置守衛(鉤子):

router.afterEach(to,from)

后置守衛沒有next

3.next有大用

  • next(): 進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。
  • next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到 from 路由對應的地址。
  • next('/') 或者 next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向 next 傳遞任意位置對象,且允許設置諸如 replace: truename: 'home' 之類的選項以及任何用在 router-link 的 to prop 或 router.push 中的選項。
  • next(error): (2.4.0+) 如果傳入 next 的參數是一個 Error 實例,則導航會被終止且該錯誤會被傳遞給 router.onError() 注冊過的回調。

4.路由獨享守衛

你可以在路由配置上直接定義 beforeEnter 守衛:

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...}}]
})

5.組件內守衛

你可以在路由組件內直接定義以下路由導航守衛:

const Foo = {template: `...`,beforeRouteEnter (to, from, next) {// 在渲染該組件的對應路由被 confirm 前調用// 不!能!獲取組件實例 `this`// 因為當守衛執行前,組件實例還沒被創建},beforeRouteUpdate (to, from, next) {// 在當前路由改變,但是該組件被復用時調用// 舉例來說,對于一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,// 由于會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鉤子就會在這個情況下被調用。// 可以訪問組件實例 `this`},beforeRouteLeave (to, from, next) {// 導航離開該組件的對應路由時調用// 可以訪問組件實例 `this`}
}
beforeRouteEnter 守衛 不能 訪問 this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。不過,你可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,并且把組件實例作為回調方法的參數。beforeRouteEnter (to, from, next) {next(vm => {// 通過 `vm` 訪問組件實例})
}
注意 beforeRouteEnter 是支持給 next 傳遞回調的唯一守衛。對于 beforeRouteUpdate 和 beforeRouteLeave 來說,this 已經可用了,所以不支持傳遞回調,因為沒有必要了。beforeRouteUpdate (to, from, next) {// just use `this`this.name = to.params.namenext()
}
這個離開守衛通常用來禁止用戶在還未保存修改前突然離開。該導航可以通過 next(false) 來取消。beforeRouteLeave (to, from, next) {const answer = window.confirm('Do you really want to leave? you have unsaved changes!')if (answer) {next()} else {next(false)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css div撐滿窗口高度_如何使用CSS將div的高度設置為窗口的100%?

css div撐滿窗口高度Introduction: 介紹&#xff1a; Hello there developers! Well, certainly if you are reading this article then that means that you have run into some trouble while creating your web page or website and if you are a beginner in this field, …

.net core image怎么保存_輕量級Vue圖片上傳插件——Vue-core-image-Upload

介紹vue-core-image-upload 是一款輕量級的 Vue.js 上傳插件&#xff0c;它可以支持的圖片的上傳&#xff0c;裁剪&#xff0c;壓縮。它同樣也支持在移動端的圖片處理&#xff0c;它定義了諸多上傳周期&#xff0c;你可以自由的進行流程控制。Githubhttps://github.com/Vanthin…

mysql確認半同步命令_怎么判斷mysql是否是半同步復制

AFTER_COMMIT(5.6默認值)master將每個事務寫入binlog ,傳遞到slave 刷新到磁盤(relay log)&#xff0c;同時主庫提交事務。master等待slave 反饋收到relay log&#xff0c;只有收到ACK后master才將commit OK結果反饋給客戶端。AFTER_SYNC(5.7默認值&#xff0c;但5.6中無此模式…

stl iterator_在C ++ STL中使用const_iterator訪問字符列表的元素

stl iteratorIn this example, we are declaring a character list and pushing the characters from A to Z using a for loop and push_back() function and then accessing the elements using const_iterator. 在此示例中&#xff0c;我們聲明一個字符列表&#xff0c;并使…

《Linus Torvalds自傳》摘錄

轉自&#xff1a;http://www.ruanyifeng.com/blog/2012/09/linus_torvalds.html作者&#xff1a; 阮一峰日期&#xff1a; 2012年9月 3日除了程序員&#xff0c;大概很少人知道Linux操作系統。它的發明者Linus Torvalds&#xff0c;知道的人就更少了。他本人也很低調&#xff0…

python繪制條形圖例題_python matplotlib庫繪制條形圖練習題

練習一&#xff1a;假設你獲取到了2017年內地電影票房前20的電影&#xff08;列表a&#xff09;和電影票房數據&#xff08;列表b&#xff09;&#xff0c;那么如何更加直觀的展示該數據&#xff1f; a ["戰狼2","速度與激情8","功夫瑜伽",&quo…

mysql驗證身份證號正確_通過SQL校驗身份證號碼是否正確

根據提供的身份證號碼信息驗證身份證號碼是否符合二代身份證規范&#xff0c;其中區域編碼網上可下載。使用數據庫為DB2&#xff0c;但目測可以通用身份證號碼第18位驗證算法從網上查得&#xff0c;具體驗證算法如下&#xff1a;1、將前面的身份證號碼17位數分別乘以不同的系數…

python學習記錄

python學習記錄schedule庫schedule庫 import schedule import time #引入schedule和timedef job():print("Working in progress...") #定義一個叫job的函數&#xff0c;函數的功能是打印Im working...#部署情況 schedule.every(10).minutes.do(job) #部署每10…

Python | 在屬性的幫助下實現setter和getter

In this program, we are implementing Properties. Python offers a better way to implement setters and getter with the help of properties by using attribute property. By default properties are getters so we have to declare setter part explicitly. 在此程序中&…

windows進入mysql

cd \wamp\bin\mysql\mysql5.6.17\bin\mysql -hlocalhost -uroot -p轉載于:https://blog.51cto.com/8818968/1835449

python爬取js動態網頁_Python 爬取網頁中JavaScript動態添加的內容(一)

當我們進行網頁爬蟲時&#xff0c;我們會利用一定的規則從返回的 HTML 數據中提取出有效的信息。但是如果網頁中含有 JavaScript 代碼&#xff0c;我們必須經過渲染處理才能獲得原始數據。此時&#xff0c;如果我們仍采用常規方法從中抓取數據&#xff0c;那么我們將一無所獲。…

mac mysql 忘記密碼 卸載_MySQL忘記密碼后重置密碼(Mac )

轉&#xff1a;http://www.cnblogs.com/lihuanqing/p/5623872.html安裝好MySQL以后&#xff0c;系統給了個默認的的密碼&#xff0c;然后不小心關了&#xff0c;慘了密碼沒有了。1、關閉mysql服務器 sudo /usr/local/mysql/support-files/mysql.server stop 也可以在系統偏好里…

MATLAB學習——變量、數組

變量、數組變量賦值顯示格式數組一維數組生成數組元素提取提取單個元素抽取二維數組生成數組提取提取單個元素提取子矩陣添加字符數組空數組變量 賦值 賦值語句一般形式&#xff1a;變量 數、字符或表達式 a 1 #自定義為雙精度double x x y 1*2*3顯示格式 可以…

Nginx嚴格訪問代理HTTP資源

為什么80%的碼農都做不了架構師&#xff1f;>>> 1 嚴格訪問 訪問能基于客戶端的IP地址允許或拒絕或使用基于HTTP驗證。 為了允許或拒絕從某個地址及或所有地址的訪問&#xff0c;使用allow和deny指令&#xff1a; location / { deny 192.168.1.2; allow 192.168…

Java LinkedList公共布爾boolean offerLast(Object o)方法(帶示例)

LinkedList公共布爾布爾offerLast(Object o)方法 (LinkedList public boolean offerLast(Object o) method) This method is available in package java.util.LinkedList.offerLast(Object o). 軟件包java.util.LinkedList.offerLast(Object o)中提供了此方法。 This method is…

csv 字符串_Python實現json轉csv格式

利用Python實現json格式轉換為csv文件格式前言本文是學校的課程設計&#xff0c;這里我沒有用封裝好的json庫來實現&#xff0c;而是把讀進來的文件當一個字符串來處理&#xff0c;核心函數其實是python的eval()類型轉換函數。什么是 JSON?我們要考慮到json格式下key-value對的…

MATLAB學習——常用語句

MATLAB學習——常用語句if語句if endif elseif elseifswitch語句for語句while語句if語句 if end n input(n); if rem(n,2) 0A even endif else n input(n); #輸入空數組判斷為odd if rem(n,2) 0A even elseA odd endif elseif n input(n); if rem(n,2) 0;even els…

mysql 線性表_數據結構之線性表

概要參考《大話數據結構》&#xff0c;把常用的基本數據結構梳理一下。線性表定義線性表(List)&#xff1a;零個或多個數據元素的有限序列。若將線性表記為 \((a_1, \cdots, a_{i-1}, a_i, a_{i1}, \cdots, a_n)\)&#xff0c;則表中 \(a_{i-1}\) 領先于 \(a_i\)&#xff0c;\(…

使用JavaScript修改瀏覽器URL地址欄的實現代碼

現在的瀏覽器里,有一個十分有趣的功能&#xff0c;你可以在不刷新頁面的情況下修改瀏覽器URL;在瀏覽過程中.你可以將瀏覽歷史儲存起來&#xff0c;當你在瀏覽器點擊后退按鈕的時候&#xff0c;你可以沖瀏覽歷史上獲得回退的信息&#xff0c;這聽起來并不復雜&#xff0c;是可以…

ruby array_在Ruby中使用Array.pop和Array.shift方法從Array中刪除元素

ruby arrayRuby Array.pop和Array.shift方法 (Ruby Array.pop and Array.shift methods) If you are reading an article that is related to deleting elements from the instance of Array class then it is expected from you that you are aware of the basic things relat…