Skip to content
On this page

Anim Store 状态管理

当我们需要使用跨页面数据同步时,一个好用的状态管理库非常的重要。Anim 内部集成了一个非常简单好用的 Store,可以同时支持 Page 和 Component,帮助开发者轻松实现状态管理。

如何使用

Anim Store 在页面 Page 级别和组件 Component 级别是一样的使用方式。

Store 定义

Store 中主要做两件事

  1. 定义 store 中的数据。
  2. 提供更新数据的方法。

我们看一个用户状态管理 UserStore 的简单案例

js
// /store/user.js
// 定义一个 UserStore
class UserStore {
  data = {
    name: '',

    // 计算属性
    computedName() {
      return 'hello ' + this.name
    }

    // 也可以直接使用 get 方法
    get computedName2() {
      return 'hello ' + this.name
    }
  }

  updateUserInfo(userInfo) {
    this.data.name = userInfo.name

    // update/updateApp 方法即为重新渲染的方法,一般情况下 update 就足够使用了。

    // update 该渲染方式仅会渲染当前页面/组件,后续页面仅会在 onShow 时更新,适合性能要求高的页面。
    this.update()

    // updateApp 该渲染方式会将所有页面/组件都触发更新,适合体验要求高的页面。
    // this.udpateApp()
  }
}

export default new UserStore()

页面 Page 使用

将 store 连接到 Page 上时需要注意 key 值的定义。

js
// /pages/index/index.js
import Anim from '@ssv-lab/anim';
import userStore from '../../store/user';

Anim.Page({
  store: {
    // 等同于挂载到了 this.data.user。
    user: {
      store: userStore,
      // 以下配置选填,可以实现按需注入,如果不提供则整个 store.data 会注入到页面/组件中
      mapToData(data) {
        return {
          name: data.name,
        };
      },
    },
  },
  onLoad() {
    // 异步更新数据
    wx.request({
      url: '/getUserInfo',
      success(res) {
        userStore.updateUserInfo(res.data);
      },
    });
  },
});

Store 挂载后,在页面上可以直接使用

html
<!-- /pages/index/index.wxml -->
<view> 用户名:{{user.name || '暂未登录'}} </view>

组件 Component 使用

组件和页面是一样的用法,只需要通过 Anim.Component 作为构造器即可。

js
// /components/A/A.js
import Anim from '@ssv-lab/anim';
import userStore from '../../store/user';

Anim.Page({
  store: {
    // 等同于挂载到了 this.data.user。
    user: {
      store: userStore,
    },
  },
  methods: {
    clearUserInfo() {
      userStore.updateUserInfo({ name: '' });
    },
  },
});
html
<!-- /components/A/A.wxml -->
<view>
  <view>我是组件</view>
  <view>用户名:{{user.name || '暂未登录'}}</view>
</view>

注意事项

这里再重复几个关键点:

  1. 数据更新的时候,需要使用 this.update 方法进行更新。
  2. 绑定到页面和组件的 store key,最终是会挂载到 this.data.${storeKey} 上。
  3. update 方法会被注入到页面和组件上,请尽量避免定义 update 方法或者更改相应的名字。
  4. store 树数据太大的话,会影响整体渲染性能,可考虑多个 Store 树或者使用 mapToData 的方案来做到按需注入。

与 Watch/Computed 共同使用

可以参照 watch 与 computed 相关篇章

Released under the MIT License.