如何在快应用开发中使用 vuex 做状态管理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。如果您需要构建一个中大型单页应用,尤其是涉及多个页面需要共享数据,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。与 Vue 一样,快应用也是基于MVVM 的设计模式,因此略作适配,Vuex 也适用于快应用开发。本文旨在与大家分享:如何在快应用开发中使用 vuex 做状态管理

qa-vuex:快应用开发的状态管理

目标与理念

快应用是基于手机硬件平台的新型应用形态,标准是由主流手机厂商组成的快应用联盟联合制定。其标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台,以平台化的生态模式对个人开发者和企业开发者全品类开放。快应用具备传统 APP 完整的应用体验,无需安装、即点即用覆盖 10 亿设备与操作系统深度集成,探索新型应用场景。快应用 ── 复杂生活的简单答案,让生活更顺畅

快应用语法本身提供兄弟跨级组件通信、全局变量、props 等能力;但不同程度上,都存在些许问题:

  1. 开发者实现 Pub/Sub(订阅)模型:虽然完成了解耦,但操作繁琐;
  2. 利用框架本身提供的事件绑定接口:耦合性高,不够扁平化,难以维护;

如果您考虑通过全局变量以及 props 跨层级传递的方式,但其弊端相对会更多。在某些复杂业务场景,采取状态模型,基于事件操作驱动数据,基于数据变化更新界面;最合适不过了。在众多状态机相关类库中,有开发者对 vuex 进行了快应用适配:quickapp-vuex支持了几乎所有的功能,支持 computed, watch, methods)。因此您的快应用项目,可运用 vuex 进行状态管理,用以解决「兄弟跨级组件通信问题」,同时,降低代码之间的耦合性。在使用 quickapp-vuex 时,有发现基于 datagetters 皆不能使用数组(前者会导致报错,后者则陷入死循环),使得运用起来稍显不够顺畅;因此有 fork 出来——qa-vuex,对其做了解决,以便开发者可更灵活运用。

  • 支持度: 目前测试了部分手机,1010 及其以上都支持;
  • 支持机型:vivo | 魅族 | 华为 | 小米 | OPPO 等;

如何安装

yarn add qa-vuex
// OR
npm install qa-vuex --save

如何使用

如果您尚不了解 Vuex,还请先学习下。您也可以参见开源项目:quickapp-vuex-sample。如您需要了解更多,请参见文章:如何在快应用开发中使用 vuex 做状态管理

// store.js
import Vuex from 'qa-vuex'
import createLogger from './../../node_modules/quickapp-vuex/plugins/logger'

export default new Vuex.Store({
  state: {
    count: 1314,
    recordArr: []
  },

  getters: {
    rightRecordArr () {
      return state.recordArr. filter(item => item > 1421)
    }
  },

  mutations: {
    increment (state) {
      state.recordArr.push(state.count)
      state.count ++
    },
    decrement (state) {
      state.recordArr.push(state.count)
      state.count --
    }
  },
  plugins: [createLogger()]
})

app.ux 入口文件,引入 store.js,并挂到全局对象上,确保 store 只实例化一次。

// app.ux
import store from './store/store.js'
import Vuex from 'qa-vuex'

Vuex.install(store)

组件和页面中使用, 需要包一层 Vuex.Component,其他的和 vuex 用法类似。

<template>
  <div class="counter">
    <text class="title">{{count}}</text>
    <input class="btn" type="button" value="+" onclick="increment" />
    <input class="btn" type="button" value="-" onclick="decrement" />
  </div>
</template>

<script>
import { mapGetters, mapState, mapMutations, Component } from 'qa-vuex'

export default Component({
  computed: {
    ... mapState(['count', 'recordArr']),

    ...mapGetters(['rightRecordArr'])
  },

  methods: {
    ...mapMutations(['increment', 'decrement'])
  }
})
</script>

备注:对于组件内部函数,Vue2 是需要写在 methods 对象内部;而快应用是直接在外层即可,即与 onInit、onShow 等函数同层级。使用 Vuex.Component,以上两种写法都可以,看您喜欢。

computed 和 vue 一样支持 function 和 { get, set };

watch, 调用快应用的原生 $watch,支持值为 function。

import { Component } from 'qa-vuex'

export default Component({
  props: {
    title: String
  },

  watch: {
    title: function (newVal, oldVal) {
      console.log(newVal, oldVal)
    }
  }
})

项目示例

源码地址

quickapp-vuex-sample基于 Vuex 开发出的任务管理快应用:待办清单;它的目标是将任务从您的脑海中移到任务清单,让你专注于当前的工作

基于 vuex 开发的「待办清单」快应用

我们每天要做的事情都很多,经常会出现想做某个事然后忘掉的情况;待办清单,可以帮我们把要做的事情列出来,一项一项,类似思维导图。把要做的事情在「待办清单」上记录下来,辅之以提醒,就不会轻易忘记。并且,基于它可以让我们实时看到自己已经完成了哪些任务,获得即时满足感;还有哪些任务未完成,更好的规划自己的时间。这里的「待办清单」只是一个模版,提供一些基本功能;您可以在这些基础功能上,自由开发属于自己的 ToDoList 应用。

先决条件

安装快应用开发工具,提供了开发快应用所需要的功能,无需额外安装其它工具和环境。

目录介绍

└── src
│   ├── assets          # 公用的资源(Images/Styles/字体...)
│   │   ├──images       # 存储 png/jpg/svg 等公共图片资源
│   │   └──styles       # 存放 less/css/ 等公共样式资源
│   ├── components      # 存放项目所抽离出的组件
│   ├── helper          # 项目自定义辅助各类工具
│   ├── pages           # 统一存放项目页面级代码
│   ├── store           # 存放 vuex(store)相关内容
│   ├── app.ux          # 应用程序代码的入口文件
│   └── manifest.json   # 配置应用基本信息
└── package.json        # 定义项目需要的各种模块及配置信息

项目功能

  • ✅支持一键添加新任务
  • ✅标注已完成任务(向左滑动);
  • ✅支持删除单项任务(向左滑动);
  • ✅一键删除已完成任务;
  • ✅查看全部、已完成、未完成任务;

项目开发

对于「待办事项」这样一款逻辑较为简单的应用,编码上固然可以在一个文件内写完它;但为使得项目后续更好维护和扩展,又须保证程序可读性,就需要按照一定规则拆分(显示或功能),抽离出多个组件,降低单个文件复杂性。在前文中,已经阐述了 Vuex 的功能、如何使用,以及在快应用中使用它(qa-vuex)的必要性,在这里就不多做赘述。

qa-vuex,在源仓库的基础上,修复了 data、getters 所存在的问题;在 quickapp-vuex-sample 示例项目中,演示了 data、Component、methods、watch、computed、mapState、mapGetters 等功能使用,并通过检测;因此您可以放心在自己的快应用项目中使用。

另外值得一提的是,适用于 Vue 的优化方法,同样也适用于快应用开发。譬如说,在 Vue2 中,高效地处理长数组(静态),可以使用 Object.freeze ,使得数组是只读的,这会阻止修改现有的 property(即不会被添加了一个“观察者”属性),也意味着响应系统无法再追踪变化(这在 Vue2 文档:数据与方法中也有做说明);同时也会带来些好处──成倍减少堆栈占用大小以及渲染时间。详情可参见文章 Handling long arrays performantly in vue.js;在快应用开发中,您同样可以如此操作来优化。

问题记录

在组件开发中过程中,遇到些问题,以下几点值得您注意下:

  • tasks-list 组件展示添加任务,当任务名过长时,如果设置超出部分显示为省略号;本地预览会出现错误,整行都会显示为省略号,已提交 bug 但还未修复;
  • 使用 slide-view 组件时,slide-view 组件的 enableslide 属性(是否允许侧滑)默认是 true,可以不添加;但本地预览如果不设置为 true,slide-view 组件将会不能侧滑;
  • 本地预览,slide-view 组件中按钮组,点击会报错,已提交 bug 但还未修复。可以采用 touch 方法或者换一种表现形式,来实现侧滑点击功能。

猜您可能感兴趣的文章