子組件直接修改父組件通過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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM