Vuex4+TS 之 vuex-composition-helpers

A util package to use Vuex with Composition API easily.

Installation

复制代码
$ npm install vuex-composition-helpers

This library is not transpiled by default. Your project should transpile it, which makes the final build smaller and more tree-shakeable. Take a look at transpiling.

Non-typescript projects may import the library from the dist subdirectory, where plain javascript distribution files are located.

复制代码
import { useState, ... } from 'vuex-composition-helpers/dist';

Basic Usage Examples

复制代码
import { useState, useActions } from 'vuex-composition-helpers';

export default {
    props: {
        articleId: String
    },
    setup(props) {
        const { fetch } = useActions(['fetch']);
        const { article, comments } = useState(['article', 'comments']);
        fetch(props.articleId); // dispatch the "fetch" action

        return {
            // both are computed compositions for to the store
            article,
            comments
        }
    }
}

Namespaced Usage Examples

复制代码
import { createNamespacedHelpers } from 'vuex-composition-helpers';
const { useState, useActions } = createNamespacedHelpers('articles'); // specific module name

export default {
    props: {
        articleId: String
    },
    setup(props) {
        const { fetch } = useActions(['fetch']);
        const { article, comments } = useState(['article', 'comments']);
        fetch(props.articleId); // dispatch the "fetch" action

        return {
            // both are computed compositions for to the store
            article,
            comments
        }
    }
}

You can also import your store from outside the component, and create the helpers outside of the setup method, for example:

复制代码
import { createNamespacedHelpers } from 'vuex-composition-helpers';
import store from '../store'; // local store file
const { useState, useActions } = createNamespacedHelpers(store, 'articles'); // specific module name
const { fetch } = useActions(['fetch']);

export default {
    props: {
        articleId: String
    },
    setup(props) {
        const { article, comments } = useState(['article', 'comments']);
        fetch(props.articleId); // dispatch the "fetch" action

        return {
            // both are computed compositions for to the store
            article,
            comments
        }
    }
}

Typescript mappings

You can also supply typing information to each of the mapping functions to provide a fully typed mapping.

复制代码
import { useState, useActions } from 'vuex-composition-helpers';

interface RootGetters extends GetterTree<any, any> {
    article: string;
    comments: string;
}

interface RootActions extends ActionTree<any, any> {
    fetch: (ctx: ActionContext<any, any>, payload: number);
}

export default {
    props: {
        articleId: String
    },
    setup(props) {
        const { fetch } = useActions<RootActions>(['fetch']);
        const { article, comments } = useGetters<RootGetters>(['article', 'comments']);
        fetch(props.articleId); // dispatch the "fetch" action

        return {
            // both are computed compositions for to the store
            article,
            comments
        }
    }
}

Advanced Usage Example

Consider separate the store composition file from the store usage inside the component. i.g.:

复制代码
// store-composition.js:
import { wrapStore } from 'vuex-composition-helpers';
import store from '@/store'; // local store file

export default wrapStore(store);
// my-component.vue:
import { createNamespacedHelpers } from './store-composition.js';
const { useState, useActions } = createNamespacedHelpers('articles'); // specific module name
const { fetch } = useActions(['fetch']);

export default {
    props: {
        articleId: String
    },
    setup(props) {
        const { article, comments } = useState(['article', 'comments']);
        fetch(props.articleId); // dispatch the "fetch" action

        return {
            // both are computed compositions for to the store
            article,
            comments
        }
    }
}

Transpiling

It depends on you project's stack, but let's say it consists of webpack, babel and ts-loader.

The rule processing .ts files should whitelist vuex-composition-helpers. If your project uses a raw webpack installation, it should resemble this.

复制代码
// webpack.config.js
module.exports = {
  ...
  module: {
    rules: [
      test: /\.ts$/,
      // If node_modules is excluded from the rule, vuex-composition-helpers should be an exception
      exclude: /node_modules(?!\/vuex-composition-helpers)/,
      use: [
        {
          loader: 'babel-loader',
          ...
        },
        {
          loader: 'thread-loader',
          options: { ... }
        },
        {
          loader: 'ts-loader',
          ...
        }
    ]
  }
}

When using vue-cli, use this instead

复制代码
// vue.config.js
module.exports = {
  ...
  chainWebpack: config => {
    config
      .rule('ts')
      .include
      .add(/vuex-composition-helpers/)
  }
}

If your webpack configuration is excluding node_modules from the bundle, which is common for SSR, this library should be an exception.

复制代码
// webpack.config.js
module.exports = {
 ...
  externals: [nodeExternals({
    whitelist: [/^vuex-composition-helpers/]
  })],
}

Babel should not exclude or ignore this library. If you use vue-cli, you may need the following configuration.

复制代码
// vue.config.js
module.exports = {
  ...
  transpileDependencies: ['vuex-composition-helpers'],
}

Although it's not strictly required, maybe ts-loader needs to have allowTsInNodeModules enabled in your project. Finally check that this library is not excluded in tsconfig.json, and if it was necessary, put it in the include list.

Enjoy!
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
小德车机导航43 分钟前
再添新功能。
教程·技术
marsh02067 天前
47 openclaw监控指标设计:关键性能指标(KPI)选择与实现
网络·ai·编程·技术
marsh020613 天前
45 openclaw集群部署与扩展:应对流量峰值的高可用方案
ai·编程·技术
marsh020614 天前
44 openclaw分布式事务:跨服务数据一致性解决方案
分布式·ai·编程·技术
marsh020619 天前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
marsh020621 天前
42 openclaw服务发现机制:动态管理微服务实例
ai·服务发现·编程·技术
marsh020623 天前
41 openclaw分布式会话管理:跨服务状态同步方案
分布式·ai·编程·技术
marsh020624 天前
39 openclaw持续集成实践:自动化构建与部署流程
运维·ci/cd·ai·自动化·编程·技术