All Projects → greenpress → Vuex Composition Helpers

greenpress / Vuex Composition Helpers

Licence: mit
A util package to use Vuex with Composition API easily.

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Vuex Composition Helpers

Vue Firebase Auth Vuex
Vue Firebase🔥 Authentication with Vuex
Stars: ✭ 248 (+78.42%)
Mutual labels:  hacktoberfest, vuex
Vue Cart
💵 A shop cart made with vue
Stars: ✭ 140 (+0.72%)
Mutual labels:  hacktoberfest, vuex
Vuex Rest Api
A utility to simplify the use of REST APIs with Vuex
Stars: ✭ 365 (+162.59%)
Mutual labels:  hacktoberfest, vuex
Typed Vuex
🏦 A typed store accessor for vanilla Vuex.
Stars: ✭ 193 (+38.85%)
Mutual labels:  hacktoberfest, vuex
Vuex Persistedstate
💾 Persist and rehydrate your Vuex state between page reloads.
Stars: ✭ 5,561 (+3900.72%)
Mutual labels:  hacktoberfest, vuex
99 Ml Learning Projects
A list of 99 machine learning projects for anyone interested to learn from coding and building projects
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Chromebrew
Package manager for Chrome OS
Stars: ✭ 1,838 (+1222.3%)
Mutual labels:  hacktoberfest
Haproxy
Development repository for the haproxy cookbook
Stars: ✭ 138 (-0.72%)
Mutual labels:  hacktoberfest
Urlextract
URLExtract is python class for collecting (extracting) URLs from given text based on locating TLD.
Stars: ✭ 138 (-0.72%)
Mutual labels:  hacktoberfest
Enwrite
Evernote-powered statically-generated blogs and websites
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Android Modular Architecture
📚 Sample Android Components Architecture on a modular word focused on the scalability, testability and maintainability written in Kotlin, following best practices using Jetpack.
Stars: ✭ 2,048 (+1373.38%)
Mutual labels:  hacktoberfest
Tgmeetup
A collection set of technical groups' information (meetup).
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Packages
📦 Package configurations - The #1 free and open source CDN built to make life easier for developers.
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Jigsaw
Simple static sites with Laravel’s Blade.
Stars: ✭ 1,823 (+1211.51%)
Mutual labels:  hacktoberfest
Hiya Hiya Hiya
Whatsapp Clone base on Firebase Cloud Messaging
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Omr
Optical Mark Recognition with PHP
Stars: ✭ 138 (-0.72%)
Mutual labels:  hacktoberfest
Users
Development repository for the users cookbook
Stars: ✭ 138 (-0.72%)
Mutual labels:  hacktoberfest
Hacktoberfest2018
A repository for HacktoberFest 2018.
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest
Ignition
A beautiful error page for Laravel apps
Stars: ✭ 1,885 (+1256.12%)
Mutual labels:  hacktoberfest
Marketplace Partners
Image validation, automation, and other tools for DigitalOcean Marketplace partners and Custom Image users
Stars: ✭ 139 (+0%)
Mutual labels:  hacktoberfest

vuex-composition-helpers

CI npm version

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!

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].