vuex知識點

Vuex?是一個專為?Vue.js?應用程序開發的狀態管理模式;集中存儲管理應用的所有組件狀態

  • 狀態:什么是狀態,我們可以通俗的理解為數據。Vue只關心視圖層,那么視圖的狀態如何來確定?我們知道是通過數據驅動,這里的狀態管理可以簡單理解為管理數據。

  • 集中存儲Vue只關心視圖,那么我們需要一個倉庫(Store)來存儲數據,而且是所有的數據集中存儲,視圖和數據就可以分析。

  • 管理:除了存儲,還可以管理數據,也就是計算、處理數據。

  • 所有組件狀態:所用的組件共用一個倉庫Store),也就是一個項目只有一個數據源(區分模塊modules)。

  • 總結Vuex就是在一個項目中,提供唯一的管理數據源的倉庫

Vuex將組件公用數據抽離,在一個公共倉庫管理,使得各個組件容易獲取(getter)數據,也容易設置數據(setter

Store
Store倉庫里面放了很多對象。其中state就是數據源存放地,對應于與一般Vue對象里面的data(后面講到的actionsmutations對應于methods)。
  • 在使用Vuex的時候通常會創建Store實例new Vuex.store({state,getters,mutations,actions})有很多子模塊的時候還會使用到modules

  • 總結,Store類就是存儲數據和管理數據方法的倉庫,實現方式是將數據和方法以對象形式傳入其實例中。要注意一個應用或是項目中只能存在一個Store實例!!

state
響應式存儲state里面存放的數據是響應式的,Vue組件從store中讀取數據,若是store中的數據發生改變,依賴這個數據的組件也會發生更新。(這里“狀態”=“數據”),也就是是說數據和視圖是同步的
  • 獲取:在Vue組件中獲取數據,最直接的可以通過計算屬性中獲取

  • 組件仍然可以保存局部狀態:雖然說VuexStore倉庫讓我們同一管理數據變得更加方便,但是代碼一多也會變得冗長,有些組件的數據是自己嚴格自用,我們可以將state放在組件自身,作為局部數據,專供此組件使用,其他的組件不能用。

  • mapState的作用是把全局的?state?和?getters?映射到當前組件的?computed?計算屬性中,this.$store.state

  • 使用示例

 import {mapState} from 'vuex' export default {computer :mapState({count: state => state.count,'count' // 映射 this.count 為 store.state.count})
}

getters
Store倉庫里,state就是用來存放數據,若是對數據進行處理輸出,比如數據要過濾,一般我們可以寫到computed中。但是如果很多組件都
使用這個過濾后的數據,比如餅狀圖組件和曲線圖組件,我們是否可以把這個數據抽提出來共享?這就是getters存在的意義。
我們可以認為,【getters】是store的計算屬性。
  • 定義:我們可以在store中定義getters,第一個參數是state

    const getters = {style:state?=>?state.style}
  • 傳參:定義的Getters會暴露為store.getters對象,也可以接受其他的getters作為第二個參數;

  • 使用:

    computed: {
    doneTodosCount () {return this.$store.getters.doneTodosCount}

mapGetters輔助函數僅僅是將store中的getters映射到局部計算屬性中,用法和mapState類似


import?{ mapGetters }?from?'vuex'
computed: {// 使用對象展開運算符將 getters 混入 computed 對象中...mapGetters(['doneTodosCount','anotherGetter',])}//給getter屬性換名字mapGetters({// 映射 this.doneCount 為 store.getters.doneTodosCountdoneCount: 'doneTodosCount'
})

Mutations

  • getters是為了初步獲取和簡單處理state里面的數據(這里的簡單處理不能改變?state里面的數據),Vue的視圖是由數據驅動的,也就是說state里面的數據是動態變化的,那么怎么改變呢,切記在Vuexstore數據改變的唯一方法就是mutation

  • 通俗的理解mutations,里面裝著一些改變數據方法的集合,這是Veux設計很重要的一點,就是把處理數據邏輯方法全部放在mutations里面,使得數據和視圖分離。

使用方法如下
  • mutation結構:每一個mutation都有一個字符串類型事件類型(type)和回調函數(handler),也可以理解為{type:handler()},這和訂閱發布有點類似。先注冊事件,當觸發響應類型的時候調用handker(),調用type的時候需要用到store.commit方法。

     const store = new Vuex.Store({state: {count: 1},mutations: {increment (state) {      //注冊事件,type:increment,handler第一個參數是state;// 變更狀態state.count++}}})store.commit('increment')   //調用type,觸發handler(state
  • 載荷(payload):簡單的理解就是往handler(stage)中傳參handler(stage,pryload);一般是個對象。

      mutations: {increment (state, n) {state.count += n}}store.commit('increment', 10)
  • mutation-types:將常量放在單獨的文件中,方便協作開發。

        // mutation-types.jsexport const SOME_MUTATION = 'SOME_MUTATION'// store.js
    import Vuex from 'vuex'
    import { SOME_MUTATION } from './mutation-types'const store = new Vuex.Store({state: { ... },mutations: {// 我們可以使用 ES2015 風格的計算屬性命名功能來使用一個常量作為函數名[SOME_MUTATION] (state) {// mutate state}
    }
    })
  • commit:提交可以在組件中使用?this.$store.commit('xxx')?提交?mutation,或者使用?mapMutations?輔助函數將組件中的?methods?映射為?store.commit?調用(需要在根節點注入?store)。

    import { mapMutations } from 'vuex'export default {methods: {...mapMutations(['increment' // 映射 this.increment() 為 
    this.$store.commit('increment')]),...mapMutations({add: 'increment' // 映射 this.add() 為 
    this.$store.commit('increment')})}}

Actions

  • 背景:mutation中我們講到,mutation中是存放處理數據的方法的集合,我們使用的時候需要commit。但是commit是同步函數,而且只能是同步執行。那我們想一步操作怎么辦?

  • 作用:actions中提交mutation,并且可以包含任何的異步操作。actions可以理解為通過將mutations里面處里數據的方法變成可異步的處理數據的方法,簡單的說就是異步操作數據(但是還是通過mutation來操作,因為只有它能操作)

怎么用actions:
  • 定義actions

    const store = new Vuex.Store({//創建store實例state: {count: 0},mutations: {                increment (state) {state.count++}},actions: {         //只是提交`commit`了`mutations`里面的方法。increment (context) {context.commit('increment')}}})一般我們會簡寫成這樣actions: {increment ({ commit }) {commit('increment')}}
  • 分發actions

    store.dispatch('increment')
  • MapActions和MapState一級MapMutations類似。

Modules

  • 背景:VueState使用是單一狀態樹結構,應該的所有的狀態都放在state里面,如果項目比較復雜,那state是一個很大的對象,store對象也將對變得非常大,難于管理。

  • module可以讓每一個模塊擁有自己的statemutationactiongetters,使得結構非常清晰,方便管理。

  • 一般結構

    const moduleA = {
      state: { ... },
      mutations: { ... },
      actions: { ... },
      getters: { ... }}
    const moduleB = {
      state: { ... },
      mutations: { ... },
      actions: { ... }}const store = new Vuex.Store({
      modules: {
        a: moduleA,
        b: moduleB})
  • 模塊內部的數據:①內部state,模塊內部的state是局部的,也就是模塊私有的,比如是car.js模塊state中的list數據,我們要通過this.$store.state.car.list獲取;②內部gettermutationaction,仍然注冊在全局命名空間內,這是為了多模塊可以同時響應同一mutationthis.$store.state.car.carGetter的結果是undefined,而通過this.$store.state.carGetter則可以拿到。

  • 傳參:getters====({state(局部狀態),getters(全局getters對象),roosState(根狀態)});actions====({state(局部狀態),commit,roosState(根狀態)}).



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247660.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247660.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka2.0生產者客戶端使用

1 初始化配置 Kafka 通過 KafkaProducer 構造器初始化生產者客戶端的配置。 ??常用的重要配置,詳見官網。 bootstrap.servers:Kafka 集群地址(host1:post,host2:post),Kafka 客戶端初始化時會自動發現地址&#xff0…

vuex小例

少廢話,先出東西 vuex main.js import Vue from vue import App from ./App import router from ./router import store from ./store Vue.config.productionTip falsenew Vue({el: #app,router,store,render: xx>xx(App) })store.js 平級目錄未建文件夾import…

[論文筆記]CVPR2017_Joint Detection and Identification Feature Learning for Person Search

Title: Joint Detection and Identification Feature Learning for Person Search; aXiv上該論文的第一個版本題目是 End-to-End Deep Learning for Person SearchAuthors: Tong Xiao1* ; Shuang Li1* ; Bochao Wang2 ; Liang Lin2; Xiaogang Wang1 Affilations: 1.The Chines…

php下的原生ajax請求

瀏覽器中為我們提供了一個JS對象XMLHttpRequet,它可以幫助我們發送HTTP請求,并接受服務端的響應。 意味著我們的瀏覽器不提交,通過JS就可以請求服務器。ajax(Asynchronous Javascript And XML)其實就是通過XHR對象,執行HTTP請求。…

HBase性能優化總結

HBase性能優化方法總結(一):表的設計 1. 表的設計 1.1 Pre-Creating Regions 默認情況下,在創建HBase表的時候會自動創建一個region分區,當導入數據的時候,所有的HBase客戶端都向這一個region寫數據&#x…

.NetCore如何使用ImageSharp進行圖片的生成

ImageSharp是對NetCore平臺擴展的一個圖像處理方案,以往網上的案例多以生成文字及畫出簡單圖形、驗證碼等方式進行探討和實踐。 今天我分享一下所在公司項目的實際應用案例,導出微信二維碼圖片,圓形頭像等等。 一、源碼獲取 Git項目地址&…

vue2工程

vue當然可以使用script標簽引入,不需任何依賴即可按照vue的語法進行使用。但中大型商用項目中,還是建議使用工程化方式使用vue,vue提供了官方腳手架vue-cli,可以快速構建vue項目,腳手架會幫助開發者創建好建議的工程目…

flutte的第一個hello world程序

用命令行創建項目: flutter create flutterdemo VSCode或者AS連接手機后 輸入 flutter run 編譯后就可以將默認的代碼顯示在手機上了 開始寫hello world 代碼,這段代碼寫在根目錄\lib\main.dart文件中,也是Flutter主文件。 整個代碼如下 impo…

Ajax 設置Access-Control-Allow-Origin實現跨域訪問

之前遇到的問題整理 ajax跨域訪問是一個老問題了,解決方法很多,比較常用的是JSONP方法,JSONP方法是一種非官方方法,而且這種方法只支持GET方式,不如POST方式安全。 即使使用jquery的jsonp方法,type設為POST…

vue工程webpack模板配置說明

vue工程webpack模板下的配置文件非常多,只能在實際開發過程中反復熟悉,才能漸漸體會官方將配置文件拆分細化的合理性。 主要配置文件中代碼的作用從網上摘錄了比較全的一份注釋,做下記錄。 dev-server.js 開發服務端配置 require(./check-v…

目錄的拼接

找到被拼接文件所在的目錄,然后進行拼接 import os 獲取當前目錄: os.path.dirname(__file__) 如下,被拼接文件所在目錄與當前目錄的上級目錄在同一文件夾下: os.path.join(os.path.dirname(os.path.dirname(__file__)),‘文件夾路…

vue-resource 攔截器(interceptor)的使用

攔截器-interceptor 在現代的一些前端框架上,攔截器基本上是很基礎但很重要的一環,比如Angular原生就支持攔截器配置,VUE的Axios模塊也給我們提供了攔截器配置,那么攔截器到底是什么,它有什么用?攔截器能幫…

【GamePlay】入門篇

【GamePlay】入門篇 游戲性編程是指通過一系列游戲系統將游戲想法變成現實的過程。 本次的簡例以NPC設計為主。 通常在進行腳本設計前,對NPC的屬性進行基本的添加和設定,諸如動畫系統、物理系統等等。 1.動畫系統 添加Animator組件,綁定骨骼。…

vue axios POST請求中參數以form data和request payload形式的原因

HTTP請求中,如果是get請求,那么表單參數以namevalue&name1value1的形式附到url的后面,如果是post請求,那么表單參數是在請求體中,也是以namevalue&name1value1的形式在請求體中。通過chrome的開發者工具可以看…

vue-resource使用

vue-resource是一個http請求插件,遵循promise,類似jquery中ajax操作。 vue-resource已不被官方推薦,官方推薦axios插件來操作http協議。 vue-resource中提供的方法 get(url, [options]) head(url, [options]) delete(url, [options]) jso…

HttpHttps

http協議與https Http 客戶端發送一個HTTP請求到服務器的請求消息包括以下格式: **請求行(request line)、請求頭部(header)、空行 和請求數據四個部分組成。** Get請求例子,使用Charles抓取的request&…

vue2使用axios post跳坑,封裝成模塊

終于將vue-resource替換成axios了,其中像application/x-www-form-urlencoded發送的頭信息以及返回的response結果這兩點都需要注意一下。 其實https://github.com/mzabriskie/axios也有說明的。因為我在vue-resource中使用了Vue.http.options.emulateJSON true;&am…

axios使用

axios和vue-resource一樣,是一個vue中操作http的插件,遵循promise,vue官方也推薦使用axios。 安裝axios npm i axios -S axios也是在運行時需要的,所以要保存在dependencies中。 引入axios import axios from axios Vue.proto…

jQuery length 和 size()區別

jQuery length和size()區別總結如下: 1.length是屬性,size()是方法。 2.如果你只是想獲取元素的個數,兩者效果一樣既 $("img").length 和 $("img").size() 獲取的值是一樣的;但是如果是獲取字符串的長…

一些關于自己的未來的東西

2019.7.4 自己大一建立對編程的基礎認識,確實培養了一些興趣,入了個門,不過沒有接觸到本質。大二加入到了學校的網站開發團隊,對網站開發后端進行了學習,對后臺開發也有了基礎的學習吧,哈哈可能以后就是要走…