傻瓜式vuex语法糖kiss-vuex整理


Posted in Javascript onDecember 21, 2018

前言

vuex 作为 vue 框架状态数据管理模块,诞生已有些许年头,它的出现很好地解决了兄弟组件响应式状态数据通信的问题。但是,vuex 的学习是一定门槛的,同时其声明和使用方式有一些不够简洁。一般情况下,我们会使用 new Vue({store})这种方式注入 Store,在组件中使用很 mapGetters 或 mapActions 等来引入 getters 和 actions 等,但随着项目状态数据增长,你会发觉越来越难以维护,因为这些数据和方法都太过分散。

看到这里,如果你还是不懂 vuex 是何物,或者你已经使用了 vuex 但是很不习惯它的用法,没有关系,你可以继续阅读本篇。实际上,在引入了 kiss-vuex 后,你甚至并不需要深刻理解 vuex 就能够很好地使用它。

如果有糖和白水,你会作何选择?我会选择把糖放入白水,味道更为完美。

介绍

kiss-vuex 是一个非常简单的语法糖类库,遵循软件工程里的 KISS 原则,仅仅暴露一个方法:Store。压缩版本仅仅只有 3KB,所以你可以放心加入到你的代码中。此处贴出几个有用的链接:

NPM
文档·中文
Github

安装和使用

通过 npm :

$ npm i kiss-vuex

注意:需要先行安装 vue 和 vuex。

在你的代码中,可以加入这样一个 js 文件:

// appStore.js
import { Store } from 'kiss-vuex';

@Store
class AppStore {
  counter = 0;
}

const appStore = new AppStore();

export { AppStore, appStore }

OK,一个 store 就声明好了。What!? 这么简单吗?对,就是这么简单。

我们对比下原始的 store 的声明方式:

import Vuex from 'vuex';

const appStore = new Vuex.Store({
 state: {
  count: 0
 },
 mutations: {
  increment (state) {
   state.count++
  }
 },
 actions: {
  increment (context) {
   context.commit('increment')
  }
 }
});

export { appStore }

怎么样,是否有很明显的差别?

kiss-vuex 提供了一种极为简洁的声明方式,通过 Store 装饰器,你能够快速获得一个 Store 类,然后实例化导出。在你需要使用到的地方将这个 store 引入,加入到组件的 computed 属性下。

贴一段使用示例代码:

// hello.component.js
import Vue from 'vue';
import { appStore } from './AppStore';

export default Vue.component('app-hello', {
  template: 
    `<div>
      <p>Click times: {{counter}}</p>
      <button @click="doClick()">add counter</button>
    </div>`,
  computed: {
    counter() {
      return appStore.counter;
    }
  },
  methods: {
    doClick() {
      appStore.counter++;
    }
  }
})

如果你有使用 Angular2+ 的经验,不难看出 kiss-vuex 里的 @Store 与 Angular 中的 @Service 十分类似。事实上,kiss-vuex 正是借鉴了这种模式,在未来的 vue3.0+ 版本中,也会有类似的语法特性。

当然,你依然可以使用函数调用的方式来声明 store:

// appStore.js
import { Store } from 'kiss-vuex';

// @Store
// class AppStore {
//   counter = 0;
// }

const appStore = Store({
  counter: 0
});

export { appStore }

引入的话就和上述示例中一样了。

另外,还有几个线上实例可供参考:

作为普通函数使用
作为装饰器使用

额外配置

上述 @Store 这种使用方式是基于 es 中的装饰器语法以及类属性语法,而目前装饰器和类属性都处于草案状态,所以需要让你的开发环境支持这些语法特性,你需要做一些额外配置。

babel

如果你使用了 babel,需要安装 @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties 两个插件:

$ npm i -D @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties

并配置到 babel.config.js 中:

module.exports = {
  plugins: [
    ["@babel/plugin-proposal-decorators", { legacy: true }],
    ["@babel/plugin-proposal-class-properties", { loose: false }]
  ],
  presets: [
    [
      "@babel/env",
      {
        modules: false
      }
    ]
  ]
};

typescript

如果你使用了 typescript,需要将 tsconfig.json 中的 compilerOptions.experimentalDecorators 这个属性值设置为 true。

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

es5

如果你偏爱 es5 环境,可以直接这么使用:

<body>
  <script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
  <script type="text/javascript" src="./node_modules/vuex/dist/vuex.min.js"></script>
  <script type="text/javascript" src="./node_modules/vuex/dist/kiss-vuex.min.js"></script>
  <script type="text/javascript">
    var appStore = KissVuex.Store({
      counter: 0
    });
    // 添加你的其余自定义代码
  </script>
</body>

后记

使用 kiss-vuex 能够大大减少 store 相关代码量,并提倡“先引入后使用”这种模式,能够很方便地进行维护和定位问题。有兴趣的同学可以自行去 github 中查看源码,思路也是非常巧妙的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 性能优化指南 (1)
May 21 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
js无法获取到html标签的属性的解决方法
Jul 26 Javascript
Ubuntu系统下Angularjs开发环境安装
Sep 01 Javascript
Js实现京东无延迟菜单效果实例(demo)
Jun 02 Javascript
vue+vux实现移动端文件上传样式
Jul 28 Javascript
vue 打包后的文件部署到express服务器上的方法
Aug 09 Javascript
微信小程序如何使用globalData的方法
Jun 06 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 #Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 #Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 #Javascript
vue中eslintrc.js配置最详细介绍
Dec 21 #Javascript
angularjs http与后台交互的实现示例
Dec 21 #Javascript
JS执行控制之节流模式实例分析
Dec 21 #Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 #Javascript
You might like
PHP-redis中文文档介绍
2013/02/07 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
js随机生成一个验证码
2017/06/01 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
大学本科毕业生的自我鉴定
2013/11/26 职场文书
喝酒检查书范文
2014/02/23 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
协议书的格式
2014/04/23 职场文书
英语分层教学实施方案
2014/06/15 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
民主生活会主持词
2015/07/01 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
python数字类型和占位符详情
2022/03/13 Python