为了账号安全,请及时绑定邮箱和手机立即绑定

vue 自动更新父组件数据的问题

vue 自动更新父组件数据的问题

小唯快跑啊 2019-03-13 13:45:59
我又一个父组件A和一个子组件B父组件代码<div class="item-content"> <Button   style="height:40px;"   type="dashed"   icon="ios-add"   @click="addQuestion">添加问题</Button> <choose-question   ref="choosequestion"   :showchoosequestion="showChooseQuestion"   :cancelquestion="cancelQuestionId"   @questionlist="getQuestionList"   @cancel="addQuestionCancel" /> <div class="question">   <span     v-for="item in addedQuestionList"     :key="item.id"><em>{{ item.title }}</em>     <Icon       type="ios-close"       color="#666666"       @click="cancelQuestion(item.id)" />   </span> </div>   </div>子组件choose-question中 是一个iview的table组件 全选表格所有项目并且点击确定的时候会触发questionlist方法 同时把选中的数据传给父组件,父组件更新 addedQuestionList 的值 从而循环展示出来选择的数据。但是现在我只触发全选的时候 父组件就更新了 addedQuestionList 的值 并没有点确定,全选事件里并没有触发questionlist方法,为什么父组件的addedQuestionList值就被改变了?我跟了断点 看到 vue自己执行了 watch.run方法后 数据就变了,可我也没有 watch addedQuestionList这个方法。子组件触发全选代码select (selection) {  this.questionData.push(...selection)  const obj = {}  const l = this.questionData.reduce((cur, item, index) => {  if (!obj[item.id]) {      obj[item.id] = true      cur.push(item)    }  return cur   }, [])  this.questionData = l }子组件点击确定代码ok () {  this.$emit('questionlist', this.questionData)  this.$emit('cancel', false) }感谢您的关注,谢谢您的回答。
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

你的子组件与父组件是在一个页面吧,其实,我们在写代码的时候有一个误区,官方的解释是子组件不会改变父组件的值,但是前提是你的子组件与父组件不在同一个页面内写的,如果在,子组件与父组件关联的字段也会同步更新,解决的办法是,你在子组件中接收的时候使用this.table=JSON.parse(JSON.stringify(接收的数据))转译一下,个人建议,以后写组件尽量分开写。

查看完整回答
反对 回复 2019-03-13
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

你的this.questionData是不是父组件传入子组件的
如果是那就是引用传值,引用传值是会同步更新的
楼上这种深度克隆的方法可以解决这个问题

查看完整回答
反对 回复 2019-03-13
  • 2 回答
  • 0 关注
  • 736 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信