Giter Site home page Giter Site logo

vuex-coolstory's Introduction

vuex-coolstory NPM version GitHub Workflow Status

Use redux-saga with Vuex.

Overview

redux-saga is an awesome library that aims to make side effects (i.e. asynchronous things like data fetching and impure things like accessing the browser cache) easier and better.

While originally targetting Redux, redux-saga is actually not strictly tied to redux and do not rely on any internals of it's implementation. Actually redux-saga could be used with Vuex with put effect commiting mutations

This library wraps redux-saga so it can be used as Vuex plugin. It's external interface is similar to middleware provided by redux-saga.

Differences from vuex-redux-saga

vuex-redux-saga not work with latest redux-saga, uses subcribe to commits hook as redux-saga action channel, and looks like abandoned. This package support latest version of redux-saga, plus also have mapSagaActions() function for your components. To send actions to saga directly, you can use store.sagaDispatch function. store.sagaDispatch is similar to vuex store.dispacth function.

Installation

$ npm install --save vuex-coolstory redux-saga

Usage

Simple

import Vue from 'vue';
import Vuex from 'vuex';
import { VuexSaga } from 'vuex-coolstory';
import { take, put, race, delay } from 'redux-saga/effects';

Vue.use(Vuex);

// simple saga
function* saga() {
    while (true) {
        const { newItem, timer } = yield race({
            newItem: take('addItem'),
            timer: delay(3000)
        });
        if (timer) {
            yield put({
                type: 'appendItem',
                item: 'TIMER'
            });
        } else if (newItem) {
            yield put({
                type: 'appendItem',
                item: newItem.payload.item
            });
        }
    }
}

export default new Vuex.Store({
    state: {
        items: []
    },
    plugins: [
        VuexSaga({
            sagas: [saga] // pass your sagas to plugin
        })
    ],
    mutations: {
        appendItem(state, { item }) {
            state.items = [...state.items, item];
        }
    }
});

Modules

import Vue from 'vue';
import Vuex from 'vuex';
import { VuexSaga } from 'vuex-coolstory';
import { take, put, race, delay } from 'redux-saga/effects';

function* saga() {
    while (true) {
        const { newItem, timer } = yield race({
            newItem: take('addItem'),
            timer: delay(3000)
        });
        if (timer) {
            yield put({
                type: 'appendItem',
                item: 'TIMER_A'
            });
            // if module is namespaced you must define namespace 
            yield put({
                type: 'moduleB/appendItem',
                item: 'TIMER_B'
            });
        } else if (newItem) {
            yield put({
                type: 'appendItem',
                item: newItem.payload.item
            });
            yield put({
                type: 'moduleB/appendItem',
                item: [...newItem.payload.item].reverse().join('')
            });
        }
    }
}

export default new Vuex.Store({
    modules: {
        moduleA: {
            namespaced: false,
            state: {
                items: []
            },
            mutations: {
                appendItem(state, { item }) {
                    state.items = [...state.items, item];
                }
            }
        },
        moduleB: {
            namespaced: true,
            state: {
                items: []
            },
            mutations: {
                appendItem(state, { item }) {
                    state.items = [...state.items, item];
                }
            }
        }
    },
    plugins: [
        VuexSaga({
            sagas: [saga]
        })
    ]
});

API

VuexSaga(options)

Creates a Vuex plugin and connects the Sagas to the Vuex Store

mapSagaActions(args)

Similar to mapActions or mapMutations. See usage in examples/simple/src/app.vue

sagaDispatch(args)

Dispatch action to saga in sync mode.

/**
 * @param {string} type 
 * @param {any} payload 
 */
sagaDispatch({ type, payload });

sagaDispatchResolve(args)

Dispatch action to saga in async mode.

/**
 * @param {string} type action
 * @param {any} payload action
 * @param {(action: Action) => boolean | string} resolver resolver for finish action
 * @returns {Promise}
 */
sagaDispatchResolve({type, payload, resolver});

addSaga(saga, store, args)

Add saga after creating root store

/**
 * @param {Generator} saga function
 * @param {Store} store Vuex store
 * @param args other parameters acceptable by rudux-saga runSaga function
 */
addSaga(saga, store, args);

Run example

npm i
cd examples/simple
webpack
# check dist/index.html 

Contribution

Pull request are welcome!

vuex-coolstory's People

Contributors

dependabot[bot] avatar kolesoffac avatar niklv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

vuex-coolstory's Issues

Vuex-coolstory error function

I installed the library and just imported into the store, but this one returned an error

in ./node_modules/vuex-coolstory/index.js

Module parse failed: Unexpected token (42:39)
You may need an appropriate loader to handle this file type.
|  * @return {Function}
|  */
| export function VuexSaga({ sagas = [], ...args } = {}) {
|     return store => {
|         const channel = stdChannel();

 @ ./src/store/index.js 2:0-42
 @ ./src/main.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.js

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.