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

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

相关推荐
marsh02061 天前
23 openclaw防止SQL注入:参数化查询与ORM安全使用
数据库·sql·安全·ai·编程·技术
marsh02062 天前
22 openclaw身份认证与授权:构建安全的访问控制
安全·ai·编程·技术
marsh02063 天前
21 openclaw安全威胁模型:识别常见攻击向量
安全·ai·编程·技术
biuba10245 天前
18 openclaw事务管理:确保数据一致性的最佳实践
开发语言·ai·c#·编程·技术
marsh02068 天前
17 openclaw数据库连接池配置:避免性能瓶颈的关键
数据库·ai·oracle·编程·技术
marsh02068 天前
16 openclaw与数据库集成:ORM使用与性能优化
数据库·spring·ai·性能优化·编程·技术
marsh02069 天前
14 openclaw模板引擎使用:高效渲染动态内容
java·前端·spring·ai·编程·技术
marsh020612 天前
13 openclaw数据验证与过滤:确保应用安全性的第一道防线
网络·数据库·ai·编程·技术
marsh020612 天前
12 openclaw中间件开发:打造可复用的业务逻辑组件
ai·中间件·编程·技术
marsh020613 天前
11 openclaw路由系统实战:构建灵活高效的请求分发机制
ai·编程·技术