首先这里不得不吐槽下小程序的数组更新,直接通过 setData 替换整个数组只在开发者工具上有效果,放到真机上就完全失灵,这是一件很蛋疼的事情,不知道小程序官方团队的更新机制是什么,也没有去细看,猜测可能与引用类型有关系。

看了网上大都是指定修改数组对象里的某个元素值,如这样:

Page({
    data: {
        list: [{name: 'tom'}]
    },
    onLoad() {
        this.setData({[`list[0].name`]: 'jack'})
    }
})

PS:感觉这样处理非常麻烦,需要一个个遍历去处理,而且新数组与旧数组的长度可能还不一至,还要对比,想想就放弃了,也没真正测试出来效果来。

因为要做的是一个简单的页面,只有地图和列表,所以就另辟蹊径通过 redirectTo 去处理了,其就是想通过刷新页面去实现视图更新的,因为小程序没有直接的刷新页面API,所以就想着通过 reLaunchredirectTo 间接实现,不过 reLaunch 没效果,所以就确定了 redirectTo 加上参数实现的视图更新,说到这,其实这个和数组更新没有关系了,不过这确实是因为数组更新没效果引起的血案,只能通过其他方式来救场,相应的示例代码:

Page({
    data: {
        activeTab: '',
        list: []
    },
    onLoad(options) {
        if(options.tab) {
            this.setData({activeTab: options.tab})
        }
        this.getList()
    },
    changeTab(e) {
        wx.redirectTo({url: `/pages/index/index?tab=${e.currentTarget.dataset.tab}`})
    },
    getList() {
        wx.request({
            url: 'xxx',
            data: {
                tab: this.data.activeTab
            },
            success: res => {
                this.setData({list: res.data})
            }
        })
    }
})

最后虽然问题侧面解决了,但这不是正规的解决方式,而且有场景限制,所以还是希望官方看看能否优化数组的更新机制。

更多前端知识,请关注小程序,不定期有惊喜!

image.png


anchovy
1.9k 声望89 粉丝