关于vue子组件改变父组件传递的值的问题

64 篇文章 1 订阅

正常对于vue父子组件来说子组件是不能改变父组件props过来的值的,但是今天在做项目的时候发现了一个有意思的事情,子组件是可以直接通过改变props的值来改变父组件相对应数据的值的。

这里我们将props的值的类型分为3种(字符串,数组,对象)

先说对象吧

子组件直接改变父组件props过来的对象是可以直接更新父组件的数据的而且不会报错。

子组件:
<template> 
<div class="hello"> 
{{msg.test}}
 <input type="text" v-model="msg.test" placeholder="子组件input"> 
</div> 
</template> 
<script> export default { 
name: 'HelloWorld', 
props: { msg: Object }
 } 
</script>
父组件
<hello :msg="msg"></hello>
 <div></div> 
<div>{{msg.test}}</div>

data() { 
return { 
name: null, 
sex: null,
 url: null,
 msg: { test: '你好' } 
} 
},

数组也是没有问题的

子组件
<template>
  <div class="hello">
    <div @click="deleteItem(index)" v-for="(item,index) in msg">{{item}}</div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: Array
  },
  methods: {
    deleteItem (index) {
      this.msg.splice(index,1)
      console.log('删除了一个')
    }
  }
}
</script>
父组件
<hello :msg="msg"></hello>
<div v-for="(item,index) in msg">{{item}}</div>

data() {
      return {
        name: null,
        sex: null,
        url: null,
        msg: [1,2,3,4,5,6,7]
      }
    },

字符串前面数组和对象都是没问题的但是到了字符串却会报错

子组件
<template>
  <div class="hello">
    <div>
      子组件的:<input type="text" v-model="msg">
      <div>子组件的:{{msg}}</div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>
父组件
<div>
   父组件的:<input type="text" v-model="msg">
   <div>父组件的:{{msg}}</div>
</div>
data(){
   return{
       msg: '你好'
   }
}

当通过父组件改变msg的时候是完全没有问题的,但是当想通过子组件直接改变父组件传过来的msg却报了上面的错误。
大致的意思是避免直接改变道具,因为只要父组件重新渲染,该值就会被覆盖。 而是根据prop的值使用数据或计算属性。 支持变异:“msg”。

没错我的英语不可能这么好,我是用的翻译软件o(╥﹏╥)o

字面意思很清楚了解决办法是将msg赋值给一个子组件自定义的参数,然后通过这个自定义的参数来改变子组件msg(不能改变父组件的)
又或者是通过$emit和$on来改变父组件msg的值https://blog.csdn.net/qq_40816649/article/details/83274198

总结

以后如果再碰到类似,父组件传对象或者数组值到子组件中进行更新,然后将改变的值返回父组件的场景时,可以不用$emit和$on这种方式来实现了,直接改变数据就行了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Vue中,组件通过props属性接收组件传递,一般情况下,组件不能直接改变组件传递prop。但是可以通过使用.sync修饰符来实现数据的双向绑定,从而可以在组件改变组件。 具体实现步骤如下: 1. 在组件中声明需要传递组件,并将其绑定到组件prop上。 2. 在组件中声明对应的prop,并使用.sync修饰符进行双向绑定。 3. 在组件中可以直接修改这个prop的。 示例代码如下: 在组件中: ```javascript <template> <div> <ChildComponent :value.sync="propValue"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { data() { return { propValue: '组件', } }, components: { ChildComponent, } } </script> ``` 在组件中: ```javascript <template> <div> <input v-model="innerValue" /> <button @click="changePropValue">改变组件</button> </div> </template> <script> export default { props: { value: { type: String, default: '', }, }, data() { return { innerValue: this.value, } }, methods: { changePropValue() { this.$emit('update:value', this.innerValue) } }, } </script> ``` 通过在组件中使用.sync修饰符来实现数据的双向绑定,可以在组件中直接修改组件传递,从而实现vue组件改变组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue 组件改变组件](https://blog.csdn.net/c_qianxia5040/article/details/109642061)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue组件改变组件传递prop通过sync实现数据双向绑定(DEMO)](https://download.csdn.net/download/weixin_38565003/12928609)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值