vue高級進階系列——用typescript玩轉vue和vuex

2021-01-07 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。說的簡單點就是對vue的狀態進行統一管理,如下圖介紹了其管理模式:

最簡單的使用方法長這樣的:

// 如果在模塊化構建系統中,請確保在開頭調用了 Vue.use(Vuex)

const store = new Vuex.Store({

state: {

count: 0

},

mutations: {

increment (state) {

state.count++

}

}

})

複製代碼

如果項目中需要管理的狀態很多,也可以將這些方法按文件分開,最後掛載在index文件下:

// state.js

export default {

total: 0

}

複製代碼

// mutaction.js

export default {

add(state){

state++

}

}

複製代碼

// action.js

export default{

addAsync(context){

setTimeout(() => {

context.commit('add');

}, 1000);

}

}

複製代碼

最後統一導入到index.js

// index.js

import Vue from 'vue';

import Vuex from 'vuex';

import { state } from './state';

import mutations from './mutation';

import actions from './action';

Vue.use(Vuex);

export default new Vuex.Store({

state,

mutations,

actions,

});

複製代碼

完畢,這就是基本的vuex的開發模式。接下來,我不會過多介紹vuex的用法,而是介紹如何基於typescript,用class的方式來使用vue和vuex進行項目開發,相信使用過react的朋友們對class的寫法不會陌生,那就讓我們開始吧!

為了省去一些配置上的麻煩,我們直接採用vue-cli3來搭建項目。在創建項目的時候選中typescript即可。

創建完項目之後,我們對項目結構進行調整,使其更易於維護和管理,如下:

接下來開始我們的代碼編寫,首先關注store目錄,這是我們管理項目狀態的地方,我們將state改寫成typescript的方式:

export interface State {

name: string;

total: number;

isLogin: boolean;

postList: object[];

}

export const state: State = {

name: '',

total: 0,

isLogin: false,

postList: [],

};

複製代碼

如果對typescript不熟悉的同學,可以移步到typescript官網去了解基本用法。

action文件和之前沒有太大變化,只是增加了類型定義和參數:

export default {

asyncAdd(context: any, paylod: any) {

setTimeout(() => {

context.commit('add', paylod.num);

}, 1000);

},

};

複製代碼

下面是mutaction文件:

import { State } from './state';

export default {

add(state: State, payload: any) {

payload ? (state.total += payload) : state.total++;

},

};

複製代碼

說到這裡,有必要簡單講解一下action和mutaction的區別:Action 類似於 mutation,不同在於:

Action 提交的是 mutation,而不是直接變更狀態。Action 可以包含任意異步操作。說簡單點就是mutation用於同步執行,action用於異步執行,可以多重分發mutation。 完成了這些,vuex的工作大致告於段落,接下來我們關注的重點就是頁面組件和如何在組件中使用vuex。

// home.vue

<template>

<div>

<img alt="Vue logo" src="../assets/logo.png">

<HelloWorld :msg="name" />

<div @click="onclick">{{name}}</div>

<div @click="add">同步增加總數:{{total}}</div>

<div @click="addAsync(1)">異步增加總數:{{total}}</div>

</div>

</template>

<script lang="ts">

import { Component, Vue } from 'vue-property-decorator';

import { mapMutations } from 'vuex';

import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src

@Component({

components: {

HelloWorld,

},

})

export default class Home extends Vue {

public name: string = 'xujiang';

public onclick(): void {

this.name = 'hello world';

}

public add() {

this.$store.commit('add');

}

public addAsync(num: any) {

this.$store.dispatch('asyncAdd', {num});

}

get total(): void {

return this.$store.state.total;

}

}

</script>

複製代碼

相信用過react的朋友對這種寫法並不陌生,其實vue完全可以將模版寫法改寫成jsx的方式,就好比寫react的jsx文件一樣,後面我會推出一篇文章,專門介紹如何使用jsx+class的方式開發vue組件。vue-cli3已經為我們安裝了是支持class和裝飾器的模塊vue-property-decorator,當然想自己配置的朋友也可以通過webpack自己配置,無限可能,我也會在後面推出關於webpack的文章,教大家如何玩轉webpack4.0。

使用class方式創建組件和傳統的方式有點區別:1.一般我們定義data作為數據源,在class中我們可以直接定義屬性,即可作為初始數據;2.vue實例方法一般定義在methods中,用類組件時,可以直接使用組件方法。最後,我們可以用vuex提供的commit和dispatch來觸發我們狀態的變化,至此,一個class版的vue組件就寫好啦,如有不懂的地方或者文章沒有考慮到的地方,歡迎隨時指出。

相關焦點

  • Vue2.5+ Typescript 引入全面指南
    :官方維護,學習成本小,但與vuex融合性較差,計劃等官方完2.善對vuex支持後再考慮引入3. vue-property-decorator:非官方維護,一定學習成本4. vuex-class:非官方維護,在 vue-class-component 基礎上補充一定vuex支持(支持有限)5. vuex-ts-decorators/vuex-typescript等:非官方維護,學習成本極高PS: 後總結,vue
  • Vue面試題(3)Vue-Router和Vuex
    _committing = committing}3、為啥要有vuex,使用localStorage本地存儲不行麼?Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式,Vuex 的狀態存儲是響應式的。當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的組件也會相應地得到高效更新。
  • 你知道vue項目怎麼使用TypeScript嗎?
    下面我將展示如何使用Vue CLI 構建一個Vue + TypeScript應用TypeScript為什麼要將TypeScript 和 Vue 集成呢?下面我們就來一起從構建一個vue+ts的項目開始初始化項目初始化vue-cli項目,安裝typescript,ts-loader,tslint,tslint-loader,tslint-config-standard,vue-property-decorator.上面只有typescript,ts-loader
  • 實戰教學使用 Vue3 重構 Vue2 項目(萬字好文推薦)
    本文來自於 神奇的程式設計師 的分享好文,點擊閱讀原文查看作者的掘金鍊接。
  • Vue 3.0前的 TypeScript 最佳入門實踐
    它和 extends有什麼不同?implement,實現。與C#或Java裡接口的基本作用一樣, TypeScript也能夠用它來明確的強制一個類去符合某種契約implement基本用法:interfaceIDeveloper{ name: string; age?
  • 深入理解 Vue 模板渲染:Vue 模板反編譯
    事實上編譯工具也確實會把 vue 單文件模板編譯成這種形式,style 會單獨提取出來,綁定作用域作為標識,而 script 部分除了加入了 render 和 staticRenderFns 以外,基本不變。
  • Vue進階 day01
    DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script><
  • Vue全家桶&vue-router原理
    原理 Vue全家桶:vue + vue-router(路由)+ vuex(狀態管理)+ axios(請求)本次主要分析並實現簡版vue-router,從源碼中學習借鑑,更好的理解源碼vue-routerVue Router 是 Vue.js 官⽅的路由管理器。
  • 如何用 Vue + Vuetify 快速建站?
    http://blog.zhuangweiming.me/ )幾個月前用 Vue + Vuetify 這一套框架寫了個 倉庫管理系統 和 個人網站,近來不寫前端了,所以整理了如何用 Vue,Vuetify,Vuex,Vue-router 寫一個單頁應用 (SPA),為以後回憶方便,也供初學者參考,少踩坑。
  • Springboot Vue Login(從零開始實現Springboot+Vue登錄)
    進入到創建的 Vue 項目目錄,添加依賴框架:cd vue-spring-login-summed (進入到項目根目錄)vue add element (添加 element,一個 element 風格的 UI 框架)npm install axios (安裝 axios,用於網絡請求)npm install vuex --save(安裝 Vuex,用於管理狀態)
  • 史上最全:Vue 相關開源項目庫匯總
    - vue.js中文社區vue-music163 ★47 - 音樂VueJS項目Vue2-MV ★45 - 仿網易雲音樂MV的webappmusiccloudWebapp ★44 - 用vuejs仿網易雲音樂cnode-vue ★40 - 基於vue和vue-router構建的cnodejs web網站SPAFramework7
  • Vue.js 框架作者公布 Vue 3 最新進展
    尤雨溪表示,由於在 Vue 3 上花費的大部分時間都投入到了設計和構建穩定的內核上,不過要讓整個框架處於 "ready" 狀態,不僅僅是內核的問題,還需要有兼容版本的支持庫 (Vue Router, Vuex, test
  • 【vue2.0進階】用axios來實現數據請求,簡單易用
    寫了幾期的黑話《網際網路公司黑話大全》,有個同學問vue2.0的進階篇算更新完了嗎?
  • 最全Vue2.0學習路線,各個階段適用
    這些都是新手很難理解的知識點,所以今天發個乾貨,希望幫助到有心的讀者和粉絲,也算好事一件。下面建議學習順序,從 新手起步,到實戰開發,到進階核心都有介紹,結合了自己查的資料和經驗和vue作者尤大的一些建議匯總而成,覺得好請轉發、收藏。
  • 什麼是vue?在項目開發中為什麼要用vue?
    在近兩年的web及項目開發中,vue技術的使用越來越普遍,其各種資料、介紹以及使用攻略內容資料非常多,那麼vue到底什麼?在項目開發中,vue起到什麼作用?它與傳統的html+css+js+lamp開發網站項目又有什麼區別呢?
  • vue題
    1.什麼是vue生命周期?答:Vue 實例從創建到銷毀的過程,就是生命周期。從開始創建、初始化數據、編譯模板、掛載Dom→渲染、更新→渲染、銷毀等一系列過程,稱之為 Vue 的生命周期。2.vue生命周期的作用是什麼?答:它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。3.vue生命周期總共有幾個階段?
  • 高級前端進階,vue如何實現$nextTick
    本文要弄明白下面兩件事:$nextTick什麼時候執行vue中nextTick與$nextTick區別1.查看源碼中的$nextTick方法Vue.prototype.it is still a better choice than setTimeout.timerFunc = function() {setImmediate(flushCallbacks);};} else {// Fallback to setTimeout.timerFunc = function() {setTimeout(flushCallbacks, 0);};}經過一系列的判斷方法
  • 揭密vue.js的神秘之處,小程序跟vue有什麼關係
    微容用的微信小程序平臺採用開發思路是前後端分離,前端採用vue.js+h5+jq開發,後端採用MVE的思路,用php開發,用vue.js構建來微信小程序可視化前端之後,微容給大家介紹下vue的來源和特徵。
  • 前端技術:開發一個vue中央事件總線插件vue-bus
    大家都知道,一個中央事件總線bus,可以作為一個簡單的組件傳遞數據,用於解決跨級和兄弟組件通信問題,那麼,這篇文字,我將使用這種思想,將bus封裝為一個Vue的插件,可以在所有的組件間任意使用,而不需要導入bus。
  • Vue入門10 vue+elementUI
    npm i element-ui -SCDN目前可以通過unpkg.com/element-ui獲取到最新版本的資源,在頁面上會js和css文件即可開始使用。<!注意:命令行都要使用管理員模式運行1、創建一個名為hello-vue的工程vue init webpack hello-vue