一个 vue 的状态管理工具,基于 rx.js, vue-rx
npm install vue vue-rx vurx --save
import Vue from 'vue'
import Rx from 'rxjs/Rx'
import VueRx from 'vue-rx'
import Vurx from 'vurx'
Vue.use(VueRx, Rx)
Vue.use(Vurx)
import { store, observable, action, getter } from 'vurx'
import Rx from 'rxjs'
@store
export default class MyStore {
// 定义一个 observable
@observable foo = new Rx.BehaviorSubject('hello world')
// 定义一个 getter
@getter
get bar () {
return this.foo.map(str => str + '!')
}
// 定义一个 action
@action
setFoo (value) {
this.foo.next(value)
}
// 加载完成钩子
mounted () {
// do something
}
}
var store = Vurx.init({
store: { MyStore }
})
然后就可以通过 store
获取状态和调用 action
store.MyStore.foo.subscribe(foo => {console.log(foo)})
store.MyStore.bar.subscribe(bar => {console.log(bar)})
store.MyStore.setFoo('abc')
// output:
// hello world
// hello world!
// abc
// abc!
将 store 注入 Vue 实例
var store = Vurx.init({
store: { MyStore }
})
new Vue({
el: '#app',
template: '<App/>',
store,
components: { App }
})
在组件中可以通过 this.$store
获取 store
this.$store.MyStore.foo.subscribe(foo => {console.log(foo)})
this.$store.MyStore.bar.subscribe(bar => {console.log(bar)})
this.$store.MyStore.setFoo('abc')
// output:
// hello world
// hello world!
// abc
// abc!
通过 vue-rx
将状态映射到本地组件里
var vm = new Vue({
subscriptions () {
return {
myFoo: this.$store.MyStore.foo
}
},
mounted () {
console.log(this.myFoo) // 'hello world'
console.log(this.myBar) // 'hello world!'
}
})
使用 mapObservables
和 mapActions
,方便进行多个 observable
和 action
的映射
var vm = new Vue({
subscriptions () {
return {
...mapObservables(this, 'MyStore', ['foo', 'bar'])
}
},
methods: {
...mapActions('MyStore', ['setFoo'])
},
mounted () {
console.log(this.foo) // 'hello world'
console.log(this.bar) // 'hello world!'
this.setFoo('abc')
}
})
如果项目使用了 vue-class-components
,可以使用 Observable
和 Action
装饰器
import Vue from 'vue'
import { Observable, Action } from 'vurx/lib/class'
import Component from 'vue-class-component'
@Component
export default class MyComponent extends Vue {
@Observable('MyStore') foo
@Observable('MyStore') bar
@Action('MyStore')
setFoo () {}
}
ctx
当前实例的this
module
模块名observables
需要映射的observable
和getter
module
模块名actions
需要映射的action
module
模块名name
映射的本地属性名mapFn
自定义getter
,参数是observable
module
模块名name
映射的本地属性名