為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2019-11 文章編輯:小燈 瀏覽次數(shù):4481
第一次在公司里負(fù)責(zé)做小程序,因?yàn)榈谝淮巫雠掠龅酱罂?,所以用的原生開發(fā)。頁(yè)面數(shù)據(jù)共享比較常用,所以來(lái)研究研究。
一、上來(lái)建個(gè)文件夾把redux相關(guān)的代碼丟上去。
//createStore.js
export default function createStore(reducer, preloadedState, enhancer) {
//放中間件用 其實(shí)就是在enhancer里調(diào)用createStore 并修改dispatch
if (enhancer && typeof enhancer === 'function') {
return enhancer(createStore)(reducer, preloadedState)
}
//初始state賦值
let state = preloadedState;
let listeners = [];
const getState = () => state;
//觸發(fā)動(dòng)作
const dispatch = (action) => {
state = reducer(state, action);
listeners.forEach(listener => listener());
};
//添加監(jiān)聽(tīng)器,無(wú)非加些有setData的方法進(jìn)去
const subscribe = (listener) => {
listeners.push(listener);
return () => {
listeners = listeners.filter(l => l !== listener);
}
};
//初始化
dispatch({});
return { getState, dispatch, subscribe };
}
具體代碼可以看代碼地址
對(duì)于redux不太理解的同學(xué)可以看看其它文章。有很多高手寫,我這個(gè)菜鳥就不寫了:)
二、把store 存到app.js里
import store from './store/index.js'
import bindActionCreator from '/store/hcyRedux/bindActionCreator.js'
App({
globalData: {
store,
bindActionCreator //方便dispatch
}
})
三、建action
// /action/page2
import * as types from '../action-types'
//創(chuàng)建 action的函數(shù)
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'
//創(chuàng)建 action的函數(shù)
export default {
change(obj) {
return { type: 'page1/' + types.INPUT, payload: obj}
}
}
四、建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也差不多
這樣子不管什么頁(yè)面可以通過(guò)app.globalData.store.getState()想怎么取值都可以了。
當(dāng)然每個(gè)頁(yè)面的onload 和 onUnLoad 都必須添加和刪除監(jiān)聽(tīng)(就是setData)這樣dispatch 之后頁(yè)面才會(huì)渲染。
這樣基本就完成了。但我不想每個(gè)頁(yè)面都添加刪除監(jiān)聽(tīng)??梢赃@么干。
// 自己封裝了一個(gè)mini-redux.js
const app = getApp();
const store = app.globalData.store;
//得到一個(gè){page1:{。。。},page2{。。。}}這樣一個(gè)對(duì)象
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頁(yè)面
<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.js
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')
}
}))
具體代碼可以看代碼地址
還是有些問(wèn)題 每次dispatch 會(huì)觸發(fā)頁(yè)面棧的所有頁(yè)面的監(jiān)聽(tīng),頁(yè)面可以直接setData store 等等。這些地方應(yīng)該還可以優(yōu)化。
日期:2019-11 瀏覽次數(shù):5528
日期:2019-11 瀏覽次數(shù):11984
日期:2019-11 瀏覽次數(shù):4353
日期:2019-11 瀏覽次數(shù):5388
日期:2019-11 瀏覽次數(shù):5261
日期:2019-11 瀏覽次數(shù):7183
日期:2019-11 瀏覽次數(shù):5166
日期:2019-11 瀏覽次數(shù):15770
日期:2019-11 瀏覽次數(shù):4721
日期:2019-11 瀏覽次數(shù):6520
日期:2019-11 瀏覽次數(shù):5374
日期:2019-11 瀏覽次數(shù):4565
日期:2019-11 瀏覽次數(shù):10764
日期:2019-11 瀏覽次數(shù):8321
日期:2019-11 瀏覽次數(shù):5081
日期:2019-11 瀏覽次數(shù):4314
日期:2019-11 瀏覽次數(shù):8955
日期:2019-11 瀏覽次數(shù):4650
日期:2019-11 瀏覽次數(shù):4847
日期:2019-11 瀏覽次數(shù):4867
日期:2019-11 瀏覽次數(shù):4480
日期:2019-11 瀏覽次數(shù):5028
日期:2019-11 瀏覽次數(shù):10284
日期:2019-11 瀏覽次數(shù):5461
日期:2019-11 瀏覽次數(shù):5438
日期:2019-11 瀏覽次數(shù):4887
日期:2019-11 瀏覽次數(shù):12333
日期:2019-11 瀏覽次數(shù):7356
日期:2019-11 瀏覽次數(shù):7905
日期:2019-11 瀏覽次數(shù):4858
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.