-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
data的数据在页面销毁时候不会初始化 #300
Comments
目前暂时的解决方案是:
希望能过改进 的问题: |
同遇到了这个坑,页面卸载后vue组件没有destroyed,似乎每个page都是用的同一个vue实例,这样页面如果很多的情况下,会太耗内存吧? |
期待尽快解决这个问题, onUnload里处理只能解决这个页面不重复进入的情况。 |
复议 |
1 similar comment
复议 |
复议 |
这个问题不是wepy的问题,是小程序自己的问题,wepy有同样的问题,可以取检索相关问题 |
我怎么没遇到,我在created中把isShowModal改成false啦,没有闪动啊... |
这是JS的对象存储问题造成的,之前在写个人基于小程序框架时遇到过同样的问题。小程序在使用初始化数据时进行了深度Copy,因此我们在页面生命周期内对原生小程序上的data字段的任何操作,都是不会修改源数据的。而mpvue对小程序的管理过程中,其实是与小程序进行了JS对象数据共享,但是mpVue并没有进行初始化数据的深度copy,而是直接操作源数据。小程序页面在销毁后,mpvue没有做到数据还原,这就造成了两方初始数据异同的问题。页面在下一次初始化时所调用的初始化数据对象是来自mpvue的,而mpvue的数据对象是在上一次使用更新后遗留下来,这就让小程序使用了已更新后的数据进行页面初始化,导致我们看到的关闭后再次打开页面数据还是上一次的问题。如果mpvue能及时响应小程序的页面初始和结束生命周期,对初始数据进行备份和恢复,那就perfect了。 |
注意,不要将数据初始化放到created钩子下,created钩子只会执行一次,页面重开是不会执行它滴。 |
@JasonDRZ 不需要另外存一份,vue2 开始通过 this.$options.data() 就可以拿到 data 的初始值了 |
@JasonDRZ 对一个page需要同时打开多次的情况还是不行的,比如从一个A用户详情页打开另一个B用户详情页,从B 回退的到A的时候就有问题了,因为这时A并不会再次mounted 这种情况我们是暂时这样处理 const dataStack = []
export default {
onLoad() {
dataStack.push({...this.$data}) // 备份
// 其他初始化.....
},
onUnload() {
// 其他清理....
Object.assign(this.$data, dataStack.pop()) //恢复
}
} |
@F-loat 恩恩,是的,突然忘记了。 |
@rchunping 针对这个问题我这边用了一个全局的mixin方法来处理,这样就不需要每个页面都进行数据备份和恢复的处理了,不需要进行处理的页面标识一下就OK,代码如下: |
如果我没理解错的话 data()里只有"初始"数据吧,那些异步加载过来后来塞进去的怎么处理呢? |
@rchunping 如果你是要保存异步数据的话,就另当别论了,这个方法只是为了将页面数据重置到初始状态。 |
长期跟踪这个issue |
感觉小程序有返回的页面都是属于不销毁的那种,不仅仅是数据,在返回到该页面的时候:created因为是小程序的整合变成一次性执行,mounted也只执行一遍,所以页面是保留下来的啊。。所以这个问题怎么解决呢?vue是返回也会重新渲染的呢,起码created和mounted都会再执行 |
复议 |
@rchunping Cannot set property $data of #<Vue$3> which has only a getter |
复议 |
1 similar comment
复议 |
@JasonDRZ 不要截图哇,```js 贴源码多好。。 |
同页面的不同数据栈求解决 |
综上,可以在 export default {
data() {
return {
index: 1,
isShowModal: false,
isScroll: true,
};
},
onLoad() {
Object.assign(this, this.$options.data());
},
}; |
因为页面根本没有销毁 |
关注 |
onLoad() { |
这样会不会更好 |
如我所想 |
在unload时强行销毁,目前看来没大问题…… |
[在vue文件中,data的数据参数是true & false,页面销毁后无法进行初始化]
当把this.isShowModal = true 之后,返回上一页面后再回来,isShowModa 还是true
The text was updated successfully, but these errors were encountered: