改不了的昵称
改不了的昵称
  • 发布:2019-05-03 02:08
  • 更新:2021-09-01 14:54
  • 阅读:7240

【H5】uni-app的switch切换状态并更新checked变量后,返回上一页再进来,状态都又变成初始的了,BUG吗?

分类:uni-app

uni-app的H5项目,以下是示例代码,为什么切换状态并且更新了绑定变量的值,然后去访问其他页面,再返回这个页面的时候状态又变回初始值了呢?(期间无刷新)官方示例也是这样。

<switch class="uni-input" :checked="hadOpen" @change="bindOpen" />

data() {  
            return {  
hadOpen: false  
}  

methods: {  
bindOpen: function(e) {  
//其他操作  
if(e.target.value === true){  
    this.hadOpen = true;  
}else{  
    this.hadOpen = false;  
}  
}  
}
2019-05-03 02:08 负责人:无 分享
已邀请:
清净本然心

清净本然心

应该是bug,你可以试一下,
<switch checked=true></switch>
<switch checked=false></switch>
第2个值虽然设置成false,但状态依然是选中状态。而官方示例确实也能运行:
<switch checked></switch>
<switch></switch>
也即只能通过设置checked属性是否存在,来表示状态。希望官方尽快修复下。
不知楼主是否想到绕过的方法?

清净本然心

清净本然心

找到我的程序的原因了,上面的应该不是bug。
我是因为在使用uni.getStorageSync()读取checked值时,对于第一次读取由于还没有临时缓存,返回为空字符串,而当有值时是boolean型值,此时判断有问题。
你的问题应该是程序里的hadOpen的值在更改状态后未保存。也没有在onload或onready里将保存的值读取出来赋给hadOpen变量,因此每次返回此页面,都会使用data里的初始化值。

  • 改不了的昵称 (作者)

    bindOpen: function(e) {

    //其他操作

    if(e.target.value === true){

    this.hadOpen = true;

    }else{

    this.hadOpen = false;

    }

    }

    我这里是根据switch切换的状态直接对hadOpen赋值的,不是页面初次加载的时候,应该不存在未赋值的情况吧?

    而且,每次切换,并不是用的data里的初始值(false),而是页面初次加载从后端取到的值,比如,页面加载时后端取出来的hadOpen=true,switch 状态是ture,手动切换为false后,返回上一级页面,再进入该页面,状态还是初次加载时的true,而不是手动切换后的fasle。

    难道还要在onShow里面再赋值下,才能实现页面切换回来状态正确?这个操作就有点不合理了。

    2019-06-20 15:59

  • 5***@qq.com

    回复 改不了的昵称: 大佬,这个问题你是怎么解决的呢?菜鸟一个,求回复

    2019-07-25 17:32

  • 改不了的昵称 (作者)

    回复 5***@qq.com: 不知现在改了没,项目把这个去掉了。

    按大佬的说法,要根据实际状态值来设置包不包含checked,而不是控制checked的ture/false值,但是不能直接在switch里面这么做。

    临时解决办法就是写两个不同状态的switch,用v-if v-else来控制显示哪个好了。

    2019-07-25 17:38

花朝十二

花朝十二

只能通过设置checked属性是否存在,来表示状态,而不是通过 false\true 来控制,这个真的很难受。

  • 改不了的昵称 (作者)

    对哦,可以这样来设置!谢谢了

    只是false\true在初始值的时候有效,值切换+页面切换之后就失效这个真的难受

    2019-07-02 17:22

  • 花朝十二

    回复 改不了的昵称: false\true 只是表示他的状态,但是改变false\true 不能改变他的状态。

    2019-07-02 17:59

1***@qq.com

1***@qq.com

不要在@change里更新状态,在@change里更新checked绑定的值,通过watch的方式判断是否选中。

<switch :checked="openChecked" color="#11D5D1" @change="openfaceChange" />
watch: {
openChecked(n,o){
if(n) {
this.openface();
}
}
}
openfaceChange(e){
this.openChecked = e.detail.value;
},

  • 菜鸟ABC

    this.openface(); 这里你是怎么操作的?

    2019-12-24 15:14

  • 1***@qq.com

    回复 菜鸟ABC: 这只是另一个方法,跟这段逻辑没关联

    2020-01-13 13:15

d***@163.com

d***@163.com

这个不是bug,是因为你在切换页面的时候,该示例已经被销毁,你再次进入的时候checked是被初始化了的,所以你要在change事件的时候,重新赋值给checked,并且将它放在缓存里;onshow的时候从缓存获取一下赋值给checked,这样状态就保存下来了

该问题目前已经被锁定, 无法添加新回复