vuex 第一節

vuex 是什麼?

Vuex 是一個專爲 Vue.js 應用程序開發的 狀態管理模式,類似 redux
vuex是一個專門爲vue.js設計的集中式狀態管理架構。狀態?我把它理解爲在data中的屬性需要共享給其他vue組件使用的部分,就叫做狀態。簡單的說就是data中需要共用的屬性。
當項目數據量達到一定程度的時候去使用。 vueX存儲數據是存儲在內存當中的
這種狀態管理模式包含:

  • State : 狀態數據源
  • View : 使用狀態數據源的視圖
  • Actions : 修改更新數據源的操作

這種模式遵循的是 單向數據流 模式
在這裏插入圖片描述

4、vuex 的工作流

在這裏插入圖片描述

  • State : 存儲應用狀態數據(React 中的 State)
  • Vue Component : 消費 State
  • Actions : 提交修改 State 的動作(包括異步行爲)(React 中的 action)
  • Mutations : 唯一更改 State 的位置(React 中的 Reducer)

安裝 vuex

npm i vuex
// or
yarn add vuex

6、引入 vuex

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

Vue.use(Vuex)

Store

**Store ** 就是倉庫,存儲數據,我們前面提到的 state 就存儲在 store 中,同時提交動作、修改狀態的方法也都由 store 提供和管理
Store中的數據也是會被追蹤的當數據發生改變會自動渲染頁面

創建一個 Store

必須在 Vue.use(Vuex) 之後創建 store

Vue.use(Vuex)
let store = new Vuex.Store({
    state: {},
    getters: {},
    mutations: {},
    actions: {}
})

存儲應用狀態數據的對象,state 的值可以是一個對象,也可以是一個返回對象的函數,類似 vue 中組件的 data ,使用函數的方式返回對象可以避免對象引用導致的副作用問題

在組件中使用 store

export default new Vuex.Store({//創建倉庫並使用導出 可以有多個
  state: { //存儲數據  vueX中存儲的數據也是會被追蹤的當數據發生改變會自動渲染頁面    
    tiele:'華山論劍',
    content:"good",
  },
  mutations: {
  },
  // 異步的處理在actions裏面處理,然後通過commmit提交給
  actions: {
  },
  modules: {
  },
})

方法1、在組件中使用數據

<template>
  <div class="about">
    <h1>
      {{t}}
    </h1>
    <div>
      {{c}}
    </div>
  </div>
</template>
    computed: { 
    t(){
      return this.$store.state.content
    },
    c(){
      return this.$store.state.tiele
    }

方法2 .數組的方式, 如果數據沒有需要處理的可這麼寫 引入mapState
當一個組件需要獲取多個狀態時候,將這些狀態都聲明爲計算屬性會有些重複和冗餘。爲了解決這個問題,我們可以使用 mapState 輔助函數幫助我們生成計算屬性,讓你少按幾次鍵,通常我們把 storestate 通過 mapState 函數映射到組件的 computed

<template>
  <div class="about">
    <h1>
      {{tiele}}
    </h1>
    <div>
      {{content}}
    </div>
  </div>
</template>
<script>
import {mapState} from 'vuex'
export default {
 
  name :'About',
  data() {
    return {
      val:1
    }
  },
  computed: mapState(['tiele','content']),
}
</script>

3.對象的方式

<script>
import {mapState} from 'vuex'
export default {
  
  name :'About',
  data() {
    return {
      val:1
    }
  },
  computed: {
    result(){ 
      return this.val*10
    },
    ...mapState({ //擴展運算
      tiele:"tiele",
      con:({content})=>{return content.toUpperCase()} //處理的是從state中拿出來的sh
    })
  },

}
</script>

getters

有時候我們需要從 store 中的 state 中派生(計算)出一些狀態,類似組件的 datacomputedstore 也提供了一個 getters 對象來處理派生數據
多個組價有共同的需求時我們可以在store/index.js文件中使擁getters方法,在出庫之前處理,然後派出使用

getters 函數

與組件屬性一樣,我們是通過定義一個函數的形式來返回派生數據的,getters 函數接受兩個參數

  • 第一個參數:state 對象
  • 第二個參數:getters 對象

案例

點擊按鈕男/女進行篩選
總體思路:showUsers 通過返回的內容判斷自身是什麼類型 我們要傳數據的話需要返回一個函數
函數體裏方法按需 Home頁面裏showUsers就是一個函數了,我們就爲其傳參

import Vue from 'vue'
import Vuex from 'vuex'
// import {mapState,mapMutations} from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({//創建倉庫並使用導出 可以有多個
  state: { //存儲數據  vueX中存儲的數據也是會被追蹤的當數據發生改變會自動渲染頁面
    userGender:'', //這裏存儲篩選條件,在頁面中,改變這裏的數據 從而影響發送至頁面的數據
    users :[
      {id: 1, username: '小王', gender: '男',checked:false},
      {id: 2, username: '小李', gender: '男',checked:false},
      {id: 3, username: '小張', gender: '男',checked:false},
      {id: 4, username: '小黃', gender: '男',checked:false},
      {id: 5, username: '小花', gender: '女',checked:false},
      {id: 6, username: '小芳', gender: '女',checked:false}
      ]
  },
  getters:{
    // showUsers({users,userGender}){//參數對象state中自動傳過來的  1原數據 2怎麼篩選 
    //   return ''===userGender ? users : users.filter(user=>user.gender==userGender)
    //   //      如果userGender爲空 返所有   否則過濾     user數據的性別 等於userGender的值      
    // },//上面這種方法頁面無法傳遞數據,只能通過代碼更改達到過濾
    showUsers({users,userGender}){
      return (userGender ='')=>{
        return ''===userGender ? users : users.filter(user=>user.gender==userGender) 
      }
    },
    // showSort:()=>{ return 123}  等同於 showSort :123
    // showSort:()=>{ return ()->{} } 返回一個函數
  },
  /*
  1:   users :   數組中的數據源渲染到頁面
  2.:  getters:   在數據源出門之後,進行派生,派生依賴於一個參數
  3.: 頁面控制  派生依賴的參數*/ 
})

Home組件

<template>
  <div class="home">
    <ul>
      <button @click="sex='男'" :class="{'active':sex=='男'}"></button>
      <button @click="sex='女'" :class="{'active':sex=='女'}"></button>
      <li v-for="(user,index) in users" :key="index">
        {{user.username}}
      </li>  
    </ul>   
  </div>
</template>

<script>
export default {
  name: 'Home',
  data() {
    return {
      sex:'',//默認爲空
    }
  },
  components: {
    HelloWorld
  },   
  computed: { 
    users(){
      // return this.$store.state.users; //顯示原始數據
      return this.$store.getters.showUsers(this.sex); //函數(傳遞的參數)
    },
  },
}
</script>
<style scoped>
  ul{
    list-style: none;
  }
  .active{
    background:blueviolet;
    color:white;
  }
</style>
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章