vue-8: Vuex 状態管理パターン ライブラリ + マップ ヘルパー関数の短縮形

保存する理由: ウェアハウスの複数のコンポーネントがデータを共有できる

コアAPI

  • 使用状態: this.$store.state.xxxx

  • 補助関数マップ内: this.$store.state.module name.xxxx

    • 各コンポーネントは $store を取得できます

  • 計算されたプロパティ: this.$store.getters.xxx

  • this.$store.commit("同期メソッド名", パラメータ)

    • 同期メソッドを呼び出してストア内のデータを変更します

  • this.$store.dispatch("非同期メソッド名", パラメータ)

    • 非同期メソッドの呼び出し、非同期コードの実行

1. vuex をダウンロードし、設定されたストアを main.js に適用します

1.下载vuex
npm i vuex

2.实例化store
export default createStore({ })

3.应用store
import store from './store'
app.use(store)

2. ウェアハウスをインスタンス化する: ストアストレージフォルダーの下のindex.jsでウェアハウスをインスタンス化します。

合計6つのコアコンセプト

3. プラグインのインストール (vuex を更新するとデータ損失が発生するため): 永続ストレージ プラグイン ソリューション

可持久化存储,插件:安装:(因为刷新vuex会数据丢失)

npm install vuex-persistedstate --save

日志打印:vuex自带createLogger

这个插件不用装,查看是否存储成功,会自动打印到 控制台
import { createStore,createLogger } from 'vuex'
import createPersistedState from "vuex-persistedstate";

//实例化仓库
export default createStore({
    state:{ //负责存储数据
       userinfo:{}
    },
    getters:{ //定义计算方法( 类似组件中的计算属性, 每个计算方法必须有返回值 )
        
    },
    mutations:{ //定义同步方法( 可以直接修改state中的数据 )
        save_userinfo( state, payload ){
            state.userinfo = payload;
        }
    },
    actions:{ //定义异步方法( 内部可以执行异步代码, 但是不能直接修改state中的数据 )

    },
    modules:{ //模块化管理state中的数据

    },
    plugins:[ //配合其他插件管理state中的数据
        createLogger(),//日志打印
        createPersistedState(),//持久化存储
    ]
})

4.使用する

methods:{
    onClickLeft(){
      this.$router.go(-1);
    },
    async onSubmit(values){
      //发起 登陆请求
      var res = await service.user_login( values );
      if( res.data.code == 200 ){
        //存储用户的信息,token
        this.$store.commit('save_userinfo',res.data.data)

        //跳转到首页
        this.$router.push('/index');
      }
    }
  }

5. メソッド: 同期メソッドを使用します。

6. アクション: 非同期メソッドを定義します: (非同期コードは内部で実行できますが、状態内のデータを直接変更することはできません)

非同期メソッドの背後に同期メソッドがあります

7. ゲッター: 計算メソッドを定義します (配列内の計算プロパティと同様に、各計算メソッドには戻り値が必要です)。

実際、計算されたものと同じように、属性として使用されます。

モジュール:状態でのデータのモジュール管理: 使用後の違い:

vuex がモジュールに分割されている場合、使用するデータを使用する必要があります。

this.$store.state.モジュール名.xxxx

  • import はデータモジュールをインポートし(モジュールには排他的なメソッドがあります)、モジュールをモジュールに登録します

    • import Vue from 'vue'
      import Vuex from 'vuex'
      // 1.引用模块
      import homem from "./modules/homem.js"
      import aboutm from "./modules/aboutm.js"
      
      Vue.use(Vuex)
      
      export default new Vuex.Store({
        
        modules: {//2配置模块
          homem,
          aboutm
        }
      })
  • 通常の使用:

  • import Vue from 'vue'
    import Vuex from 'vuex'
    // 1.引用模块
    import homem from "./modules/homem.js"
    import aboutm from "./modules/aboutm.js"
    
    Vue.use(Vuex)
    
    export default new Vuex.Store({
      
      modules: {//2配置模块
        homem,
        aboutm
      }
    })
  • ヘルパー関数マップを使用する

  • <template>
      <div>
        fufuf
        <!-- 3.绑定自定义事件 -->
        <!-- <ZiCom @自定义事件=“函数”/> -->
        <ZiCom @xiaoming="demo"/>
      </div>
    </template>
    
    <script>
    import ZiCom from "./ZiCom.vue"
    export default {
        components:{
            ZiCom
        },
        methods:{
            // 4定义函数 并且接收自定义事件上面的数据
            demo(val){
                console.log(val)
            }
        }
    }
    </script>
    
    <style>
    
    </style>

  • 同期的に非同期的に使用する

短縮表現を実現するためのマップヘルパー関数があります

vuex のデータとメソッドを直接マッピングできる

mapState は計算されたものにマップされ、MapGetter は計算されたものにマップされます。

mapMutation はメソッドにマッピングされます。 mapActions はメソッドにマッピングされます。

vuex の補助関数 (vuex データ操作の複雑さを簡素化します) mapState ---> 配列の使用法:

 vuex的辅助函数(简化了我们操纵vuex数据的复杂度)mapState--->数组用法

<template>
  <div class="sunClass">
    组件
    <h1>aa{
   
   {texta}}</h1>
    <h1>aa{
   
   {obj.name}}</h1>
  </div>
</template>

<script>
import {mapState} from "vuex"
export default {
    // 使用mapState
    computed:{
        // 名字需要和vuex的state数据名相同
        ...mapState(["texta","obj"])
    }
};
</script>

Vuex の補助関数 mapState ---> オブジェクトの使用法:

数组方式:如果使用了模块 在mapState中写的就是模块名 
<template>
  <div class="sunClass">
    组件
    <!-- 使用数据的时候 就是下面找到的模块名.数据名 -->
    <h1>{
   
   { com.texta}}</h1>
    <h1>{
   
   { com.obj.name}}</h1>
  </div>
</template>

<script>
import {mapState} from "vuex"
export default {
    // 如果使用了模块 在mapState中写的就是模块名 
    computed:{
        ...mapState(["com"])
    }
};
</script>


对象方式:
<template>
  <div class="sunClass">
    组件
    <h1>aa{
   
   {xiaoming}}</h1>
    <h1>aa{
   
   {xiaohong.name}}</h1>
  </div>
</template>

<script>
import {mapState,mapActions} from "vuex"
export default {
    // 使用mapState
    computed:{
        ...mapState({
            // state.模块名.数据名
            xiaoming:(state)=>state.com.texta,
            xiaohong:(state)=>state.com.obj,
        })
    },
    methods:{
            ...mapActions(["axioslink"])
    }
};
</script>

おすすめ

転載: blog.csdn.net/qq_60839348/article/details/130671393