造轮子系列】面试官问:你能手写Vuex吗(一)?

简介: 造轮子系列】面试官问:你能手写Vuex吗(一)?

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

Vuex 是 Vue.js 的状态管理模式,它主要解决了组件之间共享状态时的问题。在本文中,我们将实现一个简单的状态管理器,来帮助我们更好地理解 Vuex 的实现原理。

使用 vue.use 启用 vuex 插件

vue.use 是 vue 提供的安装插件 API。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象。

即需要导出 install 方法,同时导出一个类 Store ,于是可以写出以下代码:

let Vue = null
class Store {
  constructor(options) {}
}
function install(_Vue) {
  Vue = _Vue
}
export default {
  Store,
  install,
}
复制代码

实现 install 方法

Store

Vuex 中,Store 是一个对象,它是一个容器,用于存储和管理状态( state ),包含了以下几个主要部分:

  • state:存储状态的数据,也就是全局要共享的数据。
  • getters:包含一些函数,用于对 state 进行计算操作。
  • mutations:包含一些函数,用于改变 state 的值。
  • actions:包含一些函数,用于处理异步操作或者一些逻辑处理。

 

state

首先,我们需要定义一个存储对象,用于保存应用程序的所有状态。我们可以创建一个名为 Store 的类,并在其中定义一个状态对象。我们还可以将 state 对象定义为响应式的,以便在状态更改时通知 Vue 更新视图。这可以通过使用 Vue.observable 方法来实现

class Store {
  constructor(options) {
    const { state = {} } = options;
    // 使用 observable 响应化处理
    this.state = Vue.observable(state);
  }
}
复制代码

getter

接下来,我们需要实现 getters,以便从状态中派生计算属性。我们将 getters 添加到 Store 类中:

class Store {
  constructor(options) {
    const { mutations = {} } = options;
    this.mutations = mutations;
    commit(type, payload) {
      if (!this.mutations[type]) {
        throw new Error(`Mutation "${type}" not found`);
      }
      this.mutations[type](this.state, payload);
    }
  }
}
复制代码

commit

最后,我们需要实现 mutations 和 actions,以便更改状态和处理异步操作。mutations 是唯一可以更改状态的方法,而 actions 则是处理异步操作的地方,它们可以触发 mutations 来更改状态。我们将 mutations 和 actions 添加到 Store 类中:

在下面的代码中,我们添加了一个 commit 方法,它接受一个类型和有效载荷参数,并调用与类型匹配的 mutation 函数来更改状态。

class Store {
  constructor(options) {
    const { mutations = {} } = options;
    this.mutations = mutations;
    commit(type, payload) {
      if (!this.mutations[type]) {
        throw new Error(`Mutation "${type}" not found`);
      }
      this.mutations[type](this.state, payload);
    }
  }
}
复制代码

dispatch

还需要添加了一个 dispatch 方法,它接受一个类型和有效载荷参数,并调用与类型匹配的 action 函数。注意,我们将 commit 和 state 作为参数传递给 action 函数,以便在需要更改状态时使用。

class Store {
  constructor(options) {
    const { actions = {} } = options;
    this.actions = actions;
    dispatch(type, payload) {
      if (!this.actions[type]) {
        throw new Error(`Action "${type}" not found`);
      }
      return this.actions[type]({ commit: this.commit, state: this.state }, payload);
    }
  }
}
复制代码

这个简单的状态管理器只是 Vuex 的一部分实现,但它帮助我们更好地理解了 Vuex 的概念和实现原理。你会发现还没有实现 map辅助函数、模块化以及严格模式等,后续将一步步完善,对比与 vuex4、pinia 的差异化等。希望这篇文章对你有所帮助!

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库  web前端面试题库 VS java后端面试题库大全

相关文章
|
7天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
4902 7
|
15天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
20692 113
|
10天前
|
人工智能 API 网络安全
Mac mini × OpenClaw 保姆级配置教程(附阿里云/本地部署OpenClaw配置百炼API图文指南)
Mac mini凭借小巧机身、低功耗和稳定性能,成为OpenClaw(原Clawdbot)本地部署的首选设备——既能作为家用AI节点实现7×24小时运行,又能通过本地存储保障数据隐私,搭配阿里云部署方案,可灵活满足“长期值守”与“隐私优先”的双重需求。对新手而言,无需复杂命令行操作,无需专业技术储备,按本文步骤复制粘贴代码,即可完成OpenClaw的全流程配置,同时接入阿里云百炼API,解锁更强的AI任务执行能力。
6575 2
|
11天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
7941 6
|
13天前
|
人工智能 JavaScript API
保姆级教程:OpenClaw阿里云/本地部署配置Tavily Search skill 实时联网,让OpenClaw“睁眼看世界”
默认状态下的OpenClaw如同“闭门造车”的隐士,仅能依赖模型训练数据回答问题,无法获取实时新闻、最新数据或训练截止日期后的新信息。2026年,激活其联网能力的最优方案是配置Tavily Search技能——无需科学上网、无需信用卡验证,每月1000次免费搜索额度完全满足个人需求,搭配ClawHub技能市场,还能一键拓展天气查询、邮件管理等实用功能。
7718 5
|
6天前
|
JavaScript Linux API
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
3697 1
保姆级教程,通过GACCode在国内使用Claudecode、Codex!

热门文章

最新文章