小程序开发有时不免也会遇到复杂的业务场景,例如跨页面的数据传递,非父子组件的数据同步,多个子孙组件的数据复用等等,此时,global data或者triggerEvent/selectComponent已经没法很好地提供支持,相反,它们会致使业务逻辑代码和模板代码迅速膨胀到难以阅读和维护,同时也容易产生难以追踪的bug隐患。 react
redux做为一个已经被熟知且普遍应用到react项目中的状态管理方案,能够很好地帮助咱们解决此类问题。这也就是mp-redux的来源,为了下降额外的理解或学习成本,使用方式及API与react-redux尽量地保持了一致。
git
附:redux repo github.com/reduxjs/red…
Providergithub
为App注入建立后的store
// app.js
import { createStore } from './lib/redux'
import rootReducer from './reducer/index'
import getInitialState from './getInitialState'
import { Provider } from './lib/mp-redux'
App(
Provider(createStore(rootReducer, getInitialState()))({
// ...app config
})
)复制代码
绑定小程序页面
import { add } from './actions'
import { connect } from '../lib/mp-redux'
const mapStateToProps = state => ({
num: state.num
})
const mapDispatchToProps = {
add
}
Page(
connect(mapStateToProps,mapDispatchToProps)({
// ...page config
customClick() {
this.add(1)
}
})
)复制代码
绑定小程序自定义组件,用法与connect类似,区别在于一个用于绑定页面,一个用于绑定组件
import { minus } from './actions'
import { connectComponent } from '../../lib/mp-redux'
const mapStateToProps = state => ({
num: state.num
})
const mapDispatchToProps = {
minus
}
Component(
connectComponent(mapStateToProps,mapDispatchToProps)({
// ...component config
methods: {
customClick() {
this.minus(2)
}
}
})
)复制代码
对于使用react的项目,咱们在渲染函数中能够自行处理组件接收到的props,例如文本转换,数据格式化等等,而在小程序中,逻辑层与视图层分离,且没有提供类computed的计算属性API,所以若是须要在setData以前,自定义处理发生变动的数据无疑是一件很麻烦的事,mp-redux提供了watch,能够帮助监听到state指定字段的变动而且将setData权限交还给开发者。web
const mapStateToProps = state => ({
num: state.num
})
Component(
connectComponent(mapStateToProps)({
// ...component config
watch: {
num(newVal, oldVal){ // 与maped state属性同名,当num发生变动时会调用此函数,并传入新的值与旧的值
this.setData({ // 注意,此时setData不会再自动触发,由开发者自行对数据处理后调用
num: newVal * 10
})
}
}
})
)复制代码
连接地址redux
小程序示例代码:mp-redux demo小程序