1. 程式人生 > 其它 >沉澱vue相關知識(主要還是個人積累用)

沉澱vue相關知識(主要還是個人積累用)

路由懶載入的配置:

const Home= () =>import('../components/Home') //使用ES6中的路由懶載入的方式
const About= () =>import('../components/About')
const User= () =>import('../components/User')

const HomeNews=()=>import('../components/HomeNews')
const HomeMessage=()=>import('../components/HomeMessage')

const Profile=()=>import('../components/Profile')

配置完成後,根據不同元件生成對應的js檔案,在載入對應元件的同時載入自己的js檔案,這樣就做到了一個單個活躍元件載入的情況,對效能比較好。

關於全域性導航守衛,和後置鉤子

見vue原始碼:

beforeEach是路由跳轉前執行的,afterEach是路由跳轉後執行的

通過路由來切換對應元件時,各元件是會被重新建立的,也就是會呼叫create函式(元件建立的時候呼叫)和destroyed函式(元件銷燬的時候呼叫)。

reoute-view,是viewrouter中的一個元件,而keep-alive是vue中的一個元件。keep-alive可以使被包含的元件保留狀態,不會被重新渲染。

需要注意的是,當一個route-view在使用keep-alive包住的時候,元件狀態是會被快取的,create函式只會呼叫一次,此時是不會呼叫destroyed函式的,既然不會呼叫那麼這個元件的狀態是不會被重新建立的,這樣一來對效能的也是比較好,總而言之就是一個對元件進行快取的一個東西。

還有兩個函式,acivated函式(元件處於活躍時呼叫),deactivated函式(元件處於不活躍時呼叫)。這裡個函式只有在存在keep-alive的時候才會被呼叫。

那麼有可能存在另外一個需求:就是我希望有的元件時需要不斷重新建立然後被銷燬的。

那麼我們就可以在keep-alive基礎上新增一些屬性就可以了。

此時,這個交Profile的元件就不會被keep-alive快取了。

這樣這兩個元件都不會被快取

vue在單個元件style中引入css檔案可以通過@import "路徑" 這種方式去引入

常見錯誤:在router-view顯示不出來的時候,檢視路由元件註冊中component不能有s!!!

瀏覽器報錯:ncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: "/h

解決辦法:加上這一行程式碼:this.$router.replace('/location').catch(err=>{console.log(err)})

在腳手架2中為路徑新增別名:

不過在使用的時候需要咋前面加個波浪線。並且要重新dev一下

Vuex:

手寫一個vuex,也就是存在一個變數資料,所有元件共享這個資料。注意:這個資料並不是響應式的,之所以在vue中的data是響應式的是因為它依賴於vue底層的一個響應式系統。

            const sharpObj={
                name:'hc'
            }

            Vue.Prototype.sharpObj=sharpObj;

            Vue.component('Cpn2',{
                this.sharpObj.name
            })

            Vue.component('Cpn1',{

            })

            const app = new Vue({
                el:"#app",
                
            })    

建立vuex的步驟,先再src中建立store資料夾,在資料夾裡面建立index.js,程式碼如下:

import Vue from 'vue'
import Vuex from 'vuex'

//1.安裝外掛,底層會去執行vue.install方法
Vue.use(Vuex)

//2.建立物件
const store= new Vuex.Store({


})

//3.匯出Store物件
export default store

掛載到main.js

掛載上去之後,它會通過 Vue.prototype.$store=store。而store這裡面的值都可以讓所有元件去共享,vuex管理這些store裡面的值。

綜上所述,所有的元件都有一個$store物件

通過this.$store.commit去提交一下,然後呼叫commit傳過去再vuex那邊定義的方法

<template>
  <div id="app">
    <h2>-------{{message}}-------</h2>
    <h2>{{$store.state.counter}}</h2>
    <button @click="addition">+</button>
    <button @click="subtraction">-</button>

    <h2>-------HelloVuex元件資料-------</h2>
    <hello-vuex></hello-vuex>
  </div>
  </template>
  
  <script>
    import HelloVuex from './components/HelloVuex.vue'

    export default {
      name: 'App',
      components:{
        HelloVuex
      },
      data() {
        return {
          message: 'app元件資料',
          // counter:0
        }
      },
      methods: {
        addition(){
          this.$store.commit('increment')
        },
        subtraction(){
          this.$store.commit('decrement')
        }
      },

    }
  </script>

<style>
</style>

通過devtools去除錯:

關於getters的用法:

import Vue from 'vue'
import Vuex from 'vuex'

//1.安裝外掛,底層會去執行vue.install方法
Vue.use(Vuex)

//2.建立物件
const store = new Vuex.Store({
    state: {
        counter: 1000,
        Student:[
            {id:1,name:'hc',age:24},
            {id:2,name:'hc1',age:30},
            {id:3,name:'hc2',age:20},
            {id:4,name:'hc3',age:18},
        ]
    },
    //修改state裡面的東西
    mutations: {
        increment(state) {
            state.counter++
        },
        decrement(state) {
            state.counter--
        }
    },
    actions: {

    },
    //state中的資料可能會發生變異(改變),利用getters去依賴並獲取它改變後的資料,這裡的getters和計算屬性有些類似,同樣也可以快取state單一狀態樹中的資料,只有再依賴值發生改變時才去重新計算
    //getters:去store拿一些資料的時候,如果state中的資料需要經過變化才給別人用的,就可以再getters中去處理
    getters: {
        PowerCounter(state){
            return state.counter * state.counter
        },
        //filter過濾一些資料,獲取年齡大於20歲的學生
        More20Stu(state){
            return state.Student.filter(s=>s.age>=20)
        },
        //獲取年齡大於20歲學生的個數
        More20StuLength(state,getters){
            return getters.More20Stu.length
        },
        MoreAgeStu(state){
            return age=> state.Student.filter(s=>s.age>age)
        }

    },
    modules: {

    }

})

//3.匯出Store物件
export default store

再app.vue中使用getters:

<template>
  <div id="app">
    <h2>-------{{message}}-------</h2>
    <h2>{{$store.state.counter}}</h2>
    <button @click="addition">+</button>
    <button @click="subtraction">-</button>

    <h2>-------App元件的Getter資料</h2>
    <h2>{{$store.getters.PowerCounter}}</h2>
    <h2>{{$store.getters.More20Stu}}</h2>
    <h2>{{$store.getters.More20StuLength}}</h2>
    <h2>{{$store.getters.MoreAgeStu(8)}}</h2>

    <h2>-------HelloVuex元件資料-------</h2>
    <hello-vuex></hello-vuex>
  </div>
  </template>
  
  <script>
    import HelloVuex from './components/HelloVuex.vue'

    export default {
      name: 'App',
      components:{
        HelloVuex
      },
      data() {
        return {
          message: 'app元件資料',
          // counter:0
        }
      },
      methods: {
        addition(){
          this.$store.commit('increment')
        },
        subtraction(){
          this.$store.commit('decrement')
        }
      },

    }
  </script>

<style>
</style>

關於Mutation:

mutation攜帶引數(統稱為:payload)的方式:

通過commit去提交一下,變更state中的資料

Mutation提交風格:

在用的時候就這麼用:

Mutation型別常量是什麼?

在編碼過程中,有時候為了程式碼準確度更高,通常在變數一樣的情況下選擇拷貝的方式進行替換,vuex實際上也幫我們考慮了這一點。

我們可以通過定義常量統一管理這些名稱一樣的變數,到時候用的時候直接用常量即可。這裡你也可以直接去看官方文件更加容易理解。

關於Actions:

如果通過Actions去更新State裡面的值,實際上還是需要走mutation那一步,也就是說要更新state就要走mutation不能直接通過Action更新State,這樣devtools是檢測不到到底是怎麼更新的,這也和上面那個迴圈圖不符合!!!

那麼如何去更新呢?

context引數是要帶,這裡的意思是上下文的意思。

可以把context看作是store,那麼context也是可以用通過commit去更新的,再呼叫mutation的updateInfo定義的方法

要通過dispatch去更新

使用promise:這裡的promise在dispatch後做了一次週轉。

還有最後一個vuex五大屬性的最後一個modules

在vuex的state中,我們知道這裡是儲存一些元件需要共享的一些變數,而我們現在是崇尚單一狀態樹,也就是隻有一個Store物件管理vuex。那麼如果變數變得很多,就會顯得state裡面變得比較臃腫。

所以他讓我們在Store裡面具體分模組

這裡說明雖然state資料被模組化了,但是vue依然把它放到state中了。

需要注意的是,在使用模組裡面的getters時,是可以有三個引數的,根據第三個引數可以拿到外面Store物件裡的state的值!!!

模組裡面的actions裡面的context引數指向的是自己模組的mutations!!!而不是最外面的Store的mutaions