0.2.0 • Published 7 years ago
@pushrdx/vuex-rx v0.2.0
Vuex-Rx WIP
Use Vuex + Vue + RxJS like React + Redux + React-redux + Redux-actons + redux-observable.
Boilerplate
see example
index.vue:
<template>
<p v-if="!reposByUser.length">loading...</p>
<Repos v-else :repos="reposByUser" :user="user"></Repos>
</template>
<script src="./Repos.component.js"></script>
Repos.component.js:
import { connect } from 'vuex-rx'
import { requestReposByUser } from './Repos.module'
import store from '../../store'
import Repos from '../../components/Repos'
const UserReposComponent = {
data() {
return {
user: this.$router.currentRoute.params.user
}
},
components: {
Repos
},
created() {
this.requestReposByUser(this.user)
}
}
const mapStateToProps = ({ ui }) => {
return ui.repos
}
export default connect(
mapStateToProps,
{ requestReposByUser }
)(UserReposComponent, store)
Repos.module.js
import { ajax } from 'rxjs/observable/dom/ajax'
import { Observable } from 'rxjs/Observable'
import { createAction, handleActions } from 'vuex-rx'
export const requestReposByUser = createAction('REQUEST_REPOS_BY_USERS')
const receviedReposByUser = createAction('RECEVIED_REPOS_BY_USERS')
const defaultState = {
reposByUser: []
}
// reducer
export const reducer = handleActions({
[receviedReposByUser]: (state, payload) => {
return { ...state, reposByUser: payload }
}
}, defaultState)
//epic
export const epic = action$ => action$
.ofType(`${requestReposByUser}`)
.map(action => action.payload)
.switchMap(user =>
ajax.getJSON(`https://api.github.com/users/${user}/repos`)
.map(receviedReposByUser)
)
APIs
createEpicMiddleware
param
store
type:
vuex store
usage: example
connect
param
mapStateToProps
(state: Store) => localState
param
mapMutationsToProps
type:
{ [key: string]: Action }
return
Connecter
param
Component
type:
vue Object component
param
Store
type:
vuex store
examples:
const componentA = { created() { this.requestUsers() } } const mapStateToProps = ({ ui }) => ({ ui.componentA }) export default connect(mapStateToProps, { requestUsers })
createAction
param
mutationName
type:
string
return
vuexMutation
handleActions
param
actionMap
type:
{ [index: actionName]: (state: LocalState, payload) => LocalState }
LocalState
here is got frommapStateToProps
param
defaultState
type:
LocalState
combineReducer
- combineEpics