zoukankan      html  css  js  c++  java
  • 子组件直接修改父组件通过props传来的值报错

     

    Vue 报错[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders

     

    方法一、

    子组件通过$emit传值到父组件中修改。

     

    原因:

     

    在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。

    Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。

     解决办法:

     

      原理:将要更改的值,传递给父组件,在父组件中更改,再传递给子组件

     

     步骤:

     

      先将值传递给子组件,子组件 props 接收并使用,然后通过 $emit 广播一个事件给父组件,并将值一并传递,父组件 @子组件广播过来的事件,并定义一个方法,在该方法中,改变传递过来的值,父组件又会将值传递给子组件,这样就形成了一个闭环,问题得以解决
     
     
     
    ************************************************************************************************************

    5、总结:

     父子组件传值时,父组件传递的参数,数组和对象,子组件接受之后可以直接进行修改,并且会传递给父组件相应的值也会修改。

    如果传递的值是字符串,直接修改会报错。

    不推荐子组件直接修改父组件中的参数,避免这个参数多个子组件引用,无法找到造成数据不正常的原因

     6、官网说明:

    https://cn.vuejs.org/v2/guide/components-props.html?

    所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

    额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    方法二:

    优雅更新props

    更新 prop 在业务中是很常见的需求,但在子组件中不允许直接修改 prop,因为这种做法不符合单向数据流的原则,在开发模式下还会报出警告。因此大多数人会通过 $emit 触发自定义事件,在父组件中接收该事件的传值来更新 prop

    child.vue:

    export defalut {
        props: {
            title: String  
        },
        methods: {
            changeTitle(){
                this.$emit('change-title', 'hello')
            }
        }
    }

    parent.vue:

    <child :title="title" @change-title="changeTitle"></child>
    export default {
        data(){
            return {
                title: 'title'
            }  
        },
        methods: {
            changeTitle(title){
                this.title = title
            }
        }
    }

    这种做法没有问题,我也常用这种手段来更新 prop。但如果你只是想单纯的更新 prop,没有其他的操作。那么 sync 修饰符能够让这一切都变得特别简单。

    parent.vue:

    <child :title.sync="title"></child>

    child.vue:

    export defalut {
        props: {
            title: String  
        },
        methods: {
            changeTitle(){
                this.$emit('update:title', 'hello')
            }
        }
    }

    只需要在绑定属性上添加 .sync,在子组件内部就可以触发 update:属性名 来更新 prop。可以看到这种手段确实简洁且优雅,这让父组件的代码中减少一个“没必要的函数”。

    转:https://www.cnblogs.com/pangchunlei/p/11139356.html

    转:https://mp.weixin.qq.com/s/2WonZaO_xK-MB5ANa8FvXA

     

  • 相关阅读:
    【转】UML中类与类之间的5种关系表示
    OSGI框架—HelloWorld小实例
    解决:“Workbench has not been created yet” error in eclipse plugin programming”,OSGI启动控制台报错问题
    Restful风格到底是什么?怎么应用到我们的项目中?
    Java程序员面试题集(1-50
    【转】Spring中@Component的作用
    【转】Spring AOP 实现原理与 CGLIB 应用
    【转】spring和springMVC的面试问题总结
    Java算法之“兔子问题”
    DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构
  • 原文地址:https://www.cnblogs.com/ygyy/p/14264587.html
Copyright © 2011-2022 走看看