Maison > interface Web > Voir.js > le corps du texte

Comment utiliser Vuex dans Vue3

王林
Libérer: 2023-05-14 20:28:04
avant
2187 Les gens l'ont consulté

    Que fait Vuex ?

    Vue officiel : outil de gestion d'état

    Qu'est-ce que la gestion d'état ?

    État qui doit être partagé entre plusieurs composants, et il est réactif, un changement, tous les changements.

    Par exemple, certaines informations d'état utilisées globalement : statut de connexion de l'utilisateur, nom d'utilisateur, informations de localisation géographique, articles dans le panier, etc.

    À l'heure actuelle, nous avons besoin d'un tel outil pour la gestion globale de l'état, Vuex est comme celui-ci de un outil.

    Gestion de l'état d'une seule page

    Vue–>Actions—>State

    La couche de vue (vue) déclenche l'action (action), change l'état (état) et répond à la couche de vue (vue)

    vuex (Version Vue3.2)

    store/index.js crée des objets de magasin et exporte un magasin

    import { createStore } from 'vuex'
    
    export default createStore({
      state: {
      },
      mutations: {
      },
      actions: {
      },
      modules: {
      }
    })
    Copier après la connexion

    main.js introduit et utilise

    ...
    import store from './store'
    ...
    app.use(store)
    Copier après la connexion

    gestion d'état multi-pages

    Comment utiliser Vuex dans Vue3

    introduction des attributs d'objet de magasin vuex

    méthode pour obtenir l'objet d'instance du magasin dans Vue3

    Dans vue2, vous pouvez obtenir l'objet d'instance du magasin via this.$store.xxx.

    La configuration dans vue3 est exécutée avant la création et créée. Pour le moment, l'objet vue n'a pas encore été créé, et il n'y a pas de précédent, nous devons donc ici utiliser une autre méthode pour obtenir l'objet magasin.

    import { useStore } from 'vuex' // 引入useStore 方法
    const store = useStore()  // 该方法用于返回store 实例
    console.log(store)  // store 实例对象
    Copier après la connexion
    1. L'endroit où state

    stocke les données

    state: {
      count: 100,
      num: 10
    },
    Copier après la connexion

    Utilisation : La méthode d'utilisation est à peu près la même que la version dans vue2.x. Obtenez les propriétés dans l'état via le nom $store.state.property.

    //template中
    <span>{{$store.state.count}}</span>
    <span>{{$store.state.num}}</span>
    Copier après la connexion

    Vous pouvez effectuer directement des modifications de données dans l'état, mais Vue ne le recommande pas. Parce que pour les outils de développement de l'outil de développement Vue, si les modifications des données sont apportées directement dans l'état, les outils de développement ne peuvent pas les suivre. Dans vuex, on espère que les modifications de données pourront être effectuées via des actions (opérations asynchrones) ou des mutations (opérations synchrones), afin que les modifications de données puissent être directement observées et enregistrées dans les outils de développement, facilitant ainsi le débogage pour les développeurs.

    De plus, lors de l'ajout d'attributs ou de la suppression d'objets dans l'état dans vue3, vous n'avez plus besoin d'utiliser vue.set() ou vue.delete() pour effectuer un traitement réactif de l'objet. Ajoutez directement des attributs d'objet.

    2. La seule façon de mettre à jour l'état du magasin des mutations

    vuex : Soumettre les mutations

    Les opérations de synchronisation peuvent être effectuées directement dans les mutations

    les mutations comprennent principalement 2 parties :

    1. Type d'événement de chaîne (type)

    2. Une **fonction de rappel (gestionnaire)** Le premier paramètre de la fonction de rappel est state

    mutations: {
      // 传入 state
      increment (state) {
        state.count++
      }
    }
    Copier après la connexion

    Déclenché par $store.commit('method name') dans le modèle

    Obligatoire dans vue3.x Pour obtenir l'instance ** store, vous devez appeler une fonction comme useStore **, et importer les paramètres et les méthodes de transfert de paramètres de

    // 导入 useStore 函数
    import { useStore } from &#39;vuex&#39;
    const store = useStore()
    store.commit(&#39;increment&#39;)
    Copier après la connexion

    mution dans vuex. Les paramètres reçus peuvent être acceptés en les écrivant directement dans la méthode définie.

    // ...state定义count
    mutations: {
      sum (state, num) {
        state.count += num
      }
    }
    Copier après la connexion

    sont transmis via la charge utile de commit

    Utilisez store.commit('nom de fonction dans la mutation', 'paramètres qui doivent être transmis') pour ajouter des paramètres dans le style de soumission de commit

    <h3>{{this.$store.state.count}}</h3>
    <button @click="add(10)">++</button>
    ...
    <script setup>
    // 获取store实例,获取方式看上边获取store实例方法
    const add = (num) => {
      store.commit(&#39;sum&#39;, num)
    }
    </script>
    Copier après la connexion

    mution

    Comme mentionné auparavant, la mutation se compose principalement de deux parties : le type et la fonction de rappel, et le transfert de paramètres (soumission) via la charge utile de validation. Maintenant, nous pouvons

    soumettre la mutation de cette manière

    const add = (num) => {
      store.commit({
        type: &#39;sum&#39;,  // 类型就是mution中定义的方法名称
        num
      })
    }
    
    ...
    mutations: {
      sum (state, payload) {
        state.count += payload.num
      }
    }
    Copier après la connexion

    3 actions

    asynchrone L'opération est effectuée dans l'action. puis passé à la mutation
    action est essentiellement utilisé comme suit : Le paramètre par défaut de la méthode définie dans l'action est **contexte de contexte**, qui peut être compris comme l'objet de magasin

    via l'objet de contexte de contexte, obtenez le store, Déclenchez la méthode dans la mutation via commit pour terminer l'opération asynchrone

    ...
    mutations: {
      sum (state, num) {
        state.count += num
      }
    },
    actions: {
      // context 上下文对象,可以理解为store
      sum_actions (context, num) {
        setTimeout(() => {
          context.commit(&#39;sum&#39;, num)  // 通过context去触发mutions中的sum
        }, 1000)
      }
    },
    Copier après la connexion

    Appelez la méthode sum_action définie dans l'action via dispatch dans le modèle

    // ...template
    store.dispatch(&#39;sum_actions&#39;, num)
    Copier après la connexion

    Utilisez promise pour terminer l'opération asynchrone et notifiez le composant du succès ou de l'échec de l’exécution asynchrone. La méthode

    // ...
    const addAction = (num) => {
      store.dispatch(&#39;sum_actions&#39;, {
        num
      }).then((res) => {
        console.log(res)
      }).catch((err) => {
        console.log(err)
      })
    }
    Copier après la connexion

    sun_action renvoie une promesse lorsque la valeur accumulée est supérieure à 30, elle ne sera plus accumulée et une erreur sera générée.

     actions: {
        sum_actions (context, payload) {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              // 通过 context 上下文对象拿到 count
              if (context.state.count < 30) {
                context.commit(&#39;sum&#39;, payload.num)
                resolve(&#39;异步操作执行成功&#39;)
              } else {
                reject(new Error(&#39;异步操作执行错误&#39;))
              }
            }, 1000)
          })
        }
      },
    Copier après la connexion

    4. Getters

    Similaires aux propriétés calculées des composants

    import { createStore } from &#39;vuex&#39;
    
    export default createStore({
      state: {
        students: [{ name: &#39;mjy&#39;, age: &#39;18&#39;}, { name: &#39;cjy&#39;, age: &#39;22&#39;}, { name: &#39;ajy&#39;, age: &#39;21&#39;}]
      },
      getters: {
        more20stu (state) { return state.students.filter(item => item.age >= 20)}
      }
    })
    Copier après la connexion

    En utilisant les paramètres d'entrée des getters appelés via le nom de la méthode $store.getters, les getters peuvent recevoir deux paramètres, l'un est l'état et l'autre est lui-même des getters. et appelle ses propres méthodes existantes.
    //...template
    <h3>{{$store.getters.more20stu}}</h3> // 展示出小于20岁的学生
    Copier après la connexion

    Paramètres des getters et méthodes de passage des paramètres

    Ce qui précède sont les deux paramètres fixes des getters Si vous souhaitez transmettre des paramètres aux getters et les laisser filtrer les personnes plus âgées, vous pouvez le faire

    Retour. une fonction. Cette fonction accepte Age et gère

    getters: {
      more20stu (state, getters) { return getters.more20stu.length}
    }
    Copier après la connexion
    à l'aide de
    getters: {
      more20stu (state, getters) { return getters.more20stu.length},
      moreAgestu (state) {
          return function (Age) {
            return state.students.filter(item =>
              item.age >= Age
            )
          }
        }
      // 该写法与上边写法相同但更简洁,用到了ES6中的箭头函数,如想了解es6箭头函数的写法
      // 可以看这篇文章 https://blog.csdn.net/qq_45934504/article/details/123405813?spm=1001.2014.3001.5501
      moreAgestu_Es6: state => {
        return Age => {
          return state.students.filter(item => item.age >= Age)
        }
      }
    }
    Copier après la connexion

    5 modules

    Lorsque l'application devient complexe et que le nombre de variables gérées dans l'état augmente, l'objet store peut devenir assez volumineux.

    Afin de résoudre ce problème, vuex nous permet de diviser le magasin en modules, et chaque module a son propre état, mutation, action, getters, etc.

    Créez un nouveau dossier de modules dans le fichier du magasin
    Dans les modules Vous pouvez créer un seul module dans , un module gère les fonctions d'un module

    store/modules/user.js 处理用户相关功能

    store/modules/pay.js 处理支付相关功能

    store/modules/cat.js 处理购物车相关功能

    // user.js模块
    // 导出
    export default {
      namespaced: true, // 为每个模块添加一个前缀名,保证模块命明不冲突 
      state: () => {},
      mutations: {},
      actions: {}
    }
    Copier après la connexion

    最终通过 store/index.js 中进行引入

    // store/index.js
    import { createStore } from &#39;vuex&#39;
    import user from &#39;./modules/user.js&#39;
    import user from &#39;./modules/pay.js&#39;
    import user from &#39;./modules/cat.js&#39;
    export default createStore({
      modules: {
        user,
        pay,
        cat
      }
    })
    Copier après la connexion

    在template中模块中的写法和无模块的写法大同小异,带上模块的名称即可

    <h3>{{$store.state.user.count}}</h3>
    Copier après la connexion
    store.commit(&#39;user/sum&#39;, num) // 参数带上模块名称
    store.dispatch(&#39;user/sum_actions&#39;, sum)
    Copier après la connexion

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal