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>

 

發佈了63 篇原創文章 · 獲贊 50 · 訪問量 9725
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章