Vue中的组件基础知识

创建组件的方式

 // 1.1使用Vue.extend 来创建全局的Vue组件
        var com1 = Vue.extend({
            // 通过template属性,指定了组件要展示的HTML结构
            template:'<h3>这是使用Vue.extend 创建的组件</h3>'
        })

        // 1.2使用Vue.component('组件的名称',创建出来的组件模板对象)
        Vue.component('myCom1',com1)

使用Vue.extend({})来创建Vue的全局模板对象,其中template指定了组件要展示的HTML结构,然后使用使用Vue.component来定义一个组件。

以下是简写方式

 Vue.component('myCom1',{
            // 注意:无论是哪种方式创建出来的组件,组建的template属性指向得到模板内容,
            // 必须有且只能有唯一的一个根元素
            template:'<div><h3>这是使用Vue.component 直接创建的组件</h3><span>123</span></div>'
        })

注意:无论是哪种方式创建出来的组件,组件的template属性指向的模板内容,必须有且只能有唯一的一个根元素

创建私有的组件

 let vm2 =new Vue({
            el:'#app2',
            data:{},
            methods:{},
            components:{
                login:{
                    template:"<h1>这是私有的login组件</h1>"
                }
            },  //定义实例内部私有组件的

        })

通过components属性定义私有的组件。通过以上方式即可在HTML结构中使用<login></login>标签。

组件的data数据

1.组件中可以有自己的data数据。

2.组件中的data数据和实例中的data数据不一样,实例中的data数据可以为一个对象,但是组件中的data必须是一个方法。

3.组件中的data除了必须是一个方法之外,这个方式内部还必须返回一个对象

Vue.component('myCom',{
            template:'<h1>这是全局组件-----{{msg}}</h1>',
            data:function(){
                return {
                    msg:'111'
                }
            }
        })

组件切换的方式

<body>
    <div id="app">
        <a href="" @click.prevent ='flag =true'>登录</a>
        <a href="" @click.prevent ='flag =false'>注册</a>
        <login v-if='flag'></login>
        <register v-else='flag '></register>
    </div>
    <script>
        Vue.component('login',{
            template:'<h1>登录组件</h1>'
        })

        Vue.component('register',{
            template:'<h1>注册组件</h1>'
        })
        let vm =new Vue({
            el:'#app',
            data:{
                flag:true
            },
            methods:{}
        })
    
    </script>
</body>

可以通过以上方式来切换组件,定义一个flag变量,通过v-show来不断的切换组件,但是这种方式有一种弊端,只能在两种组件中选择切换,所以建议使用以下方式。

<body>
    <div id="app">
        <a href="" @click.prevent ='isCom="login"'>登录</a>
        <a href="" @click.prevent ='isCom="register"'>注册</a>

        <!-- Vue提供了component,来展示对应名称的组件 -->
        <!-- component是一个占位符,:is属性,可以用来指定要展示的组件的名称 -->
        <component :is="isCom"></component>
   
    </div>
    <script>
        Vue.component('login',{
            template:'<h1>登录组件</h1>'
        })

        Vue.component('register',{
            template:'<h1>注册组件</h1>'
        })

        let vm =new Vue({
            el:'#app',
            data:{
                isCom:'login'
            },
            methods:{}
        })
    
    </script>
</body>

Vue提供了component来展示对应名称的组件,component是一个占位符,:is属性,可以用来指定要展示的组件的名称,这样就可以再多种组件之间完成切换。

组件之间传值的问题

父组件向子组件传递一个data数据

<body>
    
    <div id="app">
        <!-- 
            父组件可以再引用子组件的时候,通过属性绑定(v-bind)的形式,把需要传递
            给子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用
         -->
        <com1 :parentmsg="msg"></com1>
    </div>
    <script>
        let vm =new Vue({
            el:'#app',
            data:{
                msg:'123'
            },
            methods:{},
            components:{
      
                com1:{
                    // 子组件中的data数据,并不是通过父组件传递过来的,而是子组件自身私有的
                    data(){     //data中的数据都是可读可写的
                        return {
                            title:'213',
                            content:'qq'
                        }
                    },
                    template:'<h1>这是子组件---------{{parentmsg}}</h1>',
                    // 注意:组件中的所有props中的数据,都是通过父组件传递给子组件的
                    // props中的数据都是只读的,无法重新赋值
                props:[     //把父组件传递来的parentmsg属性,先在props数组中定义一下,这样,才能使用这个数据
                    'parentmsg'
                ]
                },
            }
        })
    </script>
</body>

父组件可以再引用子组件的时候,通过属性绑定(v-bind简写:)的形式,把需要传递给子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用。在子组件中,把父组件传递来的值,在props数组中定义一下,才能使用。

注意:props中的数据只能读不能写,不能在子组件中修改props中父组件传递来的值

父组件向子组件传递一个方法

<body>
    
    <div id="app">
        <!-- 
            父组件向子组件传递方法,使用的是事件绑定机制;v-on 简写@
            当我们自定义一个事件属性之后,那么,子组件就能够,通过某些方式,来调用传递进去的这个方法了
         -->
        <com2 @func="show"></com2>
    </div>

    <template id="tmpl">
        <div>
            <h1>这是子组件</h1>
            <input type="button" value="这是子组件的按钮" @click='myclick'>
        </div>
    </template>

    <script>
        // 定义了一个字面量类型的组件模板对象
        var com2 ={
            template:'#tmpl',
            data(){
                return{
                   
                }
            },
            methods:{
                    myclick(){
                       
                        this.$emit('func',123)
                    }
                }
        }

        let vm =new Vue({
            el:'#app',
            data:{
            },
            methods:{
                show(data){
                   console.log("调用了父组件的方法"+ data)
                }
            },
            components:{
                com2,
            }
        })
    </script>
</body>

当父组件向子组件传递方法时,使用的事件绑定机制,(v-on简写@),当我们自定义一个事件属性之后,那么,子组件就能够通过某些方式使用这个方法了。在子组件中可以通过this.$emit(),来调用父组件传递来的方法,并且当方法中需要传入参数时,可以在第二个参数中,传入相应的参数。

可以利用this.$emit()方法实现子组件向父组件传值,例如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    
    <div id="app">
        <com2 @func="show"></com2>
    </div>

    <template id="tmpl">
        <div>
            <h1>这是子组件</h1>
            <input type="button" value="这是子组件的按钮" @click='myclick'>
        </div>
    </template>

    <script>
        // 定义了一个字面量类型的组件模板对象
        var com2 ={
            template:'#tmpl',
            data(){
                return{
                    sonmsg:{name:'kobe',age:32}
                }
            },
            methods:{
                    myclick()
                        this.$emit('func',this.sonmsg)
                    }
                }
        }
        let vm =new Vue({
            el:'#app',
            data:{
                predata:null
            },
            methods:{
                show(data){        
                    this.predata =data
                }
            },
            components:{
                com2,
           }
        })
    </script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值