vuex的基本介绍和使用

1. vuex作用:

1.1 是一个专为 vue.js 应用程序开发的状态管理模式,集中式存储管理应用的所有组件的状态,以此实现非父子甚至不同组件之间的高效通信
1.2 缓存后端数据,提高用户体验

2. 什么时候vuex比较适用?

如果构建一个中大型单页应用,考虑到如何更好地在组件外部管理状态,vuex 就成为了自然而然的选择。但是如果您的应用够简单,不打算开发大型单页应用的话,最好还是不要使用 vuex,因为这时候使用 vuex 可能是繁琐冗余的。

3. vuex原理:

图片来自官网

vuex的状态管理分为同步状态和异步状态,都是在单向数据流理念下通过vue 的官方调试工具 devtools extension进行状态管理,所以最好严格遵循数据流向:
同步状态:Mutation====>State
异步状态:Actions====>Mutation====>State

4、vuex的几种常见安装及使用步骤:
4.1 安装vuex:

npm:
npm i vuex --save
yarn:
yarn add vuex
cdn直接引入:
<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script>

4.2检查项目下的main.js是否引入了store:

项目生成时就有的,但是最好检查一下:

import store from './store' //默认指向store/index.js

4.3 开始编译项目下src/store/index.js:

store中默认状态下的index.js

5、vuex的五大核心用法:

(1) state:单一状态树 ,每个应用将仅仅包含一个 store 实例,存放需要公共管理的状态(变量名)
(2) getters:可以从store 中的 state 中派生出一些状态,getters的返回值会根据 它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,类似于vue的计算属性
(3) actions:异步状态管理下的开始,存方法
(4) mutations:同步状态下的开始以及异步状态下的中转,存方法。更改 vuex 的 store 中的状态的唯一方法是提交 mutation。
(5) modules :管理模块,当多人合作开发时,避免每个人在同一个index.js文件修改,可把index.js中的state、mutations、getters、actions分为几个模块,在自己的模块文件中编译,最后将所有的模块名引入在Module中。(分为几个子模块后状态共享的用法也会不同,下面会详细介绍)
注意:只是分为几个模块,但是一个项目中store里始终只能有唯一的index.js
以下是本人开发过程中的index.js,其中注释部分有详细介绍数据流中传参相关语法:

import Vue from 'vue'
import Vuex from 'vuex'
import axios from '@/util/http'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        isTabbarShow: true,
        cinemaList: [],
        cityName: "北京",
        cityId: "110100"
    },
    // 处理同步状态+异步状态下的中转
    mutations: {
        show(state) {
            state.isTabbarShow = true
        },
        hide(state) {
            state.isTabbarShow = false
        },
        //第一个参数默认为state,第二个参数是Action传过来的参数
        setCinemaList(state, data) {
            //把数据传到state
            state.cinemaList = data;
        },
        setCityName(state, data) {
            state.cityName = data
        },
        setCityId(state, data) {
            state.cityId = data
        }
    },
    // 处理异步请求
    actions: {
        //store是形参名,vuex会自动传实参:store实例对象,第二个参数为组件中共享状态时传的参数
        getCinemaAction(store, id) {
            axios.request({
                url: `/gateway?cityId=${id}&ticketFlag=1&k=9719361`,
                headers: {
                    'X-Host': 'mall.film-ticket.cinema.list'
                }
            }).then(res => {
                console.log(res.data)
                 //提交中转到mutations
                store.commit("setCinemaList", res.data.data.cinemas)
            })
        },
    },
    //对上面全局状态进行数据处理,类似于vue的计算属性
    getters: {
        defaultList(state) {
            return state.cinemaList.slice(0, 5)
        }
    },
    modules: {}
})
6、在任意组件中实现状态共享的常见的一些语法用法(与上面相对应):

共享state/getters中的状态:this.$store.state/getters+在state中的状态名

this.$store.state.cinemaList
this.$store.getters.defaultList

共享actions中的状态: this.$store.dispatch(‘xxx’,需要传的参数)

this.$store.dispatch("getCinemaAction",this.cityId)

共享mutations中的状态: this.$store.commit(‘xxx’,需要传的参数)

this.$store.commit("hide")//调用mutations中的hide()
7、辅助函数mapState、mapActions、mapMutation、mapGetters用法:

上面组件中共享状态用法是不是觉得很麻烦????这四个辅助函数很高兴为您做简化服务>>>>>>>>
7.1 在组件中引入辅助函数:

import { mapState,mapGetters} from 'vuex'//需要哪个里面的状态就引入哪个

7.2 用展开运算符引入所需的状态名并开始简化使用,简化用法:不管是state、mutations还是其他两个里面的,直接this.状态名

computed: {
        ...mapState(["cinemaList"]),
        ...mapGetters(["defaultList"]),
        SdefaultList(){
            return this.defaultList
        }
    },
methods: {
        ...mapMutations(["show","hide","setCinemaList"]),
        handleCity(){
            this.setCinemaList([]);
            this.hide()
        }
    },

不知道智慧的大噶有没有发现展开的位置有要求呢????
好吧,我等不及了,现在揭晓:














注意!!!!!!!!!!!!!!!!!!!!!!!
一定要记得:根据他们中存的是状态(变量)还是方法
mapState、mapGetters一般在计算属性中展开
mapActions、mapMutation在methods中展开

8、index.js模块化:

当多人合作开发时,避免每个人在同一个index.js文件修改,可把index.js中的state、mutations、getters、actions分为几个模块,在自己的模块文件中编译,最后将所有的模块名引入在Module中。一般按组件分:
8.1 在store下建立modules文件夹,添加所需的js文件(所需的模块)
8.2 在对应的模块下编译需要共享的状态:

import http from '@/util/http'

const module = {
    namespaced: true, //开通命名空间
    state: {
    },
    actions: {
    },
    mutations: {
    },
    getters: {
    }
    
export default module

8.3 在index.js文件的modules下引入所有模块:

import Vue from 'vue'
import Vuex from 'vuex'
//引入模块
import cinema from './module/cinemaModule'
import tabbar from './module/tabbarshowModule'
import city from './module/cityModule'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
  },
  mutations:{
  },
  actions:{
  },
  getters:{
  },

  modules:{
  //添加模块名
    cinema,
    tabbar,
    city
  }
})
export default store

8.4 在组件中使用:
需要哪个模块的状态就前面加上模块名

computed: {
		//只有这里有改变
        ...mapState("cinema",["cinemaList"]),
    	...mapState("city",["cityName","cityId"]),
    	
        SdefaultList(){
            return this.defaultList
        }
    },
methods: {
        ...mapMutations(["show","hide","setCinemaList"]),
        handleCity(){
            this.setCinemaList([]);
            this.hide()
        }
    },
9、Vuex缓存数据永久化:

vuex每次从后台获取的缓存数据虽然能够减少数据加载次数,但是每次刷新就清空了,但我们实际开发中是需要它永久保存的,所以
9.1 安装

//nmp
npm install --save vuex-persistedstate
//yarn
yarn add vuex-persistedstate
//cdn引入
<script src="https://unpkg.com/vuex-persistedstate/dist/vuex-persistedstate.umd.js"></script>

欲知更详细点我就知道

9.2 index.js中添加import和plugins

//引入vuex-persistedstate
import createPersistedState from "vuex-persistedstate";

const store = new Vuex.Store({
//添加
  plugins: [createPersistedState({
    reducer(data){
      return {
        city:data.city//需要永久化的模块,默认为全部永久化
      }
    }
  })],
  state: {
  },
  mutations:{

  },
  actions:{
  },
  getters:{
  },
  modules:{
    cinema,
    tabbar,
    city
  }
})
export default store

<think>嗯,我现在要学习Vuex使用介绍常见的面试点。作为刚开始学Vue的新手,Vuex听起来有点复杂,不过我得慢慢理清楚。首先,VuexVue的状态管理库,对吧?那状态管理是什么意思呢?可能是指管理所有组件共享的状态,比如用户登录信息或者主题颜色之类的,避免组件之间频繁传递数据。 我记得在Vue中,组件之间的通信可以通过props事件来实现,但如果是多个组件共享同一个状态,尤其是深层嵌套的组件,这种方式可能会变得很麻烦。这时候Vuex就派上用场了,它提供了一个集中式的存储,所有组件都可以访问修改这个存储里的状态。这样的话,状态的变化更容易追踪管理。 接下来,Vuex的核心概念有State、Getters、Mutations、ActionsModules。我需要逐一理解这些概念。State就是存储数据的地方,类似于组件中的data。Getters类似于计算属性,可以对State中的数据进行加工处理。Mutations是用来修改State的方法,而且是同步的,必须通过commit来触发。Actions则是处理异步操作,比如调用API,然后通过commit来触发Mutations。Modules可以把大的Store分割成模块,每个模块有自己的State、Getters、MutationsActions,方便管理。 然后,我需要了解如何安装配置Vuex。通过npm安装vuex,然后在store/index.js中创建Store实例,导入到main.js中,挂载到Vue实例上。这样所有组件都可以通过this.$store访问到Store。 关于基本使用流程,应该是组件通过dispatch调用Action,Action通过commit提交Mutation,Mutation直接修改State,然后State的变化触发组件重新渲染。需要注意的是,不能直接修改State,必须通过Mutations,这样状态的变化才能被追踪到。 面试点的话,可能会问Vuex的核心概念,各概念的作用区别,比如为什么分MutationsActions,同步异步的区别。还有使用场景,什么时候需要用到Vuex,比如中大型单页应用,多个组件共享状态的时候。另外,可能会问到Vuex单纯的全局对象有什么区别,可能回答是响应式的,只能通过规定的方式修改,方便调试工具追踪状态变化。 还有可能问Module的作用,如何划分模块,命名空间的问题。以及Vuex的持久化存储,比如页面刷新后数据丢失怎么办,可能需要使用localStorage或者插件如vuex-persistedstate。 对了,辅助函数也是常见的点,比如mapState、mapGetters、mapActions、mapMutations,这些可以简化在组件中的使用。还有Vuex的工作流程,从组件触发Action,到修改State的过程。 可能还会问Vuex的缺点,比如在小型项目中可能会显得繁琐,增加复杂度。或者Vue3中的Composition API结合使用,比如Pinia作为替代方案。 嗯,大概这些点吧。我需要再检查一下每个部分是否正确,有没有遗漏的重要概念。比如单向数据流的概念在Vuex中是如何体现的,还有严格模式的作用,是否在开发环境中帮助检测不合法的状态修改。以及如何组织大型项目中的Vuex代码结构,模块化分割的最佳实践。</think>### Vuex 使用介绍及核心面试点 --- #### 一、Vuex 是什么? VuexVue.js 的**状态管理库**,用于集中管理组件间共享的状态(如用户信息、全局配置等)。它通过**单向数据流**确保状态变更可预测、可追踪。 --- #### 二、核心概念与流程 Vuex 的核心是以下 5 个概念: 1. **State** - **作用**:存储全局状态(类似组件的 `data`)。 - **示例**: ```javascript state: { count: 0, user: null } ``` - 组件中通过 `this.$store.state.count` 访问。 2. **Getters** - **作用**:计算派生状态(类似组件的 `computed`)。 - **示例**: ```javascript getters: { doubleCount: state => state.count * 2 } ``` - 组件中通过 `this.$store.getters.doubleCount` 访问。 3. **Mutations** - **作用**:**同步**修改 `state`,通过 `commit` 触发。 - **示例**: ```javascript mutations: { increment(state, payload) { state.count += payload; } } ``` - 组件中通过 `this.$store.commit('increment', 10)` 调用。 4. **Actions** - **作用**:处理**异步操作**(如 API 请求),通过 `dispatch` 触发,最终调用 `commit`。 - **示例**: ```javascript actions: { async fetchUser({ commit }) { const user = await api.getUser(); commit('setUser', user); } } ``` - 组件中通过 `this.$store.dispatch('fetchUser')` 调用。 5. **Modules** - **作用**:将大型 Store 拆分为多个模块,每个模块独立管理自己的 `state/getters/mutations/actions`。 - **示例**: ```javascript const userModule = { namespaced: true, state: { /* ... */ }, mutations: { /* ... */ } }; ``` --- #### 三、工作流程 1. 组件通过 `dispatch` 调用 **Action**。 2. Action 执行异步任务后,通过 `commit` 触发 **Mutation**。 3. Mutation 修改 **State**。 4. State 变化后,依赖它的组件自动更新。 --- #### 四、安装与配置 1. **安装**: ```bash npm install vuex --save ``` 2. **创建 Store**: ```javascript // store/index.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { /* ... */ }, mutations: { /* ... */ }, // ... }); ``` 3. **注入 Vue 实例**: ```javascript // main.js import store from './store'; new Vue({ store }).$mount('#app'); ``` --- #### 五、常见面试点 1. **核心概念的区别** - **Mutations vs Actions**: - Mutations 必须同步,Actions 可异步。 - 直接修改 `state` 会破坏响应式,必须通过 Mutations。 2. **使用场景** - 适合中大型项目,多个组件共享复杂状态时使用。 - 小型项目可用 `EventBus` 或 `provide/inject` 替代。 3. **Vuex 的缺点** - 代码模板较繁琐,小型项目可能增加复杂度。 - Vue3 推荐使用 `Pinia`(更轻量、支持 Composition API)。 4. **辅助函数** - `mapState`, `mapGetters`, `mapMutations`, `mapActions` 简化代码: ```javascript import { mapState } from 'vuex'; computed: { ...mapState(['count']) } ``` 5. **持久化存储** - 页面刷新后数据丢失?需搭配 `localStorage` 或插件(如 `vuex-persistedstate`)。 6. **模块化实践** - 按功能划分模块,开启 `namespaced: true` 避免命名冲突。 - 动态注册模块:`store.registerModule('moduleName', module)`。 --- #### 六、总结 Vuex 通过集中式状态管理解决了组件间复杂的状态共享问题,核心在于**规范化的数据流**(State → View → Action → Mutation → State)。面试中需重点理解其设计思想、各概念职责及实际应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值