收藏
回答

setData修改了数据,页面为什么没有更新?

// app.js
initAppData() {
    return new Promise((resolve, reject) => {
      this.getVersion().then(res => { // 版本
        console.log('版本:' + this.globalData.appletsVersion)
        if (res) this.getLocation().then(res => { // 经纬度
          console.log('经纬度:' + this.globalData.location.latitude + ',' + this.globalData.location.longitude)
          if (res) this.getStoreList().then(res => { // 门店
            console.log('门店:' + this.globalData.storeInfo.storeName)
            resolve(true)
          })
        })
      })
    })
  },
getLocation() {
    let that = this
    return new Promise((resolve, reject) => {
      wx.getLocation({
        type"wgs84",
        success(res) {
          var location = {
            latitude: res.latitude,
            longitude: res.longitude
          }
          that.globalData.location = location
          resolve(true)
        },
        fail(err) {
          // 获取经纬度失败
          reject(err)
        }
      })
    })
  },
  //获取门店列表
  getStoreList() {
    return new Promise((resolve, reject) => {
       resolve(true) // 涉及到接口调用,先直接resolve(true)
    })
  },
// 获取小程序版本
  getVersion() {
    return new Promise((resolve) => {
      resolve(true) // 涉及到接口调用,先直接resolve(true)
    })
  },


// index.js
const app = getApp()
onShow() {
    app.initAppData().then(res => {
      this.setData({ // 修改
        showDialog: true,
      })
      console.log(this.data.showDialog)
    })
  },
最后一次编辑于  2022-07-25
回答关注问题邀请回答
收藏

7 个回答

  • 卖女孩的小火柴
    卖女孩的小火柴
    2022-07-25

    给个建议,要么自己删减下上个代码片段,要么console.log标识下是哪里打印的;

    我现在只能看到你上面零零碎碎的代码,你可以看看你的initAppData是否有执行到then?

    从你回复2L的代码来看,你控制台打印的true是 this.globaldata.isReady的值,

    而你onShow里的console.log并未打印出来。

    换句话来说,根本不存在什么setData不生效,因为都没运行到。

    另外按你给出的代码逻辑上来说,

    如果第一次设定了this.globaldata.isReady 为true,后续就不会执行initAppData这个方法,那就不存在setData不生效的问题了。


    你要確定this.getVersion()/this.getLocation()/this.getStoreList() 是有進入到then裡面的。

    其次你可以這樣嘗試:

    initAppData() {
    	return new Promise((resolve, reject) => {
    		if(this.globalData.isReady){
    			console.log('initAppData isReady resolve')
    			resolve(true)
    		}else{
    			Promise.all([
    				this.getVersion(),
    				this.getLocation(),
    				this.getStoreList(),
    			]).then(res => {
    				console.log('initAppData resolve')
    				resolve(true)
    			}).catch(err => {
    				console.log('initAppData reject',err)
    			})
    		}
    	})
    }
    
    onShow() {
    	app.initAppData().then(res => {
    		this.setData({
    			showDialog: true
    		})
    		console.log('onShow initAppData',res)
    	})
    }
    


    你可以按上面的去嘗試下,

    如果打印了 initAppData isReady resolve,則代表之前已經初始化了,不重複執行。

    如果打印了initAppData resolve ,則代表你上面的那堆方法都返回了resolve,已經初始化成功了。

    如果打印了initAppData reject,則代表你上面的方法有產生失敗的,自行查看是哪個失敗。


    最後,排除了initAppData reject這個問題,看看是否打印了onShow initAppData,如果打印了看看界面是有有改變,沒有的話你還是上傳代碼片段吧

    2022-07-25
    有用 1
    回复 5
    • Liar
      Liar
      2022-07-25
      大哥,这样是否有遗漏?
      2022-07-25
      回复
    • 卖女孩的小火柴
      卖女孩的小火柴
      2022-07-25回复Liar
      依然沒能渲染到?
      2022-07-25
      回复
    • Liar
      Liar
      发表于移动端
      2022-07-25回复卖女孩的小火柴
      是的呢。
      2022-07-25
      回复
    • 卖女孩的小火柴
      卖女孩的小火柴
      2022-07-25回复Liar
      https://developers.weixin.qq.com/s/nLRJr0mD7sBg


      代碼片段,你自己看看和你的哪裡有差異。
      我這邊運行是沒問題的
      2022-07-25
      回复
    • 卖女孩的小火柴
      卖女孩的小火柴
      2022-07-25回复Liar
      你上面測試的結果我看了下,因為你截取的都是片段,沒辦法直接復現。


      從一開始的if(!app.globalData.isReady)這個開始,我猜測是因為isReady已經是true了,並且showDialog默認為false,所以界面顯示為false,而截圖中的console結果未必是onShow中的執行結果。
      第二個猜測是initAppData裡面並沒有執行到resolve,你這裡是匯集了3個不同的方法,均返回resolve時才會執行initAppData裡的resolve,只要有一個沒有執行resolve,最終也不會觸發到initAppData裡返回resolve。


      但你一開始給出的信息根本沒辦法對上面的猜測進行驗證,所以我才讓你再console的地方加上名字做標記。


      最後你上面的回復,理論上是已經執行了setData的,但是你後面回復說沒生效,這個暫時想不到問題是哪裡。


      按你的邏輯我也寫了個代碼片段,運行後一切是正常的,你也可以自己試試運行我那個代碼片段看看,如果你自己那個項目還是不行,我建議你是把流程抽離出來,寫個代碼片段,自己看一下是否可以,如果可以的話就檢查抽離前的業務代碼那裡出錯,如果抽離出來也是不行就把代碼片段放上來。
      2022-07-25
      回复
  • 茜茜又困了🐽
    茜茜又困了🐽
    2022-07-25

    看看能正常打印嘛?

    如何可以打印的话,这样写:

    wx.nextTick(() => {

    // 在这里面写赋值语句

    })

    2022-07-25
    有用 1
    回复 7
    • Liar
      Liar
      2022-07-25
      不行额
      2022-07-25
      回复
    • 茜茜又困了🐽
      茜茜又困了🐽
      2022-07-25回复Liar
      这样写,看看打印什么?
      2022-07-25
      回复
    • 茜茜又困了🐽
      茜茜又困了🐽
      2022-07-25回复Liar
      ... 不会连if语句都没进去吧?
      getApp().globalData.isReady的值一直为true
      你写一下else语句,在else里面随便打印个东西
      2022-07-25
      回复
    • Liar
      Liar
      2022-07-25回复茜茜又困了🐽
      似乎setData没有打印额。
      2022-07-25
      回复
    • 茜茜又困了🐽
      茜茜又困了🐽
      2022-07-25回复Liar
      一步步排查吧
      似乎没有进.then回调,你在.then随便打印个东西试试
      还有个问题
      onshow里面getApp().globalData.isReady的值是什么?我怀疑最一开始连if语句都没走
      2022-07-25
      回复
    查看更多(2)
  • Frank
    Frank
    2022-07-25

    教你个方法,可以查看下AppData里面showDialog的值啥,页面绑定的值就是啥

    2022-07-25
    有用
    回复
  • ⅴ
    2022-07-25

    initAppData里面是什么?方便给一下代码片段吗

    2022-07-25
    有用
    回复 2
    • Liar
      Liar
      2022-07-25
      2022-07-25
      回复
    • ⅴ
      2022-07-25回复Liar
      打个log看一下 有没有仅如onShow initAppData的.then里吧
      2022-07-25
      回复
  • dreamhunter
    dreamhunter
    2022-07-25

    wxml 代码呢

    2022-07-25
    有用
    回复 1
    • Liar
      Liar
      2022-07-25
      很简单,就绑定了一下。
      2022-07-25
      回复
  • 大傻春
    大傻春
    2022-07-25

    setdata是异步的

    2022-07-25
    有用
    回复
  • ᝰꫛꫀꪝ .
    ᝰꫛꫀꪝ .
    2022-07-25

    你定义了that = this,你应该log that.data.showDialog

    2022-07-25
    有用
    回复 1
    • Liar
      Liar
      2022-07-25
      指向是一样的,我怀疑过指向问题所以定了that = this试一下
      2022-07-25
      回复
登录 后发表内容