vue-router 路由和前端狀態(tài)管理

一贼穆、vue-router 路由基本加載

路由,通俗地來講就是輸入不同的網(wǎng)址坯临,加載不同的組件焊唬。

  1. 進(jìn)入項(xiàng)目目錄
cd my-project
  1. 安裝
npm install -save vue-router
  1. 在文件中引用
import router from 'vue-router'
Vue.use(router)
  1. 配置路由文件,并在 vue 實(shí)例中注入
var rt = new router({
  routes: [{
    path: '/', // 指定要跳轉(zhuǎn)的路徑
    component: HelloWorld // 指定要跳轉(zhuǎn)的組件
  }]
})
new Vue({
  el: '#app',
  router: rt,
  components: { App },
  template: '<App/>'
})
  1. 確定視圖加載的位置
<router-view></router-view>

二看靠、vue-router 路由的跳轉(zhuǎn)

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

例:

<template>
  <ul>
    <li>
      <router-link to="/helloworld">HELLO WORLD</router-link>
    </li>
    <li>
      <router-link to="/helloearth">HELLO EARTH</router-link>
    </li>
  </ul>
</template>

三赶促、vue-router 路由參數(shù)的傳遞

  • 必須在路由中加入路由的 name 屬性
  • 必須在 path 后加 /: + 傳遞的參數(shù)
  • 傳遞參數(shù)和接收參數(shù)見下方代碼
1. 配置路由
export default new router({ // 導(dǎo)出路由
    routes: [{
        name: 'helloworld',
        path: '/helloworld/:worldmsg', // 指定要跳轉(zhuǎn)的路徑
        component: HelloWorld // 指定要跳轉(zhuǎn)的組件
    }, {
        name: 'helloearth',
        path: '/helloearth/:earthmsg',
        component: HelloEarth
    }]
})
2. 傳遞和讀取參數(shù)(兩種方法)
  1. 方法一
  • 傳遞參數(shù):
<router-link :to="{name:'helloworld', params:{worldmsg:'你好世界'}}">
    HELLO WORLD
</router-link>
<router-link :to="{name:'helloearth', params:{earthmsg:'你好地球'}}">
    HELLO EARTH
</router-link>
  • 讀取(接收)參數(shù):$route.params.xxx
    要往哪個(gè)組件跳轉(zhuǎn)挟炬,就由哪個(gè)組件來接收鸥滨。
我是傳遞過來的參數(shù):<h3>{{$route.params.worldmsg}}</h3> 
  1. 方法二(不常用)
  • 傳遞參數(shù):
<router-link :to="{path:'/helloearth', query:{worldmsg:'你好世界'}}">
    HELLO WORLD
</router-link>
  • 讀取(接收)參數(shù):函數(shù)模式
    可以創(chuàng)建一個(gè)函數(shù)返回 props谤祖,這樣便可以將參數(shù)轉(zhuǎn)換成另一種類型婿滓,將靜態(tài)值與基于路由的值結(jié)合等。
const router = new VueRouter({
  routes: [{
    path: '/search',component: SearchUser, props: (route) => ({
        query: route.query.q })
  }]
})
  1. 兩種傳遞方式的區(qū)別
  • params 傳遞方式:http://localhost:8080/helloworld/你好世界
  • query 傳遞方式:http://localhost:8080/helloworld?name=xx&count=xxx

四粥喜、Axios 詳解

1. Axios 簡(jiǎn)介

axios 是一個(gè)基于 Promise 用于瀏覽器和 node.js 的 HTTP 客戶端凸主,它的功能與 ajax 相似,其本身具有以下特征:

  • 在瀏覽器中創(chuàng)建 XMLHttpRequest
  • 從 node.js 發(fā)出 http 請(qǐng)求
  • 支持 Promise API
  • 攔截請(qǐng)求和響應(yīng)
  • 轉(zhuǎn)換請(qǐng)求和響應(yīng)數(shù)據(jù)
  • 取消請(qǐng)求
  • 自動(dòng)轉(zhuǎn)換 JSON 數(shù)據(jù)
  • 客戶端支持防止 CSRF/XSRF

2. Axios 之 get 請(qǐng)求詳解

  1. 安裝
npm install axios
  1. 在文件中引入加載
import axios from 'axios'
  1. 將 axios 全局掛載到 VUE 原型上
Vue.prototype.$http = axios // $ 后面的內(nèi)容自定義
  1. 發(fā)送請(qǐng)求
  • 以 CNode 社區(qū)官方 API 為例:
getData(){
  this.$http.get('https://cnodejs.org/api/v1/topics')
    .then((res) => {
      this.items = res.data.data
      console.log(res)
    })
    .catch(function(err){
      console.log(err)
    })
}
  • GET 請(qǐng)求的兩種參數(shù)傳遞形式:
axios.get('https://cnodejs.org/api/v1/topics', {
  params: {      // 只有一個(gè)參數(shù)時(shí)可省略params直接寫參數(shù)
    page: 1,
    limit: 10
   }
})

axios.get('https://cnodejs.org/api/v1/topics?page=1&limit=15')

3. Axios 之 post 請(qǐng)求詳解

POST 請(qǐng)求和 GET 類似额湘,將請(qǐng)求中的 get 替換成 post 即可秕铛。

  • POST 請(qǐng)求傳遞數(shù)據(jù)的兩種格式:
form-data?page=1&limit=48

x-www-form-urlencoded {
  page: 1,
  limit: 10
}

注意:在 axios 中,post 請(qǐng)求接收的參數(shù)必須是 form-data 格式
需要使用 qs 插件的 -qs.stringify 方法缩挑。

  • 使用步驟:
    安裝 qs 插件:npm install qs
    在文件中引入:import qs from 'qs'
    在 post 請(qǐng)求中使用:qs.stringify({ page: 1, limit: 10 })
  • 以 CNode 社區(qū)官方 API 為例:
postData(){
  this.$http.get(url, qs.stringify({
      page: 1,
      limit: 10
  })).then((res) => {
      this.items = res.data.data
      console.log(res)
    })
    .catch(function(err){
      console.log(err)
    })
}

五但两、Vuex 之 store

Vuex 是用來管理狀態(tài),共享數(shù)據(jù)供置,在各個(gè)組件之間管理外部狀態(tài)的一個(gè)插件谨湘。例如用戶的已登錄狀態(tài),需要在各個(gè)組件之前進(jìn)行交互芥丧。Vuex 首先會(huì)創(chuàng)建一個(gè)狀態(tài)倉(cāng)庫(kù)紧阔,并將所有組件囊括其中,即這個(gè)倉(cāng)庫(kù)下的所有組件都可以共享倉(cāng)庫(kù)里的狀態(tài)续担。

  • 使用步驟:
    1. 安裝 vuex:npm install vuex
    2. 在 main.js 文件中引入并通過 use 方法使用 vuex:
    import Vuex from 'vuex'擅耽, Vue.use(Vuex)
    3. 創(chuàng)建狀態(tài)倉(cāng)庫(kù)
    4. 將 store 注入到 Vue 實(shí)例
    5. 通過 this.$store.state.xxx 拿到需要的數(shù)據(jù)
// 創(chuàng)建狀態(tài)倉(cāng)庫(kù)(此處名稱store可自定義)
var store = new Vuex.Store({
  state:{
    xxx:yyy
  }
})

六、Vuex 的相關(guān)操作

1. 改變狀態(tài)

除了能夠獲取狀態(tài)物遇,那么如何改變狀態(tài)呢乖仇?
我們用 state 存放定義的狀態(tài)憾儒,用 mutations 來改變狀態(tài)。

  • mutations 用法
// 創(chuàng)建狀態(tài)倉(cāng)庫(kù)
var store = new Vuex.Store({
  state: {
    num: 88
  },
  mutations: {
    // 定義狀態(tài)改變函數(shù)
    zzz: function(state){
      state.num++
    }
  }
})

// 調(diào)用方式
this.$store.commit('zzz') // zzz 是在 mucations 中定義的方法名
  • actions 用法:
var store = new Vuex.Store({
  state: {
    num: 88
  },
  mutations: {
    zzz: function(state){
      state.num++
    }
  },
  actions:{
    // actions 中只能對(duì) mutation 進(jìn)行操作
    ccc: function(context){ // context是上下文對(duì)象
      context.commit('zzz')
    }
   }
})

// 調(diào)用方式
this.$store.dispatch('ccc')

注意
actions 提交的是 mutation乃沙,而不是直接變更狀態(tài)起趾。
actions 可以包含異步操作,但是 mutation 只能包含同步操作警儒。

  • getters 用法:
var store = new Vuex.Store({
  state: {
    num: 88
  },
  mutations: {
    zzz: function(state){
      state.num++
    }
  },
  getters: {
    getNum: function(state){
      return state.num>0 ? state.num : 0
    }
  }
})

// 調(diào)用方式
this.$store.getters.getNum

2. vuex 狀態(tài)管理流程

vuex 狀態(tài)管理流程為:

view ——> actions ——> mutations ——> state ——> view

  • 從視圖出發(fā)训裆,先是 actions,然后是 mutations蜀铲,然后通過 mutations 來操作 state边琉,最后再回到 view。
  • 直接對(duì)狀態(tài)進(jìn)行操作的是 mutations记劝,不是 actions艺骂。
  • 在這個(gè)過程中,actions 不是必須存在的隆夯,但如果有異步操作钳恕,則必須包含 actions。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹄衷,一起剝皮案震驚了整個(gè)濱河市忧额,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愧口,老刑警劉巖睦番,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耍属,居然都是意外死亡托嚣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門厚骗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示启,“玉大人,你說我怎么就攤上這事领舰》蛏ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵冲秽,是天一觀的道長(zhǎng)舍咖。 經(jīng)常有香客問我,道長(zhǎng)锉桑,這世上最難降的妖魔是什么排霉? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮民轴,結(jié)果婚禮上攻柠,老公的妹妹穿的比我還像新娘球订。我一直安慰自己,他們只是感情好辙诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布辙售。 她就那樣靜靜地躺著轻抱,像睡著了一般飞涂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祈搜,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天较店,我揣著相機(jī)與錄音,去河邊找鬼容燕。 笑死梁呈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蘸秘。 我是一名探鬼主播官卡,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醋虏!你這毒婦竟也來了寻咒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤颈嚼,失蹤者是張志新(化名)和其女友劉穎毛秘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阻课,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叫挟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了限煞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹恳。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖署驻,靈堂內(nèi)的尸體忽然破棺而出适秩,到底是詐尸還是另有隱情,我是刑警寧澤硕舆,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布秽荞,位于F島的核電站,受9級(jí)特大地震影響抚官,放射性物質(zhì)發(fā)生泄漏扬跋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一凌节、第九天 我趴在偏房一處隱蔽的房頂上張望钦听。 院中可真熱鬧洒试,春花似錦、人聲如沸朴上。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痪宰。三九已至叼架,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衣撬,已是汗流浹背乖订。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留具练,地道東北人乍构。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扛点,于是被迫代替她去往敵國(guó)和親哥遮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容