造轮子系列】面试官问:你能手写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后端面试题库大全

相关文章
|
28天前
|
存储 JavaScript
实现vuex源码,手写
实现vuex源码,手写
|
缓存 调度
我将vue3响应式核心源码手写了一遍,成长了许多
我将vue3响应式核心源码手写了一遍,成长了许多
|
6月前
|
缓存 前端开发 JavaScript
前端面试必须掌握的手写题:进阶篇
前端面试必须掌握的手写题:进阶篇
|
6月前
|
存储 JSON 缓存
前端面试必须掌握的手写题:基础篇
前端面试必须掌握的手写题:基础篇
|
6月前
|
缓存 JavaScript 前端开发
【面试题】面试官:vue的这些原理你了解吗?
【面试题】面试官:vue的这些原理你了解吗?
|
设计模式 存储 JavaScript
前端面试100道手写题(3)—— EventBus
EventBus作为发布订阅设计模式的经典应用场景,很值得我们去学习研究它的实现原理。
158 0
|
前端开发 算法 安全
前端面试100道手写题(1)—— 手写Promise实现
今年的金三银四面试,遇到了很多新的面试八股文,其实心里对手写题或者算法题有一定抵触,因为实际工作中基本上就不会用到这些东西,但是正因为这些基础八股文,才能真正验证一个人对技术有多热爱的程度。也有可能近几年没有对这些基础知识进行巩固,所以干脆一狠心,先立个flag, 准备完成100道手写题。
259 0
|
缓存 前端开发 JavaScript
【面试官系列】一道曾经卡得我 “头皮发麻” 的阿里前端(React)面试题 ~
【面试官系列】一道曾经卡得我 “头皮发麻” 的阿里前端(React)面试题 ~
|
缓存 移动开发 开发框架
vue面试题八股文简答大全 让你更加轻松的回答面试官的vue面试题
Vue.js是一个流行的JavaScript框架,它使得构建复杂的交互式应用程序变得更容易。Vue.js基于MVVM模式设计,采用了响应式数据绑定和组件化的架构。在Vue.js中,数据绑定是非常重要的概念,它通过使用观察者模式来追踪数据变化并自动更新DOM。 Vue.js源码是一个庞大而复杂的项目,但通过掌握其核心概念,我们可以更好地理解其工作原理。在本文中,我们讨论了Vue.js的响应式数据绑定、虚拟DOM、模板编译、组件、生命周期钩子、事件处理和指令等关键知识点。了解这些知识点可以让我们更好地编写Vue.js应用程序,并深入了解Vue.js的工作原理
187 1
|
JavaScript 前端开发 中间件
带你从头到尾系统地撸一遍Redux源码(一)
Redux 背后的Flux 架构思想 看源码首先得明白,Redux背后的架构思想,为什么他和React那么的搭配,我们可以认为 Redux 是 Flux 的一种实现形式(虽然它并不严格遵循 Flux 的设定),理解 Flux 将帮助你更好地从抽象层面把握 Redux。 首先flux架构将一个应用分成4个部分: view:  视图层 action(动作):视图层发出的动作如: mouseclick dispatcher (派发器) :主要是用来接受actions,执行回调函数 store(数据层):用来存放应用的状态,一旦发生变动就要提醒 view 视图层更新 从图中可以看出Flux最大的
带你从头到尾系统地撸一遍Redux源码(一)