【vue3】子组件修改父组件传过来的props数据

前言

最近新项目用vue3搭建的,准备开始使用vue3的语法,从这篇开始记录下vue3遇到的一些问题和一些语法的使用方法,以便于以后复习,也可能帮助到一些小伙伴。

1. 修改父组件普通数据

使用v-mode语法,代替了vue2.x的.sync修饰符

  1. 父组件用ref() 定义一个普通数据为响应式变量,例 var test = ref(‘parent’)
  2. 父组件用v-mode将数据绑定到子组件上
   <ChildComponent v-model:test="test" />

其实它是以下的简写:

<ChildComponent :test="test" @update:test="test = $event" />
  1. 子组件
    子组件使用emit修改父组件数据
//ChildComponent 
   props: {
    test:String     //接收父组件数据
  },
  emits: ['update:test'],      //定义组件可触发的事件
  setup(props,ctx){
    function onClick() {
      ctx.emit('update:test','child')
    }
  }

相关vue3文档

2. 修改父组件复杂数据(对象)

在vue2.x中,子组件虽然不能修改父组件传过来的普通数据,但是可以直接操作复杂数据,但是vue3不行。目前我只能用类似vue2的语法来解决修改父组件对象数据的问题,如有哪位大佬有更好的办法,还希望评论区指教!!!

  1. 父组件reactive定义一个对象为响应式数据,并绑定到子组件上,例如
<ChildComponent :obj="obj" @update:obj="updateObj" />

const obj = reactive({
  key: 'test'
})
  1. 父组件定义一个修改数据的方法
function updateObj(params){
  obj.key = params
}
return{
  updateObj
}
  1. 子组件emit定义一个可触发的事件
//ChildComponent 
   props: {
    obj:Object     //接收父组件数据
  },
  emits: ['update:obj'],      //定义组件可触发的事件
  setup(props,ctx){
    function onClick() {
      ctx.emit('update:obj','child')
    }
  }

最后

我试过用第一种修改普通数据的方式修改父组件对象,但是发现没有效果,好像是reactive定义的响应式数据,用v-model绑定后就被覆盖成普通对象了,不知道是不是,望vue3大佬指教!

Vue3中,组件可以使用 `defineProps` 来声明props,同时可以使用 `defineEmits` 来声明事件,通过事件来修改组件数据。 在组件中,你可以使用 `watch` 监听props的变化,然后通过 `$emit` 触发自定义事件将修改后的数据传递给组件。 具体步骤如下: 1. 在组件中使用 `defineProps` 声明需要接收的prop,例如: ``` import { defineProps } from 'vue'; export default { props: defineProps({ count: Number }) } ``` 2. 在组件中使用 `watch` 监听props的变化,例如: ``` import { watch } from 'vue'; export default { props: defineProps({ count: Number }), setup(props) { watch(() => props.count, (newValue, oldValue) => { // 根据需要修改props数据 props.count = newValue + 1; // 触发自定义事件将修改后的数据传递给组件 emit('update:count', props.count); }); } } ``` 3. 在组件中使用组件时,传递需要修改props数据和自定义事件,例如: ``` <template> <div> <child-component :count="count" @update:count="count = $event"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { count: 0 } } } </script> ``` 上述代码中,组件将 `count` 作为props传递给组件,并监听组件触发的 `update:count` 事件,将传递的数据赋值给 `count`。当组件监听到 `count` 发生变化时,会触发 `update:count` 事件将修改后的数据传递给组件。这样就实现了组件通过自定义事件修改组件传过来props数据的功能。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端阿彬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值