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!
© 著作权归作者所有,转载或内容合作请联系作者

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

相关推荐
marsh02064 小时前
37 openclaw集成测试策略:确保组件间协作正常
ai·集成测试·编程·技术
marsh02066 天前
36 openclaw单元测试框架:编写可维护的测试代码
ai·单元测试·log4j·编程·技术
marsh02068 天前
35 openclawCQRS模式应用:分离读写操作提升性能
运维·ai·jenkins·编程·技术
marsh02068 天前
34 openclaw事件溯源:实现可追溯的业务流程
数据库·ai·编程·技术
marsh020612 天前
32 openclaw容器化部署:Docker与Kubernetes集成指南
docker·ai·容器·kubernetes·编程·技术
marsh020614 天前
31 openclaw微服务架构实践:构建分布式系统
微服务·ai·云原生·架构·编程·技术
biuba102423 天前
28 openclaw负载均衡实现:应对高并发场景的解决方案
运维·ai·负载均衡·编程·技术
marsh02061 个月前
23 openclaw防止SQL注入:参数化查询与ORM安全使用
数据库·sql·安全·ai·编程·技术
marsh02061 个月前
22 openclaw身份认证与授权:构建安全的访问控制
安全·ai·编程·技术
marsh02061 个月前
21 openclaw安全威胁模型:识别常见攻击向量
安全·ai·编程·技术