Code前端首页关于Code前端联系我们

一、vuex npm到底是什么?

terry 2天前 阅读数 16 #Vue
文章标签 vuex npm

不少刚接触Vue开发的同学,经常会疑惑“vuex npm是什么?项目里该怎么用它?”,其实vuex和npm是两个不同维度的工具,但结合起来能让Vue项目的状态管理变得更丝滑,今天就从概念、用法、避坑这些角度,把vuex npm相关的事儿掰碎了讲明白。

得先拆开理解“vuex”和“npm”,vuex是Vue生态里专门管**状态管理**的库——你可以把“状态”理解成项目里那些多个组件都要用、要改的数据,比如用户登录信息、购物车商品列表,而npm是Node.js的包管理工具,能帮我们快速下载、管理像vuex这样的第三方库。

vuex npm”本质是通过npm工具把vuex集成到Vue项目里的这套流程和技术组合,打个比方,就像你要给手机装App,应用商店(npm)里搜“vuex”这个App(库),点安装,之后就能在项目里用它管理数据了。

为什么Vue项目要用vuex(通过npm集成)?

要是项目里组件少、数据交互简单,不用vuex也能跑,但项目一复杂,没vuex就会陷入“数据混乱”:

  • 组件通信难:父子组件传值还能靠props、$emit,但孙子组件找爷爷组件要数据,就得层层传递,代码像“俄罗斯套娃”;兄弟组件通信更麻烦,得借父组件当“中介”。
  • 数据维护乱:多个组件改同一份数据时,到底谁改了、什么时候改的,根本没法溯源,比如购物车商品数量,首页、详情页、结算页都能改,没统一管理很容易出bug。

而vuex通过集中式存储+规则化修改解决这些问题:所有组件共享的状态存在vuex的“仓库(store)”里,要改状态必须走固定流程(mutation、action),谁改了数据、怎么改的,一目了然。

用npm安装vuex更是“降本增效”——不用自己手动拷贝vuex代码到项目里,一行命令就能把稳定版本的vuex拉到项目,还能自动处理依赖关系。

怎么通过npm安装vuex?

安装前得注意Vue版本和vuex版本的对应关系:

  • Vue2项目,要装vuex@3.x版本(因为vuex4只支持Vue3);
  • Vue3项目,得装vuex@4.x版本。

具体步骤分两种情况:

Vue2 + vuex3安装

打开项目终端,输入命令:

npm install vuex@3 --save

“--save”会把vuex加到package.json的依赖里,别人拉项目时能自动安装相同版本。

Vue3 + vuex4安装

终端执行:

npm install vuex@4 --save

装完后,就能在项目里初始化vuex的仓库了,比如在src目录新建store文件夹,里面建index.js:

// Vue3 + vuex4的写法
import { createApp } from 'vue'
import { createStore } from 'vuex'
const store = createStore({
  state() { // 存数据的地方
    return {
      count: 0
    }
  },
  mutations: { // 同步修改state的地方
    increment(state) {
      state.count++
    }
  }
})
const app = createApp(/* 根组件 */)
app.use(store) // 把store注入Vue应用

vuex核心功能在项目里怎么用?

装好了vuex,得知道怎么用它的核心功能,这里用“计数器”例子,带大家看state、mutation、action、getter、module怎么玩。

State:存数据

State是仓库里存数据的地方,就像家里的“储物柜”,组件要拿数据,直接从state里取:

// store/index.js里的state
state() {
  return {
    count: 0,
    user: { name: '小明', age: 18 }
  }
}
// 组件里用state(Vue3写法,Vue2类似)
import { useStore } from 'vuex'
export default {
  setup() {
    const store = useStore()
    // 取count
    const count = store.state.count
    // 取user.name
    const username = store.state.user.name
    return { count, username }
  }
}

Mutation:同步改数据

Mutation是唯一能直接改state的地方,而且必须是同步代码(异步得用action),比如给计数器加1:

// store/index.js的mutations
mutations: {
  increment(state) {
    state.count++
  },
  setUser(state, newUser) { // 带参数的mutation
    state.user = newUser
  }
}
// 组件里触发mutation
store.commit('increment') // 触发increment,count+1
store.commit('setUser', { name: '小红', age: 20 }) // 传参修改user

Action:处理异步+提交mutation

如果要做异步操作(比如调接口拿数据),得用Action,Action里不能直接改state,要通过提交mutation来改:

// store/index.js的actions
actions: {
  // 异步获取用户信息(模拟调接口)
  async fetchUser({ commit }) {
    // 模拟接口请求
    const res = await fetch('https://xxx/api/user')
    const userData = await res.json()
    commit('setUser', userData) // 拿到数据后,提交mutation改state
  }
}
// 组件里触发action
store.dispatch('fetchUser')

Getter:加工数据

Getter类似组件里的computed,能对state里的数据做“二次处理”,比如要把count转成字符串:

// store/index.js的getters
getters: {
  countStr(state) {
    return `当前计数:${state.count}`
  }
}
// 组件里用getter
const countStr = store.getters.countStr

Module:拆分仓库(大型项目必备)

项目大了,把所有状态塞到一个store里会很臃肿,这时候用Module把仓库拆分成多个小模块,比如用户模块、商品模块:

// store/modules/user.js
const userModule = {
  namespaced: true, // 开启命名空间,避免模块间方法名冲突
  state() {
    return { name: '默认名', age: 0 }
  },
  mutations: {
    updateName(state, newName) {
      state.name = newName
    }
  }
}
// store/index.js里引入模块
import { createStore } from 'vuex'
import userModule from './modules/user'
const store = createStore({
  modules: {
    user: userModule
  }
})
// 组件里用模块的state和mutation(因为开了命名空间)
store.commit('user/updateName', '新名字') 
const userName = store.state.user.name

用vuex(npm安装)时容易踩的坑?

就算流程走对了,这些“暗坑”也可能让项目报错,得提前避坑:

版本不兼容(最常见!)

Vue2硬装vuex4,或者Vue3装vuex3,启动项目会直接报错,解决方法:先看package.json里Vue版本,再对应装vuex版本(Vue2→vuex3;Vue3→vuex4)。

mutation里写异步代码

mutation要求必须同步,如果在mutation里写setTimeout、调接口,不仅数据更新乱,还会触发Vuex的警告,异步操作一律丢给action处理。

直接改state不触发视图更新

有些同学图方便,在组件里直接写store.state.count = 10,这样改state不会触发视图更新!因为vuex的state要通过mutation或action(提交mutation)来改,才能让Vue检测到变化。

模块命名空间混乱

多个模块里的mutation、action重名时,没开namespaced会互相覆盖,解决方法:给每个模块加namespaced: true,调用时用模块名/方法名的格式(比如user/updateName)。

说到底,vuex npm就是用npm把vuex“接”到Vue项目里,帮我们解决复杂场景下的状态管理难题,从安装时的版本对应,到使用时的state、mutation、action这些核心逻辑,再到避坑技巧,其实都是围绕“让多组件共享数据更有序”这个目标,要是你现在项目里数据交互开始变复杂了,不妨试试用vuex(通过npm安装)来理一理——先从小功能(比如购物车、用户信息)练手,慢慢就会摸清它的脾气~

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门