最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3 中的 Vue-Router 和 VueX詳解

 更新時間:2022年12月12日 11:53:31   作者:John是橘紅  
VueX 提供了一個全局都可以使用的數(shù)據(jù)管理倉庫,不用考慮父子傳值之類的問題,并且可以跨頁面?zhèn)鬟f數(shù)據(jù),提高了可維護性,這篇文章主要介紹了Vue3 中的 Vue-Router 和 VueX,需要的朋友可以參考下

Vue3 中的 Vue-Router 和 VueX

先使用 vue create 指令來創(chuàng)建 vue 工程項目,并選擇自定義,將 Router 和 VueX 勾上。

勾上以后看主入口 main.js,可以看到項目自動幫我們注冊了 vue-router 和 VueX。

// main.js
createApp(App).use(store).use(router).mount('#app')

1. Vue-Router 路由的理解和使用

路由是指根據(jù) url 的不同,展示不同的內(nèi)容。

查看 src 文件夾里的 router,這就是來處理路由的地方。

其中,index.js 有關(guān)鍵的代碼

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

定義了兩個路由項。當訪問根目錄,就加載 HomeView 這個組件。如果訪問 /about,則懶加載 AboutView 這個組件。

import(...)是異步加載路由的方法。因為如果一口氣全部組件加載出來,主頁的加載的性能將會很低,為了提高組件的加載性能,使用懶加載按需加載,等進入 /about 或其他的頁面再加載響應(yīng)部分的代碼。但是異步加載代碼也有相應(yīng)的問題,就是去其他的頁面可能會有卡頓(其實就是加載的時間分攤了)。

因此,vue-router 就是根據(jù) url 不同來顯示不同組件的特性。

現(xiàn)在查看根組件 App.vue,上面有關(guān)鍵的代碼:

<template>
  <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </nav>
  <router-view/>
</template>

router-link 是跳轉(zhuǎn)路由的標簽,點擊后就會跳轉(zhuǎn)到相應(yīng)的路由。

router-view 負責展示當前路由對應(yīng)的組件內(nèi)容。例如上面的代碼,當跳轉(zhuǎn)到根路徑上時,router 會進行搜索,當搜索到匹配項時,便顯示相應(yīng)的組件 HomeView。

2. VueX 語法詳解

在文首就看到了,注冊了 VueX,接下來看 src 的 store 目錄,這里邊的 index.js 可以看到以下內(nèi)容,稍后會講。

export default createStore({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

2.1 VueX 是什么

VueX 是數(shù)據(jù)管理框架。之前的數(shù)據(jù)傳遞都是父子之間的傳遞,雖然也有 provider 之類的方法進行跨級傳遞,但是可維護性也不會特別高。

VueX 提供了一個全局都可以使用的數(shù)據(jù)管理倉庫,不用考慮父子傳值之類的問題,并且可以跨頁面?zhèn)鬟f數(shù)據(jù)。提高了可維護性。

使用方法

提供數(shù)據(jù):在 store 里的 state 里定義一些數(shù)據(jù)

// VueX 創(chuàng)建了一個全局唯一的倉庫,用來存放全局的數(shù)據(jù)
export default createStore({
  state: {
    name: "John",
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

在需要用數(shù)據(jù)的地方通過 this.$store 獲取即可

<template>
  <div>{{ myName }}</div>
</template>

<script>
export default {
  name: "LoginView",
  computed: {
    myName() {
      return this.$store.state.name;
    },
  },
};
</script>

2.2 VueX 數(shù)據(jù)修改流程

講一下 VueX 的修改規(guī)范,因為全局的數(shù)據(jù)是不能隨意更改的,因此 VueX 有一套機制流程,并不能直接用賦值的方法進行修改。

修改流程

在組件里提交一個 action 到 store,dispatch 的第一個參數(shù)是 action 名稱,后面可自定義參數(shù)。

// LoginView.vue
<template>
  <div>{{ myName }}</div>
  <button @click="handleClick">click</button>
</template>

<script>
export default {
  name: "LoginView",
  computed: {
    myName() {
      return this.$store.state.name;
    },
  },
  methods: {
    handleClick() {
      // 1. 想改變數(shù)據(jù),VueX 要求第一步,必須派發(fā)一個 action,action 名稱為 actions 里的方法名
      this.$store.dispatch("change");
    },
  },
};
</script>

store 感知到 action,執(zhí)行 actions 下面對應(yīng)的方法

actions 對應(yīng)的方法 commit 信息后傳遞給 mutations。commit 的信息為 mutations 里的方法名。

mutations 里對應(yīng)的方法執(zhí)行修改數(shù)據(jù)的操作。

import { createStore } from "vuex";

// VueX 創(chuàng)建了一個全局唯一的倉庫,用來存放全局的數(shù)據(jù)
export default createStore({
  state: {
    name: "John",
  },
  getters: {
  },
  mutations: {
    // 4. 接收到 commit 信息后,觸發(fā)對應(yīng)的 mutation
    change(state) {
      // 5. 在 mutation 里修改數(shù)據(jù)
      state.name = "Modified Name";
    },
  },
  actions: {
    // 2. 接收到 action 后執(zhí)行相應(yīng)的方法
    change(store) {
      // 3. commit 后發(fā)送給 mutations
      store.commit("change");
    },
  },
  modules: {},
});

從上面的流程來看,VueX 創(chuàng)建了一個全局唯一的倉庫,用來存放全局的數(shù)據(jù),同時里面設(shè)置了一系列的數(shù)據(jù)操作流程。

這流程下來有點麻煩啊,為啥不直接 commit 過去呢?同步代碼看起來是如此,但是如果有異步操作的話,這些步驟就很有必要了。

注意

mutations 和 actions 里的方法第一個參數(shù)各不相同。

actions 里面第一個參數(shù)是 store,因為需要用 store.commit 方法來提交給 mutations。

mutations 里邊的方法第一個參數(shù)是 state,因為 store 是用來修改 store 里 state 的方法。

可見,vue 官方在代碼層面都是推薦分離的。

其他細則 mutations 里面只允許寫同步代碼,不許寫異步代碼actions 里面允許寫異步操作

優(yōu)點在于,將兩種功能分離,mutations 里做數(shù)據(jù)的改變,actions 里做主要的邏輯書寫,維護的時候會更加方便。

getter 是啥

store 里的數(shù)據(jù)有時候并不能直接拿來用,還需要經(jīng)過一些小處理。一般就會想,在組件內(nèi)處理不就完事了?但是呢,萬一有很多的組件都有著需求呢,挨個寫就不合適。getter 就相當于 store 里的 computed 屬性,對 state 進行了一定的處理。

使用方法:

設(shè)置 getter

getter 接收兩個參數(shù),然后返回一個值。

state,必選,是 store 里的數(shù)據(jù)getters,可選,是 store 里的所有 getters

例如,我要計算得到大寫后的 name:

// store/index.js
  getters: {
    upperCasedName: (state) => {
      return state.name.toUpperCase();
    }
  },

組件獲取 store 里的 getter

<template>
  <div>{{ upperCasedName }}</div>
  <button @click="handleClick">click</button>
</template>

<script>
export default {
  name: "LoginView",
  computed: {
    upperCasedName() {
      return this.$store.getters.upperCasedName;
    },
  },
  methods: {
    handleClick() {
      // 1. 想改變數(shù)據(jù),VueX 要求第一步,必須派發(fā)一個 action
      this.$store.dispatch("change");
    },
  },
};
</script>

通過 computed 獲取到 getter 后,點擊按鈕改變了 store 里的 name,上邊顯示的仍然是大寫的,因為獲取的是全部字母大寫后的 name。

2.3 Composition API 使用 VueX

composition API 使用 useStore 獲取 store 即可。

<template>
  <div>{{ name }}</div>
</template>

<script>
import { useStore } from "vuex";
export default {
  name: "LoginView",
  setup() {
    const store = useStore();
    const name = store.state.name;
    return {
      name,
    };
  },
};
</script>

用 toRefs 解構(gòu)的方法也行:

<template>
  <div>{{ name }}</div>
  <button @click="handleClick">Click</button>
</template>

<script>
import { toRefs } from "@vue/reactivity";
import { useStore } from "vuex";
export default {
  name: "LoginView",
  setup() {
    const store = useStore();
    const { name } = toRefs(store.state);
    const handleClick = () => {
      store.commit("changeName");
    };
    return {
      name,
      handleClick,
    };
  },
};
</script>

到此這篇關(guān)于Vue3 中的 Vue-Router 和 VueX的文章就介紹到這了,更多相關(guān)Vue3 中的 Vue-Router 和 VueX內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue.js監(jiān)聽select2的值改變進行查詢方式

    Vue.js監(jiān)聽select2的值改變進行查詢方式

    這篇文章主要介紹了Vue.js監(jiān)聽select2的值改變進行查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue實踐---vue不依賴外部資源實現(xiàn)簡單多語操作

    vue實踐---vue不依賴外部資源實現(xiàn)簡單多語操作

    這篇文章主要介紹了vue實踐---vue不依賴外部資源實現(xiàn)簡單多語操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Vue+Element UI+Lumen實現(xiàn)通用表格分頁功能

    Vue+Element UI+Lumen實現(xiàn)通用表格分頁功能

    這篇文章主要介紹了Vue+Element UI+Lumen實現(xiàn)通用表格分頁功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • elementUI中Table表格問題的解決方法

    elementUI中Table表格問題的解決方法

    這篇文章主要給大家介紹了關(guān)于elementUI中Table表格問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • vue側(cè)邊欄動態(tài)生成下級菜單的方法

    vue側(cè)邊欄動態(tài)生成下級菜單的方法

    今天小編就為大家分享一篇vue側(cè)邊欄動態(tài)生成下級菜單的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue.js基礎(chǔ)知識匯總

    Vue.js基礎(chǔ)知識匯總

    Vue.js 專注于 MVVM 模型的 ViewModel 層。它通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來。Vue.js和其他庫相比是一個小而美的庫,作者的主要目的是通過一個盡量簡單的 API 產(chǎn)生可反映的數(shù)據(jù)綁定和可組合的視圖組件,感覺作者的思路非常清晰。
    2016-04-04
  • vue雙向數(shù)據(jù)綁定知識點總結(jié)

    vue雙向數(shù)據(jù)綁定知識點總結(jié)

    這篇文章主要介紹了vue雙向數(shù)據(jù)綁定的原理以及知識點總結(jié),并做了代碼實例分析,有需要的朋友參考下。
    2018-04-04
  • vue中的keep-alive用法指南

    vue中的keep-alive用法指南

    keep-alive是Vue中的一個內(nèi)置組件,用于緩存非活動組件實例,避免重復(fù)渲染,優(yōu)化性能,本文給大家介紹vue中的keep-alive用法指南,感興趣的朋友一起看看吧
    2024-10-10
  • Vue純前端實現(xiàn)導(dǎo)出Excel并修改樣式

    Vue純前端實現(xiàn)導(dǎo)出Excel并修改樣式

    這篇文章主要為大家詳細介紹了Vue如何利用xlsx-style庫實現(xiàn)導(dǎo)出Excel并修改樣式的功能,文中的示例代碼講解詳細,有需要的可以參考下
    2024-01-01
  • vue中data改變后讓視圖同步更新的方法

    vue中data改變后讓視圖同步更新的方法

    這篇文章主要給大家介紹了關(guān)于vue中data改變后讓視圖同步更新的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

四子王旗| 上虞市| 富源县| 松溪县| 冀州市| 噶尔县| 洛南县| 唐河县| 溆浦县| 武夷山市| 来宾市| 香港| 正蓝旗| 彰武县| 新蔡县| 阿勒泰市| 西贡区| 洪泽县| 徐州市| 闵行区| 福贡县| 兴国县| 伊川县| 大田县| 永登县| 焉耆| 泸水县| 吉林省| 武平县| 巨野县| 久治县| 松江区| 玉门市| 永登县| 湖北省| 噶尔县| 青神县| 甘德县| 东港市| 罗江县| 陈巴尔虎旗|