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

2021-01-21 酷扯兒

本文轉載自【微信公眾號:趣談前端,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組件就寫好啦,如有不懂的地方或者文章沒有考慮到的地方,歡迎隨時指出。

相關焦點

  • Vue+Axios+Vuex+Vux+Vue-Router全家桶搭建前端框架
    ;使用她能讓我們無需過多的分神去處理數據怎麼展示同步,讓我們專注於核心業務層;她的響應式足以讓我們爽飄飄~~a、現在我們看看如何快速搭建前端框架;首先我們實在node環境下開發,藉助webpack打包工具,安裝vue-cli;npm install -g vue-clib、安裝完成之後我們就能使用vue命令了;由於我們使用Vux2所以我們創建項目就是這樣
  • Vue全家桶之什麼是Vuex
    Vuex 是什麼?Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 是幹什麼的?試想一下,如果在一個項目開發中頻繁的使用組件傳參的方式來同步data中的值,一旦項目變得很龐大,管理和維護這些值將是相當棘手的工作。
  • 5分鐘帶你入門vuex(vue狀態管理)
    如果你之前使用過vue.js,你一定知道在vue中各個組件之間傳值的痛苦,在vue中我們可以使用vuex來保存我們需要管理的狀態值,值一旦被修改,所有引用該值的地方就會自動更新,那麼接下來我們就來學習一下vuex是如何修改狀態值的:我們新建一個vue項目(這裡由於我們是講解vuex,所以對於vue項目的創建我們不會講解太詳細);在命令行輸入 vue init
  • vue3.0手機聊天室|Vue3+Vant3仿微信界面
    項目簡介Vue3Chat是基於vue3.x+vuex4+vue-router4全家桶技術和vant3.x構建開發的一款mobile仿微信界面聊天實例。實現了發送圖文消息、圖片|視頻預覽、位置查看、紅包|朋友圈等功能。
  • 什麼是VUE?VUE與JS的對比
    我們需要一個UI元素和屬性相互綁定的方法 2. 我們需要監視屬性和UI元素的變化 3.我們需要讓所有綁定的對象和元素都能感知到變化1.1.1. vue與js的對比1.1.1.1. js的實現(了解)<!
  • Vue 3 的最新進展
    尤雨溪表示,由於在 Vue 3 上花費的大部分時間都投入到了設計和構建穩定的內核上,不過要讓整個框架處於"ready"狀態,不僅僅是內核的問題,還需要有兼容版本的支持庫 (Vue Router, Vuex, test utils)、工具(CLI、eslint 插件、瀏覽器開發工具擴展、IDE 擴展)和文檔(包括針對新用戶和用於遷移的文檔)。
  • vue-mapvgl v0.0.10 發布,基於 Vue 2.0 和百度地圖的地圖組件
    vue-mapvgl v0.0.10 已經發布,此版本更新內容包括:vue-mapvgl是一套基於Vue 2.0和百度地圖mapvgl的地圖組件。
  • 在vue項目中使用vuex實現狀態管理的案例
    並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。vuex個屬性五個屬性的作用:state:用來存儲vuex的基本數據。
  • vue-element-admin 4.0.0 正式版發布
    重大改變 基於 vue-cli@3進行構建 調整了項目的目錄結構 mock 文件移至根目錄下 layout 從 views 文件夾下移至 src 下 使用了最新的 eslint-plugin-vue
  • Vuex你從沒使用過的優化方案!
    以下是顯式創建的靜態模塊的示例:上面的代碼將創建一個帶有靜態模塊userAccountModule的新Vuex Store。靜態模塊不能取消註冊,並且在Store初始化後不能更改它們的結構。雖然這種方法對應大多數情況沒有問題,並且在一個地方聲明,那麼所有與數據相關的東西都可以保存在一個地方。但這種方法存在一些缺點。
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    M和V指的意思和MVVM中的M和V意思一樣。C即Controller指的是頁面業務邏輯。使用MVC的目的就是將M和V的代碼分離。『MVC是單向通信。在過去的10年中,我們已經把很多傳統的服務端代碼放到了瀏覽器中,這樣就產生了成千上萬行的javascript代碼,它們連接了各式各樣的HTML 和CSS文件,但缺乏正規的組織形式,這也就是為什麼越來越多的開發者使用javascript框架。比如:angular、react、vue。
  • 供我們選擇的 Vue 組件庫還有很多!
    ElementUI作者:餓了麼團隊(現已被阿里收購)Github star:46.8k+ 屬性:PC 端組件庫簡介:內涵 55+ 個網頁開發常用組件,並且組件庫結合了 vue-cli 出了相應的插件 Element 插件,你可以用它們快速地搭建一個基於 Element 的項目。引入方式也支持了按需引入,以達到減小項目體積的目的。
  • slot vue 具名專題及常見問題 - CSDN
    vue的slot1、什麼是slotslot是插槽,插即是可以插入,槽就是坑,即是可以再代碼中插入如果子組件模板中不包含插口,那麼父組件的內容將會被丟棄。當子組件模板中有一個麼有屬性的插槽時,父組件傳入的整個內容片段,將插入到插槽所在的dom的位置,並替換掉插槽標籤本身。
  • 推薦一些 GitHub 上值得前端學習的開源實戰項目,進階必看!
    Vue.js1. vue-element-adminvue-element-admin 是一個後臺前端解決方案,它基於 vue 和 element-ui 實現。它使用了最新的前端技術棧,內置了 i18n 國際化解決方案,動態路由,權限驗證,提煉了典型的業務模型,提供了豐富的功能組件,它可以幫助你快速搭建企業級中後臺產品原型。
  • 如何寫一個vue組件專題及常見問題 - CSDN
    如何使用vue寫一個組件庫新建vue項目使用vue-cli初始化一個項目:vue init webpack VueComponentcd VueComponentnpm installnpm run dev以上就新建好了一個vue項目項目目錄首先,定義好目錄,經過觀察大多數的組件庫,基本是這樣的目錄
  • template標籤 vue 作用專題及常見問題 - CSDN
    template slot="footer"> <p>底部信息信息1</p> <p>底部信息信息2</p> </template> </base-layout> </div> <script type="text/javascript" src="js/vue.js
  • 如何在vue項目中使用sass並設置元素樣式
    那麼,如何在vue項目中使用sass?新建項目,選擇vue模板2、在項目中src/components文件夾下,新建vue文件,輸入文件名稱,點擊創建導入Element模塊以及樣式文件5、在已新建的vue文件,利用Element進行頁面布局,插入一個輸入框和一個按鈕,綁定按鈕點擊事件
  • a標籤 href vue專題及常見問題 - CSDN
    此處的將a的標籤href實現綁定:href同時對路徑進一步轉化拼接以上這篇vue.js 實現a標籤href裡添加參數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。時間: 2019-11-10公司要做一個類似今日頭條的項目,用前後端分離的方式做成HTML5頁面,先在微信中運行,領導說想看看效果怎麼樣.今日頭條頭部的導航是可以滾動和添加類別的,我們這個項目也是一樣.所以在導航這個地方就需要在點擊不同分類的同時,樣式也是跟著變的,我在網上搜索了一下,發現了下面的代碼,簡潔清淅,不過具體網址忘記了
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • vue 具名插槽詳解專題及常見問題 - CSDN
    插槽含義:就是引入子組件後,在插入子組件元素中添加信息或者標籤,使得子組件的指定位置插入信息或者標籤插槽有三種:默認插槽、具名插槽、作用域插槽,由於vue2.6.0後對插槽進行修改,但是兼容2.6.0前的版本,博文中只說明2.6.0後的插槽,vue3.0後面會去除2.60前的版本兼容  一、默認插槽<