美文网首页Vue.jsVue.js专区
也许是使用方法最简单的全局状态管理工具!极简vue.js全局状态

也许是使用方法最简单的全局状态管理工具!极简vue.js全局状态

作者: masx200 | 来源:发表于2019-08-19 22:34 被阅读3次

vue-simple-global-state-store-manager

适用于Vue.js的极简全局状态管理库,基于ProxyEventTarget实现

https://github.com/masx200/vue-simple-global-state-store-manager

使用简单,可能是使用方法最简单的全局状态管理工具!

使用步骤只有两步,初始化全局状态,组件状态与全局状态双向绑定

跟其他全局状态管理工具相比,使用这个库对于原有的代码不需要太多的修改

组件状态与全局状态双向绑定

组件状态改变时全局状态改变

全局状态改变时组件状态改变

局部安装

cnpm install  --save https://github.com/masx200/vue-simple-global-state-store-manager.git

或者

yarn add https://github.com/masx200/vue-simple-global-state-store-manager.git

用法

import SimpleStoreManager, {
  bindGlobalStore,
  initGlobalState,
  getGlobalStates
} from "vue-simple-global-state-store-manager";

使用前先使用Vue.use(SimpleStoreManager)注册一下

函数getGlobalStates用来读取全局状态

函数initGlobalState用来生成状态初始值,

第一个参数为一个object,键名为全局状态名,键值为全局状态初始值

函数bindGlobalStore用来订阅全局状态,组件状态与全局状态双向绑定,

第一个参数为一个object, 键名为全局状态名,键值为组件状态名称

第二个参数为一个object或者function,是vue组件的构造参数或者vue组件的构造函数

返回值是vue组件的构造函数

示例

index.js

import Vue from "vue/dist/vue.esm.browser.min.js";

import SimpleStoreManager, {
  bindGlobalStore,
  initGlobalState
} from "vue-simple-global-state-store-manager";

Vue.use(SimpleStoreManager);

initGlobalState({
  globaltestname: "helloworld-使用全局状态管理"
});

import AppHome from "./apphome.vue";

new Vue({
  el: document.querySelector("#root"),

  render(h) {
    return h(AppHome);
  }
});

apphome.vue

<template>
  <div>
    <p>
      testname:
      <input class="form-control" v-model="testname" />
    </p>
    <button class="btn btn-outline-success btn-lg" v-on:click="changevalue()">
      修改testname
    </button>
  </div>
</template>
<script>
  import {
    initGlobalState,
    bindGlobalStore
  } from "vue-simple-global-state-store-manager";

  initGlobalState({
    globaltestname: "helloworld-使用全局状态管理"
  });

  var comp = {
    methods: {
      changevalue() {
        this.testname =
          Math.random() > 0.5 ? this.testname + "te--" : "--st" + this.testname;
      }
    },
    data() {
      return { testname: "helloworld-test使用全局状态管理" };
    }
  };

  var comfu = bindGlobalStore(
    {
      globaltestname: "testname"
    },

    comp
  );

  export default comfu;
</script>

演示网址

https://masx200.github.io/my-vue-router-project/index.html#/vue-simple-global-state-store-manager

为什么要写这个状态管理工具?

因为

现有的 redux,mobx,vuex 等等管理工具使用太过繁琐,

不喜欢那些使用特别麻烦的状态管理工具

这个状态管理工具可能是学习成本和使用成本最低的

状态双向绑定使用非常简单

原理

使用事件发布者订阅者模式来同步状态

基于EventTarget

使用了通过在EventTarget上触发事件和接收事件的方式,来通知组件刷新,一个事件触发对应多个事件监听

当组件被卸载时,清除事件监听器,防止内存泄漏

当组件挂载之后,会自动同步全局状态

由于事件监听函数是异步执行,所以组件状态刷新也是异步执行的

初始化全局状态时,如果当前全局状态已经存在,则不会重复初始化

使用Proxy来代理组件的构造函数,适配vue-loadervue-loader会把预编译好的render函数等参数添加到vuecomponent构造函数的options属性上

返回的构造函数是被 Proxy代理的vue组件实例,监听组件的状态变化和挂载卸载事件

Vue

Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用

https://cn.vuejs.org/v2/guide/

Proxy

Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

EventTarget

EventTarget 是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器

https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget

相关文章

网友评论

    本文标题:也许是使用方法最简单的全局状态管理工具!极简vue.js全局状态

    本文链接:https://www.haomeiwen.com/subject/mzjysctx.html