Meituan-Dianping / mpvue

基于 Vue.js 的小程序开发框架,从底层支持 Vue.js 语法和构建工具体系。
http://mpvue.com
MIT License
20.42k stars 2.07k forks source link

页面navigateback以后再打开上一次获取的data还在 #634

Open KlarY opened 6 years ago

KlarY commented 6 years ago

页面navigateback以后再打开上一次获取的data还在 难道只能丑陋地手动重置data嘛?

lxyisme commented 6 years ago

如果想重置在back的时候清空数据的话可以在onShow内进行重置 Object.assign(this, this.$options.data())

shaonialife commented 6 years ago

@lxyisme 是不能在onShow里面重置的, 因为用户最小化再次进入也会走 onShow, 或者 屏幕熄灭然后有点亮也会走 onShow 的, 最好的方案是写一个 Vue Plugin, 通过 mixin 混入 onUnload 方法, 然后在里面写 Object.assign(this.$data, this.$options.data())

// 定义插件
const somePlugin = {
  install: function () {
    Vue.mixin({
      onUnload() {
        if (this.$options.data) {
            Object.assign(this.$data, this.$options.data())
        }
      }
    })
  }
}
// 使用插件
Vue.use(somePlugin)
lxyisme commented 6 years ago

@shaonialife navigateTo 是不会卸载页面的,所以是不会走onUnload, 这样的话 navigateBack 回的页面是不会初始化数据的哟,这种情况就得在 onShow 和 onHide 初始化数据,还有就是你这种写法是毁灭性的,每一个页面卸载都会调用,这样可不太好呐

shaonialife commented 6 years ago

@lxyisme 这么写就是为了模拟小程序原生表现, 页面卸载的时候数据回到初始状态, 我不希望用户再次进入该页面还能看到上一次的数据, 如果真要保存, 那也是存在 store 或者 通过wx.setStorage来保存数据, 如果我写在 onShow 里面, 那意味着我如果屏幕熄灭然后又点亮或者最小化后又重新进入, 数据肯定会被初始化, 造成数据丢失

shaonialife commented 6 years ago

navigateTo 是不会卸载页面, 那是因为开了一个新页面, 旧页面会走 onHide, 如果在 onHide 里面初始化数据, 那意味着用户再回来这个页面时, 数据已经丢失了. navigateBack 和 手动滑动返回都会卸载页面, 是会回调 onUnload 的, 在这个时候把数据清掉是最好时机

TomIsion commented 6 years ago

A 前往 B 页面 -> B 页面数据变化 -> 返回 A 页面 再进入 B 页面 -> 之前 B 页面的数据还在

这个需要框架解决一下 可能是内部做了相关的数据缓存?

limichange commented 6 years ago

@TomIsion https://github.com/Meituan-Dianping/mpvue/issues/140

alex-chan commented 6 years ago

mark

leanTim commented 6 years ago

a 页面 navigateto b页面 navigateback 返回a页面 b返回a页面还是能看到a页面之前的数据,表现为页面先闪一下,再请求新的数据render新的页面 onshow 和 onhide 都尝试过 Object.assign(this.$data, this.$options.data()) 是为什呢 @shaonialife @lxyisme

q310550690 commented 6 years ago

https://github.com/Meituan-Dianping/mpvue/issues/140#issuecomment-423457135

mpvue-bot[bot] commented 6 years ago

issue超过30天无更新或响应,7天后将自动关闭,如果问题状态有更新请及时更新issue