Vuex的基本用法

博客介绍了Vuex适用于大型单页应用及多人协同开发。讲述了通过NPM安装Vuex,在main.js里使用Vue.use()启用。还说明了仓库store包含应用数据和操作,数据响应式,组件会随store数据变化更新,以及改变store数据需提交mutations等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vuex主要适用于大型单页应用,适合多人协同开发。(emmm....这是我看书上知道的,先记下来再看是不是。。)

1。通过NPM安装Vuex:

npm install --save vuex

2.与vue-router用法相似,在main.js里通过Vue.use()使用vuex:

import Vuex from 'vuex';

Vue.use(Vuex);

//配置路由省略

const store=new Vuex.Store({

//vuex的配置

});

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

 

仓库store包含了应用的数据(状态)和操作过程。Vuex里的数据都是响应式的,任何组件使用同一store的数据时,只要store的数据变化,对应的组件也会立即更新。

数据保存在Vuex选项的state字段内,比如要实现一个计数器,定义一个数据count,初始值为0:

在main.js中写:

const store=new Vuex.Store({
   state:{
       count:0
   }
});

在index.vue中通过$store.sate.count读取:

<template>
    <div>
        <h1>首页</h1>
        {{count}}
    </div>
</template>
<script>
    export default {
      computed:{
        count(){
          return this.$store.state.count;
        }
      }
    }
</script>

现在访问首页可以显示出来count:0

现在说vuex里面的一些方法:
在组件内,来自store的数据,不能手动改变,改变store中数据的唯一途径就是显式地提交mutations。

mutains是Vuex的第二个选项,用来直接修改state里的数据。我们给计数器增加2个mutations,用来加1和减1:

//main.js

const store=new Vuex.Store({
   state:{
       count:0
   },
    mutations:{
        increment (state,params){
          state.count+=params.count;
        },
        decrease(state){
           state.count--;
        },
    }
})

在组件内通过this.$store.commit方法来执行mutations。在index.vue中添加两个按钮:

<template>
    <div>
        <h1>首页</h1>
        {{count}}
        <button @click="handleIncrement">+1</button>
        <button @click="handleDecrease">-1</button>
         <button @click="handleIncrementMore">+5</button>
    </div>
</template>
<script>
    export default {
      computed:{
        count(){
          return this.$store.state.count;
        }
      },
      methods:{
        handleIncrement(){
          this.$store.commit('increment');
        },
        handleDecrease(){
          this.$store.commit('decrease')
        },
        handleIncrementMore(){
          this.$store.commit({
             type:'increment',
             count:5
          })

        }
      }
    }
</script>

这里的mutations还可以接受第二个参数,可以是数字,字符串或者对象等类型。比如每次不是增加1而是5

修改index.js中的increment代码

increment (state,params){
  state.count+=params.count;
},

在index.vue写:

 handleIncrementMore(){
          this.$store.commit({
             type:'increment',
             count:5
          })

 

### Vuex基本概念与用法 #### 什么是 VuexVuex 是专为 Vue.js 应用设计的一个状态管理模式[^1]。它的核心思想来源于 Flux、Redux 和 The Elm Architecture,旨在提供一种集中式的解决方案来管理复杂应用中的共享状态。通过 Vuex,开发者能够更加清晰地追踪和维护全局状态的变化过程。 --- #### Vuex 的主要组成部分 Vuex 主要由以下几个部分组成:`State`, `Getters`, `Mutations`, `Actions` 和 `Modules`[^2]。 ##### 1. **State** `State` 存储了整个应用的状态数据,类似于一个全局变量容器。任何组件都可以读取这些数据,但不能直接修改它们。为了保持一致性,所有的状态更改都必须通过 Mutations 来完成。 示例代码展示如何定义并访问 State: ```javascript const store = new Vuex.Store({ state: { count: 0 } }); // 组件中访问 State computed: { count() { return this.$store.state.count; } } ``` --- ##### 2. **Getters** `Getters` 类似于 Store 中的计算属性,允许我们从 State 中派生一些新值。可以通过返回函数的方式实现参数化 Getter[^3]。 示例代码演示 Getter 的使用: ```javascript const store = new Vuex.Store({ state: { todos: [ { id: 1, text: '学习 Vuex', done: true }, { id: 2, text: '复习 JavaScript', done: false } ] }, getters: { doneTodos(state) { return state.todos.filter(todo => todo.done); } } }); // 在组件中使用 Getter computed: { doneTodos() { return this.$store.getters.doneTodos; } } ``` --- ##### 3. **Mutations** `Mutations` 是唯一可以改变 State 的地方,并且必须是同步操作。每个 Mutation 都有一个字符串类型的事件名以及回调函数[^4]。 示例代码说明如何创建和调用 Mutation: ```javascript const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state, n) { state.count += n; } } }); // 调用 Mutation this.$store.commit('increment', 5); // 将 count 加上 5 ``` --- ##### 4. **Actions** `Actions` 提交的是 Mutations,而不是直接变更状态;并且 Actions 支持异步操作。这意味着可以在 Action 内部执行诸如 API 请求之类的任务后再提交 Mutation。 下面是一段简单的 Action 示例: ```javascript const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }, actions: { asyncIncrement(context) { setTimeout(() => { context.commit('increment'); }, 1000); } } }); // 调用 Action this.$store.dispatch('asyncIncrement'); // 一秒后将 count 增加 1 ``` --- ##### 5. **Modules** 随着应用规模的增长,Store 文件可能会变得臃肿难懂。因此 Vuex 提供了一种模块化的方案——即把 Store 划分为多个独立的小型模块[^5]。 以下是如何设置 Modules 的例子: ```javascript const userModule = { state: { name: 'John Doe' }, mutations: {}, actions: {} }; const productModule = { state: { items: [] }, mutations: {}, actions: {} }; const store = new Vuex.Store({ modules: { user: userModule, products: productModule } }); ``` 此时,在组件中可以通过命名空间的形式访问对应模块的数据或方法,例如 `this.$store.state.user.name`。 --- #### Vuex 的优势 - **单一数据源**:所有应用级别的状态都被存储在一个集中的 Store 对象中。 - **状态可追踪性**:由于所有的状态变化都需要经过 Mutations 进行记录,所以更容易调试和回溯问题所在。 - **更好的协同工作能力**:对于大型项目而言,团队成员之间能更方便地理解和维护公共状态逻辑。 --- #### 使用场景建议 并非任何时候都应该引入 Vuex。只有当遇到跨组件通信困难或者存在大量需要共享的状态时才考虑采用它[^1]。如果只是局部范围内的父子组件间通讯,则推荐继续沿用 Props 和 Events 方式解决即可。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值