前端【Vuex】【使用介紹】

为你编程發表於2024-04-08

1、元件下載

  vue 與vuex的版本對應關係:
     Vue 2 匹配的 Vuex 3
     Vue 3 匹配的 Vuex 4
  Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式 + 庫。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  官方網站:https://vuex.vuejs.org/zh/
1 // npm
2 npm install vuex@next --save
3 
4 // yarn 
5 yarn add vuex@next --save

2、專案中定義及配置

  在src目錄下新增store目錄,建立index.js檔案,內容如下

 1 // 1. 匯入所需的包
 2 import Vue from 'vue'
 3 import Vuex from 'vuex'
 4 // 2. 將Vuex註冊為Vue的外掛
 5 Vue.use(Vuex)
 6 // 3. 建立 store 例項物件
 7 const store = new Vuex.Store({
 8   // 配置vuex
 9   strict: true, // 開啟嚴格模式,防止小白在元件中使用的時候直接修改state資料
10   // state 用於儲存資料(儲存狀態) (vuex狀態管理)
11   state: {
12     sex: 23,
13     uname: 'badWoman',
14     list: [
15       { id: 1, name: '吃飯', isDone: true },
16       { id: 2, name: '睡覺', isDone: false },
17       { id: 3, name: '聽歌', isDone: true }
18     ]
19   },
20   // mutations 是 vuex 中"唯一"可以修改 state 資料的方法, 不支援非同步更新,只能放同步程式碼
21   mutations: {
22     abc (state, n) {
23       state.sex = n
24     }
25   },
26   // actions 裡面放非同步方法
27   actions: {
28     newSex (store, n) {
29       setTimeout(() => {
30         store.commit('abc', n) // 只要是修改state中內容, 都透過mutations中的方法進行操作
31       }, 3000)
32     }
33   },
34   // getters 是vuex中的計算屬性(和元件中的計算屬性意義一樣,但是不支援set修改)
35   // 為了方便獲取state中的資料;外掛作者會給每個計算屬性方法,傳遞一個 state 引數
36   getters: {
37     ccc (state) {
38       return state.sex * state.sex
39     },
40     all (state) {
41       return state.list.every(item => item.isDone === true)
42     }
43   }
44 })
45 // 4. 匯出 store 物件
46 export default store

  main.js

 1 import Vue from 'vue'
 2 import App from './App.vue'
 3 // 匯入定義的store目錄下的index.js檔案
 4 // import store from '@/store/index.js' // 如果匯入某個目錄下的index檔案, 則可以省略index
 5 import store from '@/store'
 6 Vue.config.productionTip = false
 7 
 8 new Vue({
 9   store, // 將匯入的store新增到vue例項
10   render: h => h(App)
11 }).$mount('#app')

  元件AnyOne.vue

 1 <template>
 2   <div>
 3     <h2>隨便一個元件-1</h2>
 4     <!-- 使用vuex中狀態, state中的uname -->
 5     <p>{{ $store.state.uname }}</p>
 6     <!-- 使用vuex中狀態, state中的sex -->
 7     <p>{{ $store.state.sex }}</p>
 8     <!-- 使用vuex中配置的計算屬性 -->
 9     <p>{{ $store.getters.ccc }}</p>
10     <p>{{ $store.getters.all }}</p>
11 
12     <!-- 呼叫mutations中定義的修改state的方法abc, 並傳遞引數5000 -->
13     <button @click="$store.commit('abc', 5000)">更新sex</button>
14     <br />
15     <!-- 呼叫actions中定義的非同步方法newSex,並傳遞引數20 -->
16     <button @click="$store.dispatch('newSex', 20)">3s後更新sex</button>
17   </div>
18 </template>
19 
20 <script>
21 export default {}
22 </script>
23 <style lang="less" scoped></style>

  元件AnyTwo.vue

 1 <template>
 2   <div>
 3     <h2>隨便一個元件-2</h2>
 4     <!-- 使用計算屬性 -->
 5     <!-- <P>{{ sex }}</P> -->
 6     <p>{{ uname }}</p>
 7     <P>{{ nianLing }}</P>
 8     <P>{{ uname }}</P>
 9     <P>{{ ccc }}</P>
10     <P>{{ all }}</P>
11     <button @click="abc(100)">更新年齡</button>
12     <br />
13     <button @click="newSex(200)">三秒後更新年齡</button>
14   </div>
15 </template>
16 
17 <script>
18 // 匯入vuex中提供的一些方法
19 import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
20 export default {
21   // data () {
22   //   return {
23   //     sex: 1777
24   //   }
25   // },
26   computed: {
27     // mapState提供一種簡寫方式:  ...mapState() 傳想要獲取的狀態資訊, 拿到當前頁面作為計算屬性使用
28     // ...mapState(['sex', 'uname', 'list']),   // 陣列寫法
29 
30     // 給從state中獲取的狀態取別名,防止與當前頁面重名,作為當前頁面的計算屬性
31     ...mapState({ nianLing: 'sex', uname: 'uname', list: 'list' }),  // 物件寫法, 相當於取別名, 防止與data中的變數重名
32 
33     // 將vuex中的getters拿到當前頁面作為當前頁面的計算屬性
34     ...mapGetters(['ccc', 'all'])
35   },
36   methods: {
37     // 將vuex中mutations定義的方法拿到當前頁面作為當前頁面的方法
38     ...mapMutations(['abc']),
39     ...mapActions(['newSex'])
40   }
41 }
42 </script>
43 <style lang="less" scoped></style>

  根元件App.vue

 1 <template>
 2   <div>
 3     <AnyOne></AnyOne>
 4     <hr />
 5     <AnyTwo></AnyTwo>
 6   </div>
 7 </template>
 8 
 9 <script>
10 import AnyOne from './components/AnyOne.vue'
11 import AnyTwo from './components/AnyTwo.vue'
12 export default {
13   data () {
14     return {}
15   },
16   components: {
17     AnyOne,
18     AnyTwo
19   }
20 }
21 </script>
22 <style lang="less" scoped></style>

3、使用

4、簡化呼叫資料

  import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
  透過vuex中的一些方法將定義的store中的內容拿到當前頁面

相關文章