vuex のモジュール性

vuex 深層学習モジュール



序文

首先,回顾一下vuex的核心概念(个人理解,方便记忆理解):

  1. 状態: 共有データ
  2. 突然変異: 同期操作、状態データを変更する唯一の方法 最初の仮パラメータは状態データで、2 番目の仮パラメータは外部から渡されるデータです。
  3. アクション: 変更を保存します。非同期操作の最初のパラメーターはコンテキスト オブジェクトを表し、2 番目のパラメーターは外部から受信するデータを表します。
  4. getters: 計算された属性と同様、変更は許可されず、状態データはパッケージ化されて処理されます。
  5. モジュール: モジュール化 (つまり、今日私たちが学んでいること)

提示:以下是本篇文章正文内容,下面案例可供参考

1. モジュールとは何ですか?

  1. 公式導入: モジュールを使用すると、各モジュールが独自の状態、ミューテーション、アクション、ゲッターを持つことができるため、構造が非常に明確になり、管理が容易になります。すべての状態やメソッドがストア内に記述されると、非常に肥大化して管理が困難になります。を維持します。
  2. 個人的な理解:ステータス管理を明確にし、保守しやすくするため、比較的複雑で大規模なプロジェクトに適しています。相互に影響を与えることなく、独自の状態、ミューテーション、アクション、ゲッター、モジュールを持つことができます。
  3. 这个图很重要 一定要记住哟!!!
    ここに画像の説明を挿入します

2. モジュール化を実現する方法

1.作成

modules里面的state可以是函数,可以拥有这些自己的state、mutation、action、getters、modules

export default new Vuex.Store({
    
    
  state: {
    
    },
  getters:{
    
    },
  mutations: {
    
    },
  actions: {
    
    },
  modules: {
    
    
  	模块名1:{
    
    
            state:()=>({
    
    }),
            getters:{
    
    },
            mutations:{
    
    },
            actions:{
    
    },
            modules:{
    
    }
    },
    模块名2:{
    
    
            state:()=>({
    
    }),
            getters:{
    
    },
            mutations:{
    
    },
            actions:{
    
    },
            modules:{
    
    }
     }
  }
})

这样写全部都在store/index.js里面难以维护,所以进行文件的抽离

模块1.js

export default ({
    
    
  	state: {
    
    },
  	getters:{
    
    },
 	mutations: {
    
    },
  	actions: {
    
    },
 	modules:{
    
    }
  }
})
index.js 中导入模块

import 模块1 from './modules/模块1';
import 模块2 from './modules/模块2';

export default new Vuex.Store({
    
    
  state: {
    
    },
  getters:{
    
    },
  mutations: {
    
    },
  actions: {
    
    },
  modules: {
    
    
  	模块名1,
    模块名2
  }
})

2. モジュールデータを取得し、モジュールメソッドを呼び出す

2.1 モジュールの状態
方法1:{
    
    {
    
     $store.state.模块名.属性名 }}
方法2:import {
    
     mapState } from 'vuex';
	  computed:{
    
    
    		// 注意:对象写法
    		...mapState({
    
    
        		属性名:state=>state.模块名.属性名
   			}) 
	   }
2.2 モジュールゲッター
方法1:{
    
    {
    
     $store.getters.属性名 }}
方法2:import {
    
     mapGetters } from 'vuex'    
	  computed:{
    
    
     	...mapGetters(['属性名']) 
	  } 
2.3 モジュールの突然変異
方法1:$store.commit('方法名',实参)
方法2:import {
    
     mapMutations } from 'vuex'
	  methods:{
    
    
		...mapMutations(['方法名'])
	  }
2.4 モジュールのアクション
方法1:$store.dispatch('方法名',实参)
方法2:import {
    
     mapActions} from 'vuex'
	  methods:{
    
    
		...mapActions(['方法名'])
	  }

これを学習した後、状態モジュールの違いを除けば、他の取得と出発には違いがないことに気づきましたか。如果模块化下的属性名和方法名,与根模块下的重复则会出现问题报错之类的,所以我们使用 命名空间来实现具体的模块化操作

3. ネームスペースを有効にする (ネームスペースあり)

export default ({
    
    
  	state: {
    
    },
  	getters:{
    
    },
  	mutations: {
    
    },
  	actions: {
    
    },
  	modules:{
    
    },
  	namespaced:true // 默认为false
  }
})

在获取模块数据 调用模块方法的时候 一定要注意是哪个模块下面的属性名称

3.1 名前空間下の状態
方法1:{
    
    {
    
     $store.state.模块名.属性名 }}
方法2:import {
    
     mapState } from 'vuex';
	  computed:{
    
    
    		// 注意:对象写法
    		...mapState({
    
    
        		属性名:state=>state.模块名.属性名
   			}) 
	   }
3.2 名前空間の下のゲッター
方法1:{
    
    {
    
     $store.getters['模块名/属性名'] }}
方法2:import {
    
     mapGetters } from 'vuex'    
	  computed:{
    
    
     	...mapGetters({
    
    
     		属性名:'模块名/属性名'
     	}) 
	  } 
3.3 名前空間での突然変異
方法1:$store.commit('模块名/方法名',实参)
方法2:import {
    
     mapMutations } from 'vuex'
	  methods:{
    
    
		...mapMutations({
    
    
			方法名:'模块名/方法名'
		})
	  }
3.4 名前空間でのアクション
方法1:$store.dispatch('模块名/方法名',实参)
方法2:import {
    
     mapActions} from 'vuex'
	  methods:{
    
    
		...mapActions({
    
    
        	模块名/方法名:'模块名/方法名'
        })
	  }

3. 発生した問題点の共有

学到这,有没有觉得 这样记忆很麻烦 又有 单页面的状态管理的写法 又有多页面的写法 又分开启命名空间的,这样记忆确实很麻烦 所以我们可以 利用根模块的getters包装子模块的state数据, 可以用 根模块的actions里面访问其他模块的actions或者mutations

// 将子模块的state,变成根模块下的getters
export default new Vuex.Store({
    
    
	getters:{
    
    
        namelist:function(state){
    
    
            // state 表示所有的state数据,包括子模块下的
            return state.role.rolelist
        },
        // 简写
        //namelist:state=>state.role.rolelist
    }
})

//子模块写法
{
    
    
	state:()=>({
    
    
		namelist:[]
	}),
	namespaced:true
}
// 子模块的actions调用其他模块的actions或者mutations
actions:{
    
    
	方法名(context){
    
    
		context.commit('方法名')  // 触发自己的mutations方法
        context.commit('模块名/方法名') // 触发自己的子模块的mutations方法
        context.commit('方法名',null,{
    
    root:true}) // 触发根模块的mutations方法或者没开启命名空间模块下的mutations方法
        context.commit('模块名/方法名',null,{
    
    root:true})  // 触发其他模块的mutations方法
   
        context.dispatch('方法名')  // 触发自己的actions方法
        context.dispatch('模块名/方法名') // 触发自己的子模块的actions方法
        context.dispatch('方法名',null,{
    
    root:true}) // 触发根模块的actions方法或者没开启命名空间模块下的actions方法
        context.dispatch('模块名/方法名',null,{
    
    root:true})  // 触发其他模块的actions方法
	}
},
namespaced:true  // 开启了命名空间

要約する

さて、今日はここまでです。今日の研究があなたのお役に立てば幸いです。ぜひサポートしてください。

前の記事: vuex 学習
用の uniapp イメージ プレビューの実装

おすすめ

転載: blog.csdn.net/m0_56144469/article/details/126682356