Vue 組件&組件之間的通信 之 父組件向子組件傳值


父組件向子組件傳值:父組件通過屬性向下傳值的方式和子組件通信;

使用步驟:

定義組件:現有自定義組件com-a、com-b,com-a是com-b的父組件;

准備獲取數據:com-b要獲取父組件data中的name屬性;

在<com-b :name=“name”></com-b> 使用v-bind 綁定name屬性,紅色部分為屬性名稱,可以隨意寫。

在子組件定義部分里添加選項,值是個字符串數組 props:[‘name’],將上邊紅色的屬性名稱寫在這里;

之后就可定義在子組件中使用name屬性了;

 

現在就來解決上一篇博文提出的問題吧,讓父組件與子組件進行通信:

 

 vue代碼:

<template id="father-template">
        <div>
        <h2> 父組件</h2>
        username:<span>{{name}}</span>
        <hr />
      <child-component :name="name"></child-component>    
        </div>
    </template>
    <template id="child-template">
        <div>
            <p> 子組件</p>
            fatherData:<span >{{name}}</span>
            
        </div>
</template>
    <script>
        
        new Vue({
            components:{
                    "father-component":{
                        data(){
                            return{
                                name:'perfect'
                            }
                        },
                        template:'#father-template',
                        
                        components:{
                            "child-component":{
                                
                                template:'#child-template',
                            props:['name']
                            }
                        },
                        
                        
                        
                    }
                }
                
            
            
        }).$mount('div');
    </script>

由圖可知子組件已經可以和父組件進行通信了,因為共用了屬性name

 

現在我們就來測試一下調用父組件的多個屬性,以及對屬性值的綁定,可以進行觀測數據的變化

 

 該效果圖的vue代碼:

<template id="father-template">
        <div>
        <h2> 父組件</h2>
        myData:<span>{{name}},{{id}},{{user.username}}</span><br />
        fatherData:<span>{{msg}}</span><br />
        <input type="text"  v-model="name"/>
        <hr />
      <child-component :name="name" :id='id' :user='user'></child-component>    
        </div>
    </template>
    <template id="child-template">
        <div>
            <p> 子組件</p>
            fatherData:<span >{{name}},{{id}},{{user.username}}</span>
            
        </div>
</template>
    <script>
        
        
        new Vue({
            
            data:{
            msg:"歡迎來到perfect*的博客園!!!"
        },
            components:{
                    "father-component":{
                        data(){
                            return{
                                    id:1,
                                name:'perfect',
                                user:{
                                
                                    username:'博客園---perfect*',
                                    password:'123123'
                                    
                                }
                            }
                        },
                        props:['msg'],
                        template:'#father-template',
                        
                        components:{
                            "child-component":{
                                
                                template:'#child-template',
                            props:['name','id','user']
                            }
                        },
                        
                        
                        
                    }
                }
                
            
            
        }).$mount('div');
    </script>

html:

<div>
            <father-component :msg="msg"></father-component>
            </div>

father-component的父組件是body,由於屬性msg是全局的,所以需要使用的時候,需要進行綁定

 

props選項高級配置

詳細介紹prop網址:https://cn.vuejs.org/v2/guide/components-props.html

在上面的props的使用是字符串數組

 props:['name','id','user']

 

props 可以是數組或對象,用於接收來自父組件的數據。props 可以是簡單的數組,或者使用對象作為替代,對象允許配置高級選項,如類型檢測、自定義驗證和設置默認值。

對象的形式:

props:{
                                
                                name:String,
                                id:Number,
                                user:Object
                            }

 

 

 

components:{
                    "father-component":{
                        data(){
                            return{
                                    id:"01",
                                name:'perfect',
                                user:{
                                
                                    username:'博客園---perfect*',
                                    password:'123123'
                                    
                                }
                            }
                        },

結果雖然顯示出來了,但是控制台報錯誤了,錯誤顯示,id的類型檢測錯誤,它是number類型,不是一個字符串類型

解決方法:

  props:{
                                
                                name:String,
                                id:[Number,String],
                                user:Object
                            }

 

在props中每一個屬性都可以定義成對象的類型:

 props:{
                                
                                name:{
                                    type:String,
                                    required:true//必須進行傳值
                                },
                                id:[Number,String],
                                user:Object
                            }
                            }

當把組件中的name刪除時,會出現下面這樣的錯誤:

  <child-component  :id='id' :user='user'></child-component>    

解決方法:我們可以通過在name對象中定義一個屬性default

  props:{
                                
                                name:{
                                    type:String,
                                    //required:true,//必須進行傳值
                                    
                                    default:'perfect*'//定義一個默認值
                                },
                                id:[Number,String],
                                user:Object
                            }
                            }
                        },

 

 

 

 這樣控制台就沒有錯誤了

接下來為user對象設置一個默認值

<child-component  :id='id' ></child-component>    
props:{
                                
                                name:{
                                    type:String,
                                    //required:true,//必須進行傳值
                                    
                                    default:'perfect*'//定義一個默認值
                                },
                                id:[Number,String],
                                   user:{
                                       type:Object,
                                       default:function(){
                                           return {username:'perfect***',password:'123123'}
                                       }
                                   }
                            }
                            }
                        },

 

 數據校驗

當定義一個屬性age:18時,初始效果

校驗demo:

  props:{
                                
                                name:{
                                    type:String,
                                    //required:true,//必須進行傳值
                                    
                                    default:'perfect*'//定義一個默認值
                                },
                                id:[Number,String],
                                   user:{
                                       type:Object,
                                       default:function(){
                                           return {username:'perfect***',password:'123123'}
                                       }
                                   },
                                   
                                   age:{
                                       type:Number,
                                   validator: function (value) {
                                       return value>=0;
                                   }
                                       
                                       
                                   }
                            }
                            }
                        },
                        

 

 <child-component  :id='id' :age='age'></child-component>    

 

當age=-18時:

會進行自動校驗,見控制台:

 


免責聲明!

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



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