Vue的组件(1)

目录

1、注册全局组件

2、注册局部组件 

  3、Prop数据传递

4、Prop验证


 

1、注册全局组件

 全局组件可在所有实例中使用,注册一个全局组件的语法格式如下:

Vue.component(tagName,options)

 tagName:表示定义的组件名称,options:该参数可以是应用Vue.extends()方法创建的一个组件构造器,还可以是组件的选项对象,因为组件是可复用的Vue实例,所以它们与一个Vue实例一样接收相同的选项(el选项除外),例如data、computed、watch、methods,以及生命周期钩子等。全局组件需要在创建的根实例之前注册,这样才能使组件在实例中调用,在注册组件之后,可以在创建的Vue根实例中以自定义元素的形式进行使用。

<div id="element">
    <my-components></my-components>
 </div>
 
 <script src="http://60.205.187.0/vue/vue.js"></script>
 <script type="text/javascript">

    //创建组件构造器
    var myComponent=Vue.extend({
        template:'<h3>注册全局组件</h3>'
    })

    //注册全局组件
    Vue.component('myComponents',myComponent)

    //创建根实例
     var demo = new Vue({
         el: '#element'
     })
 
 </script>

注意:组件的命名建议遵循W3C规范中的自定义组件命名方式,即字母全部小写并包含一个连字符“-”, 在注册全局组件时命名'myComponents',标签中对应的则是<my-components></my-components>,若不加上 '-' 则会报错,组件的命名中若有大写,则标签中则需要用 '-' 来断开。

上述代码使用了组件构造器的方式,另外还可以在注册的时候直接传入选项对象而不是构造器,为了使代码更简化,建议使用下面的方式:

<div id="element">
    <my-components></my-components>
 </div>
 
 <script src="http://60.205.187.0/vue/vue.js"></script>
 <script type="text/javascript">

    //注册全局组件
    Vue.component('myComponents',{
        template : '<h2>注册全局组件</h2>'
    })

    //创建根实例
     var demo = new Vue({
         el: '#element'
     })
 
 </script>

需要注意的是,组件选项对象中的data和Vue实例选项对象中的data的赋值是不同的,一个组件的data选项必须是一个函数,而不是一个对象。如下代码定义了3个相同的按钮组件,当单击某个按钮时,每个组件都会各自独立维护其自身的data值,因此单击一个按钮时其它组件不会受到影响。

<div id="element">
    <my-components></my-components>
    <my-components></my-components>
    <my-components></my-components>
 </div>
 
 <script src="http://60.205.187.0/vue/vue.js"></script>
 <script type="text/javascript">

    //注册全局组件
    Vue.component('myComponents',{
        data:function(){
            return{
                count:0
            }
        },
        template : '<button v-on:click="count++">单击了{{count}}次</button>'
    })

    //创建根实例
     var demo = new Vue({
         el: '#element'
     })
 
 </script>

 

2、注册局部组件 

通过Vue实例中的components选项可以注册一个局部组件。对于components对象中的每个属性来说,其属性名就是定义组件的名称,其属性值就是这个组件的选项对象。

<div id="element">
    <my-components></my-components>
</div>

<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">

    var child = {
        template: '<h3>注册局部组件</h3>'
    }

    //创建根实例
    var demo = new Vue({
        el: '#element',
        components: {
            'myComponents': child
        }
    })

</script>

局部注册地组件只能在其父组件中使用,而无法在其他组件中使用。例如,有两个局部组件A和B,如果希望 A在B中可用,则需要将A定义在B的components选项中,如果需要套娃的话如下:

<div id="element">
    <parent-component></parent-component>
</div>

<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">

    var Child = {
        template: '<h3>子组件:我被套了~</h3>'
    }
    var Parent = {
        template: '<div><h3>父组件:闪开,我要开始套娃了!</h3><child-component></child-component></div>',
        components: {
            'child-component': Child
        }
    }

    //创建根实例
    var demo = new Vue({
        el: '#element',
        components: {
            'parent-component': Parent
        }
    })

</script>

 

  3、Prop数据传递

 因为组件实例的作用域是孤立的,所以子组件的模板无法直接引用父组件的数据。如果想要实现父子组件之间数据的传递就需要定义Prop。Prop是父组件用来传递数据的一个自定义属性,这样的属性需要定义在组件选项对象的props选项中。通过props选项中定义的属性可以将父组件的数据传递给子组件,而子组件需要显示地用props选项来声明Prop,示例:

<div id="element">
    <my-component message="没想到吧,我也是ikun"></my-component>
</div>

<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">

    //注册全局组件
    Vue.component('my-component', {
        props: ['message'],
        template: '<p>{{message}}</p>'
    })

    //创建根实例
    var demo = new Vue({
        el: '#element'
    })

</script>

 除了上述代码中传递静态数据的方式外,也可以通过v-bind的方式将父组件中的data数据传递给子组件,每当父组件的数据发送变化时,子组件也会随着变化,示例:

<div id="element">
    <input v-model="ikuns1">
    <my-component v-bind:ikun="ikuns1"></my-component>

    <my-component2 v-bind:ikun="ikuns2"></my-component2>

    <my-component3 v-bind="ikuns3"></my-component3>
</div>

<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">
    //传递字符、数字
    Vue.component('my-component', {
        props: ['ikun'],
        template: '<div>传递字符数字:<p>{{ikun}}</p></div>'
    })
    //传递数组
    Vue.component('my-component2', {
        props: ['ikun'],
        template: '<div>传递数组:<p v-for="item in ikun">{{item}}</P></div>'
    })
    //传递对象
    Vue.component('my-component3', {
        props: ['name', 'sex', 'age'],
        template: '<div>传递对象:<div>名字:{{name}} 性别:{{sex}} 年龄:{{age}}</div></div>'
    })
    //创建根实例
    var demo = new Vue({
        el: '#element',
        data: {
            ikuns1: '香顿煎鱼食不食?',
            ikuns2: ['铁', '山', '靠'],
            ikuns3: {
                name: '菜虚鲲',
                sex: 'girl',
                age: '89'
            }
        }
    })

</script>

4、Prop验证

组件可以为Prop指定验证要求。当开发一个可以为他人使用的组件时,可以让使用者更加准确地使用组件,使用验证的时候,Prop接收的参数是一个对象,而不是一个字符串数组。例如:props:{a:Number},表示验证参数a为Number类型,如果调用该组件传入的a为字符串,则会抛出异常。

//基础类型检测,允许参数为指定的一种类型
props{
    propA:String
}

//多种类型,允许参数为多种类型之一
props{
    propB:{String,Number}
}

//参数必须,参数必须有值且为指定的类型
props{
    propC:{
       type:String,
    required:true 
    }
}

//参数默认,参数赋予默认值
props{
    propD:{
        type:String,
        default:'ikun'
    }
}

//如果赋予的默认参数是数组或对象
props{
    propD:{
        type:Object,
        default:function(){
            return{
                message: 'xxx'
            }
        }
    }
}

//自定义验证函数
props{
    propE:{
        validator:function(value){
            return value>0;
        }
    }
}

使用实例:

<div id="element">
    <my-component :num="666" :message="'我是ikun'" :custom="50"></my-component>
</div>

<script src="http://60.205.187.0/vue/vue.js"></script>
<script type="text/javascript">

    Vue.component('my-component', {
        props: {
            //检测是否为字符串类型
            num:String,
            //检测是否有值且为字符串类型
            message:{
                type:String,
                required:true
            },
            //检测是否为数值类型且默认值为6666
            dnum:{
                type:Number,
                default:6666
            },
            //检测是否为对象类型且有默认值
            object:{
                type:Object,
                default:function(){
                    return {message:'ikun'}
                }
            },
            //检测参数是否大于0
            custom:{
                validator:function(value){
                    return value>0;
                }
            }
        },
        template: 
            '<div>\
                <p>num:{{num}}</p>\
                <p>message:{{message}}</p>\
                <p>dnum:{{dnum}}</p>\
                <p>object:{{object}}</p>\
                <p>custom:{{custom}}</p>\
            </div>'
    })

    //创建根实例
    var demo = new Vue({
        el: '#element'
    })

</script>

如上,如果prop验证失败,Vue将会产生一个控制台的警告 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值