有问
有问
  • 发布:2020-11-29 14:53
  • 更新:2021-04-06 11:22
  • 阅读:5414

父组件向子组件里的props动态传值出现错误提示的解决办法

分类:uni-app

子组件定义了data,但在父组件里直接:val动态传值发现失败。
如果直接向props动态传值又出现下面的错误提示,虽然也能改变,但是比较烦人。
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"

解决办法如下,APP测试通过:

第0种【推荐】
用watch监听prpos里的值,来改变data里的内容
可以向子组件派发事件来操作,通过父组件使用@setdd="setval(2)",改变vueval来改变自定义组件值

data:{  
return {  
 dd:1  
}  
},  
prpos:{  
  setdd:{  
                type: String,  
                default: 'center'  
            }  
},  
watch: {  

setdd: {  
              immediate: true,  
              handler: function(val) {  
                let that=this;  
                console.log("监听")  
                that.dd= val;  
              }  
            }  
}  

以下方法也能用,只是有些地方可能不能满足
第1种,V-BIND动态传值

子组件
<input :type="type" v-model="vals" @input="inputin" class="put" disabled/>
props: {
vals: {
type: [Number],
default: 0
}
}
父组件可以直接
v-bind:vals="item.num"

第2种,不直接更改,内部消化。
子组件
<input :type="type" v-model="val" @input="inputin" class="put" disabled/>
data(){
return{
val:1
}
},
props: {
vals: {
type: [Number],
default: 0
}
}
在生命周期里:
created() {
let that=this;
if(that.vals){
that.val=that.vals;
}
},

父组件:
<child @input="buynumin" :vals="item.num"></child>
通过间接更改val更改子组件data内的数值。

第3种:
有同学使用REFS,当然也可以,但是REFS缺点只能在初始化的时候获取,而且需要延迟,不是必须要用到内部方法,可以不考虑。
但若因为过多的派发事件导致卡顿,也可考虑REFS。

0 关注 分享

要回复文章请先登录注册

有问

有问 (作者)

回复 降龙十八掌 :
一般是先设置个默认值,在接口没返回前用LOADING遮住,返回后再更新它。否则总归是要出现这个执行顺序的问题的。
2021-04-06 11:22
降龙十八掌

降龙十八掌

静态数据可以,,,如果是接口就不行了。。接口数据还没请求到,,组件都已经执行,,,结果始终接收到的值是空的。。。楼主大咖用那种解决方案比较好
2021-03-31 16:49
有问

有问 (作者)

回复 zhibowangluo :
是的。
2021-01-04 11:42
zhibowangluo

zhibowangluo

自组件
show:{
type:Boolean,
default:false
},

isshow:false,

watch: {
show: {
handler(newVal) {
if (newVal) {
this.open_click();
} else {
this.close_click();
}
},
immediate: true
}

},

open_click(){
this.isshow=true;
},
close_click(){
this.isshow=false;
},


父组件 <time-selector ref="timeselector" @selectTime="selectTimeEvent" startTime="09:00" endTime="22:00" selectedTabColor="#FD5B51" selectedItemColor="#FD5B51" :show="isshow" timeSlot="0" timeInterval="0.5" ></time-selector>

isshow:false,

open_click(){
this.$refs.timeselector.open_click();
},

解决问题
2021-01-04 11:26
有问

有问 (作者)

回复 zhibowangluo :
你用我上面写了第0种方法,试过应该没问题。
2020-12-31 17:42
有问

有问 (作者)

回复 zhibowangluo :
这个就是我在说的prop属性的问题,prop一般做为私有属性用的,需要改变的变量要放在data里。我上次是用v-bind来传input的val的初始值的,但发现后面第二次动态赋值的时候还是会有问题。VUE即时更新有时候还是不太好用,要换种思路。
或者你可以用uni.emit事件试试。
2020-12-31 17:03
zhibowangluo

zhibowangluo

父组件 :isshow="isshowb" 点击 isshowb变true, 子组件v-model="isshow" isshow:{
type: Boolean,
default:false
} 点击第一次弹出层会出来 第二次就报Avoid mutating a prop错 点击isshowb也改变不了 大佬们怎么破!
2020-12-31 15:54
有问

有问 (作者)

回复 树恒 :
好的。有空可以研究一下。尚未对那个插件进行具体分析,上次用ref发现临时改变也不太好用。目前只做的APP,bind可用,但官方手册上说尽量不要用bind。
2020-12-18 21:32
[已删除]

[已删除]

只缺前端的可找我;
整个项目外包也可找我;
wx、tel(13070273424);
代码很规范、可维护;
经验丰富,做过许多类型,可加微信了解;
2020-12-10 10:17
树恒

树恒

这种情况可以试试按官方pupop插件的处理方式,父组件调用子组件方法的方式来实现
2020-12-10 10:11