vue中子组件修改父组件中的数据产生的问题(vue组件中数据流的单向性)

背景

当你的父组件中包含一个子组件,你需要通过子组件修改父组件中的数据的时候,应该怎么做,这么说有点抽象,举个具体的例子:当你有一个记事本,父组件中有一个数组数据,里面装着的是你今天需要完成的任务,然后子组件就是每个任务,父组件通过数组使用v-for循环出所有任务,然后你点击子组件中的删除部分,就可以删除父组件中数组的元素,进而删除一个任务,那么你该如何做呢?

例图
在这里插入图片描述

思路

我带你走一遍思路:

1.首先,你要做的第一步,就是在子组件里面的删除节点添加点击事件,点击后实现该整行组件的删除
2. 如何删除整行数据呢?根据vue的特性,数据驱动页面,我们是不是只需要将父组件里面的任务数组里对应的元素删掉,页面就会自动刷新,这个任务就没了,那么就直接将父组件中的数组传给子组件,子组件使用props接受,然后你在点击事件里面修改删除数组元素即可
3. 但是如果你这么做了,就会出问题,发现会报错,why?这就是这篇博客主要的目的,引出问题:子组件无法修改父组件中的数据,这就是组件中数据流的单向性:父级向子级传递的数据,父级更改,子级也会更改,但是子级不能更改,会报错
4. 那么如何解决呢?我们就需要破坏数据流的单向性,使用vue官方提供的方法,自定义事件:在子组件的点击事件上调用相关方法,使用$emit()自定义事件发射给父级,然后监控这个自定义事件,父级就可以执行这个事件,调用相关的方法了。

例子
子组件中代码

// template中
<i class="iconfont icon-delete" @click="onDelete" />
......
// js中
methods:{
    onDelete(){
      this.$emit("onDelete")
    }
  }

父组件中代码

// template中
<TodoItem v-for="(todo, index) in todos" :key="index" :todo="todo" @onDelete="delItem(index)"/>
......
// js中
methods:{
    delItem(index: number) {
      this.todos.splice(index, 1);
      this.dump();
    }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,子组件直接修改组件数据是不被推荐的,因为Vue遵循单向数据流的原则。但是,你可以通过使用自定义事件来实现子组件组件传递数据的目的。 具体步骤如下: 1. 在组件定义一个数据属性,例如`parentData`。 2. 在子组件,通过`$emit`方法触发一个自定义事件,并传递需要传递给组件数据。例如:`this.$emit('eventName', childData)`。 3. 在组件监听子组件触发的自定义事件,并在触发事件时执行相应的方法。例如:`@eventName="updateParentData"`。 4. 在组件的方法`updateParentData`,将子组件传递的数据赋值给组件数据属性`parentData`。 下面是一个简单的示例代码: ```vue <template> <div> <p>Parent Component: {{ parentData }}</p> <ChildComponent @eventName="updateParentData"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: '' } }, methods: { updateParentData(childData) { this.parentData = childData; } } } </script> ``` 在子组件,可以通过调用`$emit`方法来触发自定义事件: ```vue <template> <button @click="updateParentData">Update Parent Data</button> </template> <script> export default { methods: { updateParentData() { const childData = 'Child component data'; this.$emit('eventName', childData); } } } </script> ``` 通过以上方式,子组件就可以通过触发自定义事件,将数据传递给组件修改组件数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值