vuex的详细使用

本文介绍了Vuex的模块化使用方法,包括引入模块、设置模块、定义状态、getter、mutation和action,以及如何调用模块中的方法。通过将Vuex挂载到原型上,可以在项目全局使用。同时,讲解了如何拆分模块到单独的文件,如goods.js,并在listType.js中定义方法。页面调用时,可以借助mapState等辅助函数。

可以参照vuex官网https://vuex.vuejs.org/zh/guide/

总结:

1.引入模块

  import  {goods} from "./modules/goods"

2.将vuex导入模块

modules:{

   goods

}

3.定义模块

const state={};

const getters={};

const mustations={};

const actions={};

export default {

    namespaced: true,

    state,

    getters,

    mutations,

    actions

}

4.调用方法   

 ...mapState("模块名称",['变量名']

5.变量修改方法文件列表  listType.js

export const SETNUM="setNum"   ;//方法名

//在页面上引入

import {SETNUM} from"../listType.js"

[SETNUM](state,obj){  //@

 state.num+=obj

}


setNumAction({commit,state},obj){

   commit(SETNUM,obj)

}

1)我一般是将vuex挂载到原型上(一般是main.js文件中) ,这样在项目全局都能用

import store from './store'

//将vuex挂载到原型上
Vue.prototype.$store = store

2)在store/index.js中

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

Vue.use(Vuex)

export default new Vuex.Store({
    //变量区域
    state: {
        num: 1, //商品数量
        price: 10 //商品价格
    },
    //计算属性
    getters: {
        total: function(state) {
                return state.num * state.price;
            }
            //  total(state){
            //   return state.num * state.price;
            //  }
            // total: state => {
            //     return state.num * state.price;
            // }
    },
    // 方法区域,mutations中才能改变num的值
    mutations: {
        // mutations中方法有两个参数,一个是state,第二个数参数对象[只写一个]
        setNum(state, obj) {
            state.num += obj.n;
        }
    },
    // 异步方法 
    actions: {
        //假设数据n是从接口中拿过来的,假设发送网络请求
        // axios.get().then(res=>{
        //从actions去修改state中的变量
        // })
}
        // setNumAction(store上下文对象,参数对象)
        // etNumAction(context,obj);
        setNumAction({ commit, state }, obj) {
            //去调用mutstion的方法
            commit('setNum', obj)
        }
    },
    //引入模块
    modules: {}
})

3)在页面上调用

<template>
  <div class="home">
    <h1>欢迎使用vuex</h1>
    <h2>商品数量:{{ this.$store.state.num }}</h2>
    <h2>商品价格:{{ this.$store.state.price }}</h2>
    <h2>商品总价:{{ this.$store.getters.total }}</h2>
    <button @click="add">添加功能</button>
  </div>
</template>

<script>
export default {
  name: "Home",
  methods: {
    add() {
      //mustations中定义的方法 用commit来调用
      // this.$store.commit("setNum", { n: 4 });
      //而Actions中定义的方法,用dispatch来调用
      this.$store.dispatch("setNumAction", { n: 4 });
    },
  },
};
</script>

4)还有一种可以借助map的辅助函数 在页面中调用

<template>
  <div class="home">
    <h1>欢迎使用vuex</h1>
    <h2>商品数量:{{ num }}</h2>
    <h2>商品价格:{{ price }}</h2>
    <h2>商品总价:{{ total }}</h2>
    <button @click="add">添加功能</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
export default {
  name: "Home",
  data() {
    return {};
  },
  computed: {
    //省略了this.$store.state.变量名的写法
    //通过map函数的解构,将vuex中state变量拿出来,并在当前页面重新生成一个
    ...mapState(["num", "price"]),
    ...mapGetters(["total"]),
  },
  methods: {
    ...mapMutations(["setNum"]),
    ...mapActions([" setNumAction"]),
    add() {
      this.setNum({ n: 5 });
      // this.setNumAction({ n: 3 });
      //mustations中定义的方法 用commit来调用
      // this.$store.commit("setNum", { n: 4 });
      //而Actions中定义的方法,用dispatch来调用
      // this.$store.dispatch("setNumAction", { n: 4 });
    },
  },
};
</script>

(********)此外当然也可以将模块拆分出去  拆分到goods.js中  //用var 或者const都可以

// import {SETNUM} from "../listType.js"  另外一种写法
var state = {
    num: 1, //商品数量
    price: 10, //商品价格

}
var getters = {
    total: function(state) {
        return state.num * state.price;
    }
};
var mutations = {
    // [SETNUM](state,obj){  //另外一种写法
    //     state.num += obj.n;
    // }
    setNum(state, obj) {
        state.num += obj.n;
    }
};
var actions = {
    setNumAction({ commit, state }, obj) {
        //去调用mutstion的方法
        commit('setNum', obj)
    }
};

export default {
    namespaced: true,
    state,
    getters,
    mutations,
    actions
}

原来的index.js中,引入goods

import Vue from 'vue'
import Vuex from 'vuex'
//引入
import goods from './modules/goods.js'
Vue.use(Vuex)

export default new Vuex.Store({
    modules: {
        goods
    }
})

 

在listType.js中  [将方法名列表可以单独放到一个文件夹中去]

// export const SETNUM = 'setNum'; //商品数量

由于模块拆分出去了,页面上调用的写法

<template>
  <div class="home">
    <h1>欢迎使用vuex</h1>
    <!-- {{this.$store.state.goods.num}} -->
    <h2>商品数量:{{ num }}</h2>
    <h2>商品价格:{{ price }}</h2>
    <h2>商品总价:{{ total }}</h2>
    <!-- {{this.$store.getters['goods/total']}} -->
    <button @click="add">添加功能</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
export default {
  name: "Home",
  data() {
    return {};
  },
  computed: {
    //省略了this.$store.state.变量名的写法
    //通过map函数的解构,将vuex中state变量拿出来,并在当前页面重新生成一个
    //第一个属性名是指定模块的名字
    ...mapState("goods", ["num", "price"]),
    ...mapGetters("goods", ["total"]),
  },
  methods: {
    ...mapMutations("goods", ["setNum"]),
    ...mapActions("goods", [" setNumAction"]),
    add() {
      this.setNum({ n: 5 });
      // this.setNumAction({ n: 3 });
      //mustations中定义的方法 用commit来调用
      // this.$store.commit("setNum", { n: 4 });
      //而Actions中定义的方法,用dispatch来调用
      // this.$store.dispatch("setNumAction", { n: 4 });
    },
  },
};
</script>

 

 

 

<think>首先,用户的问题是:“我想获取Vuex详细使用说明和概念介绍请问Vuex详细介绍及使用指南”,翻译成英文是“IwanttogetadetailedusageguideandconceptualintroductiontoVuex.CouldyoupleaseprovideadetailedintroductionandusageguidetoVuex?”用户提供了几个引用,但这些引用不是直接来自用户的真实需求;系统提示说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”用户上一次的问题是相同的,所以没有之前的对话历史,我应该直接回答这个新问题。系统指令指定:-所有行内数学表达式用$...$-独立公式用$$...$$并单独成段-LaTeX语法正确-使用中文回答-生成相关问题-回答中引用的段落末尾自然地添加引用标识,如[^1]示例中提到回答问题要结构清晰,帮助用户逐步解决问题,保证真实可靠。问题涉及Vuex,是Vue.js的状态管理库,我需要提供详细的介绍和使用指南。结构化我的回答:1.**引言**:简要介绍Vuex是什么。2.**核心概念介绍**:解释state,getters,mutations,actions,modules。这些在引用[1]和[2]中提到。3.**使用指南**:如何安装和设置Vuex,结合代码示例。引用[4]和[5]提供了一些代码片段,我可以引用或基于它们构建。-例如,在main.js中设置store,使用mapActions和mapMutations。4.**优点和好处**:引用[3]提到了好处,如集中管理状态、解耦组件等。5.**示例代码**:提供简单的代码块来演示用法。6.**生成相关问题**:在末尾。回答中引用段落时,自然地添加引用标识。例如,如果我提到集中管理状态的好处,我可以引用[^3],因为引用[3]谈到了这个。系统提示说“回答中引用的段落末尾自然地添加引用标识”,意思是如果我从给定的引用中提取信息,就需要添加引用。用户提供了引用[^1]到[^5],所以在我的回答中,当引用这些信息时,加入类似[^1]的标识。在我的回答中,我应该:-参考用户提供的引用。-结构清晰:使用标题或小节。-使用中文。-生成相关问题在末尾。大纲回答:-**什么是Vuex?**-简要定义。-**VueVuex的关系**-从引用[1]中,提到VueVuex的关系。-**核心概念**1.State2.Getters3.Mutations4.Actions5.Modules-**如何使用Vuex**-安装和设置。-在组件中使用,比如mapState,mapActions等。-示例代码:创建一个store,并在组件中连接。-**优点**-提到集中管理等好处。-**相关的问题**:生成几个相关问题。LaTeX部分:因为Vuex涉及JavaScript代码,没有数学表达式,但我需要确保如果有任何内联数学,用$...$,但这里可能不需要。用户的问题中没有数学,所以可能不要紧。最后,相关问题:类似示例中的格式。例如:§§相关问题§§1.Vuex的模块化用法有哪些?2.如何在Vue组件中高效使用Vuex?3.Vuex的核心原理是什么?确保语言是中文。</think> ### Vuex 详细介绍及使用指南 VuexVue.js 应用程序的官方状态管理库,专为管理应用程序的全局状态而设计。它的核心思想是提供一个集中式的存储(store),用于处理组件之间的共享数据,从而简化大型应用的开发复杂度[^1]。Vuex 遵循 Flux 架构模式,并通过强制状态变化的可预测性来提高代码的可维护性和调试效率。本文将基于核心概念、使用步骤和实际示例,逐步介绍 Vuex详细使用指南。 --- ### 一、Vuex 的核心概念 Vuex 的核心概念包括 state、getters、mutations、actions 和 modules,这些共同构建了一个响应式状态管理系统。 1. **State(状态)** State 是应用程序的状态对象,用于存储所有全局数据。它类似于 Vue 组件的 data 属性,但作用于全局层面。State 中的数据是响应式的,这意味着任何组件中对 state 的读取都会自动依赖追踪,并在数据变化时触发组件更新[^1]。 **示例定义**: ```javascript const store = new Vuex.Store({ state: { count: 0, // 计数器状态 user: { name: 'Alice' } // 用户信息 } }); ``` 2. **Getters(获取器)** Getters 用于从 state 中派生出新数据,类似于 Vue 的计算属性(computed)。它避免了在多个组件中重复计算状态逻辑,并支持传入参数以实现灵活的派生操作[^1]。 **示例定义**: ```javascript getters: { doubledCount: state => state.count * 2, // 计算双倍值 getUserName: (state, getters) => (userId) => state.users.find(user => user.id === userId)?.name } ``` 3. **Mutations(变更)** Mutations 是更改 state 的唯一途径,每个 mutation 必须是同步函数。它确保状态变化的可追溯性,用于提交状态更新[^1]。 **示例定义**: ```javascript mutations: { increment(state) { state.count++; // 直接修改 state }, setUser(state, user) { state.user = user; } } ``` 4. **Actions(动作)** Actions 用于处理异步操作(如 API 调用),并最终提交 mutations 来更新 state。它允许包含业务逻辑,例如延迟操作或数据获取[^1]。 **示例定义**: ```javascript actions: { async fetchUser({ commit }) { const response = await fetch('/api/user'); const user = await response.json(); commit('setUser', user); // 调用 mutation 更新 state } } ``` 5. **Modules(模块)** Modules 用于组织大型应用的 store,每个模块拥有独立的 state、getters、mutations 和 actions。这有助于分解复杂状态逻辑并实现代码重用[^2]。 **示例结构**: ```javascript const moduleA = { state: () => ({ ... }), mutations: { ... } }; const store = new Vuex.Store({ modules: { a: moduleA } }); ``` --- ### 二、VueVuex 的关系 VuexVue.js 是深度集成的:Vue 组件通过注入的 store 访问全局状态,而 Vuex 则利用 Vue 的响应式系统实现状态变化的自动传播。这意味着: - 在 Vue 组件中,你可以通过 `this.$store` 直接访问 store。 - 组件的局部状态(如 data)仍用于内部逻辑,而全局共享状态应放在 Vuex store 中[^1]。 Vuex 的优势在于集中管理状态,从而减少组件间的直接耦合:调试时可回溯状态历史(如时间旅行调试),维护时所有变化都在一个地方管理[^3]。 --- ### 三、Vuex详细使用指南 接下来是安装、配置和使用 Vuex 的步骤。假设你在 Vue.js 项目中使用 Vuex。 #### 步骤 1:安装 Vuex 首先,通过 npm 或 yarn 安装 Vuex。 ```bash npm install vuex ``` #### 步骤 2:创建和配置 Store 在项目中新建一个 store 文件(如 `store/index.js`),定义 store 的核心结构。 ```javascript // store/index.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); // 注册 Vuex 插件[^1] export default new Vuex.Store({ state: { cartList: [], // 示例:购物车数据 isPopupOpen: false }, getters: { totalItems: state => state.cartList.length }, mutations: { addToCart(state, item) { state.cartList.push(item); }, togglePopup(state) { state.isPopupOpen = !state.isPopupOpen; } }, actions: { async addItemToCart({ commit }, item) { // 模拟异步操作 commit('addToCart', item); } } }); ``` #### 步骤 3:集成到 Vue 应用 在 `main.js` 中导入 store 并注入根 Vue 实例。 ```javascript // main.js import Vue from 'vue'; import App from './App.vue'; import store from './store'; // 导入 store[^5] new Vue({ store, // 注入全局 store render: h => h(App) }).$mount('#app'); ``` #### 步骤 4:在 Vue 组件中使用 Vuex 在组件中,通过 `this.$store` 访问状态或使用辅助函数(如 `mapState`、`mapActions`)简化代码。 - **读取 state 和 getters**: ```javascript // 在组件内部 computed: { ...mapState(['cartList']), // 映射 state ...mapGetters(['totalItems']) // 映射 getters }, methods: { ...mapMutations(['togglePopup']), // 映射 mutations[^4] ...mapActions(['addItemToCart']) // 映射 actions[^4] } ``` - **完整组件示例**: ```javascript <template> <div> <p>购物车条目数: {{ totalItems }}</p> <button @click="addItemToCart({ id: 1, name: '商品' })">添加商品</button> <button @click="togglePopup">切换弹出框</button> </div> </template> <script> import { mapGetters, mapActions, mapMutations } from 'vuex'; export default { computed: { ...mapGetters(['totalItems']) }, methods: { ...mapMutations(['togglePopup']), ...mapActions(['addItemToCart']) } } </script> ``` #### 步骤 5:使用 Module 进行状态组织 对于大型项目,模块化可以避免 store 的臃肿。 ```javascript // store/modules/cart.js export default { namespaced: true, // 启用命名空间 state: { items: [] }, mutations: { addItem(state, item) { state.items.push(item); } } } // 在根 store 中引入模块 // store/index.js import cartModule from './modules/cart'; const store = new Vuex.Store({ modules: { cart: cartModule } }); ``` 在组件中使用命名空间: ```javascript import { mapActions } from 'vuex'; export default { methods: { ...mapActions('cart', ['addItem']) // 指定模块命名空间 } }; ``` --- ### 四、Vuex 的优点和注意事项 - **核心优点**: - 集中管理状态:所有状态变化通过 mutations 和 actions 统一处理,方便调试和维护[^3]。 - 组件解耦:组件通过 store 通信,无需直接依赖,降低了代码耦合度。 - 调试工具支持:结合 Vue DevTools 可实现时间旅行调试(回放状态历史)[^3]。 - **使用建议**: - 保持 mutations 同步,以避免状态追踪混乱。 - 优先使用 actions 处理异步逻辑。 - 在大型项目中应用模块化,提高可扩展性。 Vuex 特别适用于有多个组件共享状态的应用(如电商购物车或实时数据仪表盘)。通过上述指南,你可以高效实现状态管理。如需更多实践,参考 Vuex 官方文档。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值