第一次在公司里负责作小程序,由于第一次作怕遇到大坑,因此用的原生开发。页面数据共享比较经常使用,因此来研究研究。
1、上来建个文件夹把redux相关的代码丢上去。git
//createStore.js export default function createStore(reducer, preloadedState, enhancer) { //放中间件用 其实就是在enhancer里调用createStore 并修改dispatch if (enhancer && typeof enhancer === 'function') { return enhancer(createStore)(reducer, preloadedState) } //初始state赋值 let state = preloadedState; let listeners = []; const getState = () => state; //触发动做 const dispatch = (action) => { state = reducer(state, action); listeners.forEach(listener => listener()); }; //添加监听器,无非加些有setData的方法进去 const subscribe = (listener) => { listeners.push(listener); return () => { listeners = listeners.filter(l => l !== listener); } }; //初始化 dispatch({}); return { getState, dispatch, subscribe }; }
具体代码能够看代码地址
对于redux不太理解的同窗能够看看其它文章。有不少高手写,我这个菜鸟就不写了:)redux
2、把store 存到app.js里小程序
import store from './store/index.js' import bindActionCreator from '/store/hcyRedux/bindActionCreator.js' App({ globalData: { store, bindActionCreator //方便dispatch } })
3、建actionpromise
// /action/page2 import * as types from '../action-types' //建立 action的函数 export default { change(obj) { return { type: 'page2/' + types.INPUT, payload: obj } }, promiseChange(obj) { return { type: 'page2/' + types.INPUT, payload: new Promise(function (resolve, reject) { setTimeout(function () { resolve(obj) }, 1000) }) } } } // /action/page1 import * as types from '../action-types' //建立 action的函数 export default { change(obj) { return { type: 'page1/' + types.INPUT, payload: obj} } }
4、建reducer微信
import * as types from '../action-types' const head = 'page2/' const defaultValue = { input1: 4, input2: 5, input3: 6 } export default function (state = defaultValue, action) { switch (action.type) { case head + types.INPUT: return { ...state, ...action.payload }; default: return state } }
这是page2的page1也差很少app
这样子无论什么页面能够经过app.globalData.store.getState()想怎么取值均可以了。
固然每一个页面的onload 和 onUnLoad 都必须添加和删除监听(就是setData)这样dispatch 以后页面才会渲染。框架
这样基本就完成了。但我不想每一个页面都添加删除监听。能够这么干。函数
// 本身封装了一个mini-redux.js const app = getApp(); const store = app.globalData.store; //获得一个{page1:{。。。},page2{。。。}}这样一个对象 function getData (obj) { let res = {} obj.pages.forEach(x => { res[x] = store.getState()[x] }) return res } export default function (obj) { let listener = null; let res = {}; this.action = obj.action.map(x => app.globalData.bindActionCreator(x, store.dispatch)); this.store = store return { ...obj, data: getData(obj), onLoad: function () { listener = store.subscribe(() => { this.setData(getData(obj)) }) store.dispatch({}) obj.onLoad && obj.onLoad(); }, onUnload() { listener(); obj.onUnload && obj.onUnload(); } } }
page2页面优化
<view class="page-section"> <view class="weui-cells__title">{{page2.input1}}</view> <view class="weui-cells weui-cells_after-title"> <view class="weui-cell weui-cell_input"> <input class="weui-input" placeholder="test" value="{{page2.input1}}" bindinput="bindKeyInput" data-key="input1" /> </view> </view> </view> <view class="page-section"> <view class="weui-cells__title">{{page2.input2}}</view> <view class="weui-cells weui-cells_after-title"> <view class="weui-cell weui-cell_input"> <input class="weui-input" placeholder="test" value="{{page2.input2}}" bindinput="bindKeyInput" data-key="input2" /> </view> </view> </view> <view class="page-section"> <view class="weui-cells__title">{{page2.input3}}</view> <view class="weui-cells weui-cells_after-title"> <view class="weui-cell weui-cell_input"> <input class="weui-input" placeholder="test" value="{{page2.input3}}" bindinput="bindKeyInput" data-key="input3" /> </view> </view> </view> <text>{{page1.input1}}</text> <navigator url="/pages/page2/page2"> <button type="primary"> 2 </button> </navigator>
page2.jsui
import actions1 from '../../store/actions/page1.js' import actions2 from '../../store/actions/page2.js' import V from '../../utils/mini-redux.js' const page = {} Page(V.call(page,{ action: [actions1, actions2], //定义好用那些action pages:['page1', 'page2'], //定义好须要用那些store 是在reducer/index.js 定义的 bindKeyInput(e) { //action[0] 就是actions1 page.action[0].change({ [e.target.dataset.key]: e.detail.value }); page.action[1].promiseChange({ [e.target.dataset.key]: e.detail.value }); }, onShow() { console.log('show2') }, onLoad () { console.log('load2') } }))
具体代码能够看代码地址
仍是有些问题 每次dispatch 会触发页面栈的全部页面的监听,页面能够直接setData store 等等。这些地方应该还能够优化。