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时:

会进行自动校验,见控制台:

猜你喜欢

转载自www.cnblogs.com/jiguiyan/p/10778079.html