简单手写一个vuex

183 阅读2分钟

vuex全局挂载

以下是一个简单的Vue状态管理插件手写示例代码。这个插件将允许你在Vue应用中集中管理状态,并提供一种在组件之间共享状态的方法。

首先,我们创建一个stateManager.js文件来定义我们的状态管理插件:


// stateManager.js
const StateManager = {
  install(Vue, options) {
    // 创建一个Vue实例来存储状态
    const state = new Vue({
      data: {
        // 初始状态,可以从options中传入
        ...options.state
      }
    });

    // 将state实例挂载到Vue原型上,以便在组件中访问
    Vue.prototype.$state = state;

    // 提供一个方法来修改状态(这是一个简化的示例,实际使用中可能需要更复杂的逻辑)
    Vue.prototype.$setState = function (newState) {
      Object.keys(newState).forEach(key => {
        state.data[key] = newState[key];
      });
    };
  }
};

export default StateManager;

在这个stateManager.js文件中,我们定义了一个StateManager对象,它有一个install方法。这个方法接受Vue构造函数和一个包含初始状态的options对象作为参数。在install方法内部,我们创建了一个新的Vue实例来存储状态,并将这个实例挂载到Vue原型上,以便在组件中访问。我们还提供了一个$setState方法来修改状态。

接下来,我们在Vue应用中使用这个状态管理插件。修改main.js文件:

// main.js
import Vue from 'vue';
import App from './App.vue';
import StateManager from './stateManager';

// 使用状态管理插件
Vue.use(StateManager, {
  state: {
    count: 0
  }
});

new Vue({
  render: h => h(App),
}).$mount('#app');

在这个main.js文件中,我们导入了Vue、App组件和StateManager插件,并使用Vue.use方法注册了这个插件。我们还传入了一个包含初始状态的options对象。

现在,我们可以在Vue组件中访问和修改这个状态了。创建一个App.vue文件:

<!-- App.vue -->
<template>
  <div id="app">
    <h1>Count: {{ $state.count }}</h1>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>

<script>
export default {
  name: 'App',
  methods: {
    increment() {
      this.$setState({ count: this.$state.count + 1 });
    },
    decrement() {
      this.$setState({ count: this.$state.count - 1 });
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

在这个App.vue文件中,我们创建了一个简单的Vue组件,它使用$state来访问状态,并使用$setState方法来修改状态。我们通过点击按钮来增加或减少count的值,并实时更新显示在页面上。

现在,你已经创建了一个简单的Vue状态管理插件,并在Vue应用中使用了它。这个插件提供了一种在组件之间共享状态的方法,并允许你集中管理状态。希望这个示例能帮助你理解如何手写一个Vue状态管理插件!