• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
    電話(huà)圖標(biāo) 余先生:13699882642

    網(wǎng)站百科

    為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

    關(guān)于原生小程序頁(yè)面間數(shù)據(jù)傳送的研究

    發(fā)表日期:2019-11 文章編輯:小燈 瀏覽次數(shù):4773

    第一次在公司里負(fù)責(zé)做小程序,因?yàn)榈谝淮巫雠掠龅酱罂?,所以用的原生開(kāi)發(fā)。頁(yè)面數(shù)據(jù)共享比較常用,所以來(lái)研究研究。
    
    1. A頁(yè)面直接url傳參 B頁(yè)面onload里接收。這種簡(jiǎn)單粗暴但B如果還想給A傳參感覺(jué)不太方便。而且傳一個(gè)很大的對(duì)象過(guò)去,必須要stringfy。但是地址長(zhǎng)度有限所以會(huì)有bug
    2. 直接wx.setStorage 簡(jiǎn)單粗暴,直接存微信本地。有時(shí)候我并不想存太久,只是臨時(shí)的數(shù)據(jù)也給我存本地了感覺(jué)怪怪的。
    3. getCurrentPages() 這個(gè)可以拿當(dāng)前的頁(yè)面棧,通過(guò)他來(lái)那上一個(gè)頁(yè)面,上上個(gè)頁(yè)面的信息。有時(shí)候一個(gè)頁(yè)面說(shuō)不定有很多種進(jìn)入途徑,也不知道上個(gè)頁(yè)面是啥,用起來(lái)也有點(diǎn)怕怕的。
    4. app.globalData 里存一個(gè)臨時(shí)數(shù)據(jù)比如payload:null,當(dāng)要A頁(yè)面要傳參時(shí)改變payload值,然后B頁(yè)面獲取到后置為null。我一般就這么搞感覺(jué)還行。
    5. 有米有什么更好的方法呢,我發(fā)現(xiàn)現(xiàn)在的小程序框架都是有狀態(tài)管理的,要不我也整個(gè)。我就研究了下,抄個(gè)乞丐版的redux放在小程序里用用。以下為代碼。

    一、上來(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é)可以看看其它文章。有很多高手寫(xiě),我這個(gè)菜鳥(niǎo)就不寫(xiě)了:)

    二、把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)該還可以?xún)?yōu)化。


    本頁(yè)內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過(guò)網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶(hù)學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁(yè)中由涉嫌抄襲的內(nèi)容,請(qǐng)及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.juherenli.com/25242.html
    相關(guān)小程序
     八年  行業(yè)經(jīng)驗(yàn)

    多一份參考,總有益處

    聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費(fèi)獲得網(wǎng)站建設(shè)方案及報(bào)價(jià)

    咨詢(xún)相關(guān)問(wèn)題或預(yù)約面談,可以通過(guò)以下方式與我們聯(lián)系

    業(yè)務(wù)熱線(xiàn):余經(jīng)理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    久久亚洲国产精品| 精品大臿蕉视频在线观看| 国产国产成人久久精品杨幂| 99精品国产高清一区二区三区 | 国产精品福利在线播放| 日本加勒比久久精品| 人妻少妇精品视频二区| 激情啪啪精品一区二区| 亚洲欧美国产精品专区久久| 亚洲日韩精品无码专区网址| re99热久久这里只有精品| 久久久久久久精品妇女99| 国产91精品一区二区麻豆亚洲| 精品国产一区二区三区不卡| 久久精品中文字幕有码| 久久精品网站免费观看| 亚洲AV无码久久精品色欲| 国产精品中文字幕在线| 正在播放国产精品放孕妇| 久久最新精品国产| 精品91一区二区三区| 最新国产精品自在线观看| 666精品国产精品亚洲| 日韩精品少妇无码受不了| 久久99精品综合国产首页| 国产精品jvid在线观看| 精品国产一区二区三区免费看| 99久久久国产精品免费牛牛| 精品国产午夜肉伦伦影院| 国产成人精品日本亚洲语音| 久久亚洲私人国产精品vA| 亚洲高清专区日韩精品 | 热re99久久6国产精品免费| 久草精品视频在线播放| 国内精品91最新在线观看| 国语精品一区二区三区| 无码人妻一区二区三区精品视频| 国产精品2018| 亚洲国产精品日韩| 狠狠入ady亚洲精品| 日本精品卡一卡2卡三卡|