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;
}
}
}
5 个回复
清净本然心
应该是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
不要在@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
这个不是bug,是因为你在切换页面的时候,该示例已经被销毁,你再次进入的时候checked是被初始化了的,所以你要在change事件的时候,重新赋值给checked,并且将它放在缓存里;onshow的时候从缓存获取一下赋值给checked,这样状态就保存下来了