Vue組件創(chuàng)建和傳值

Vue創(chuàng)建組件的方式

使用Vue.Extend()和Vue.component全局注冊組件

首先我們定義一個組件并接收

        var com1 =Vue.extend({
            template:"<h3>這是通過Vue.extend創(chuàng)建的組件</h3>"
        });

然后我們全局注冊這個組件

        Vue.component('mycom1',com1);

這樣我們就可以在我們的代碼中使用我們的mycom1組件了

        <div id="app">
            
        <mycom1></mycom1>
        </div>

需要注意的是渗勘,如果我們注冊的組件名稱是以駝峰命名法來命名的欢峰,那么我們在使用的時候將不能使用原本注冊時的命名活烙,如下的寫法時錯誤的

//定義
Vue.component('myCom1',com1);

//使用
        <div id="app">
            
        <myCom1></myCom1>
        </div>

我們在使用的時候需要將駝峰命名法的兩個單詞使用‘-’進行分開冻辩,并且更加推薦‘-’左右兩端的單詞均使用小寫圣蝎,如下

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            
        <my-com1></my-com1>
        </div>

    <script>
        var com1 =Vue.extend({
            template:"<h3>這是通過Vue.extend創(chuàng)建的組件</h3>"
        });
        Vue.component('myCom1',com1);
        var vm = new Vue({
            el:'#app',
            data:{
            }
            
        })
    </script>
    </body>
</html>

同時我們可以將構造和注冊結合在一起

        Vue.component('myCom1',Vue.extend({
            template:"<h3>這是通過Vue.extend創(chuàng)建的組件</h3>"
        }));

更加簡化的方式

        Vue.component('myCom1',{
            template:"<h3>這是通過Vue.extend創(chuàng)建的組件</h3>"
        });

需要注意的是娜膘,我們不管使用哪種方式來定義組件,template中定義的頂級元素只能有一個级乍,否則會出現(xiàn)錯誤

使用Vue.component()配合Vue的templete標簽來定義組件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <my-com1></my-com1>
        </div>

    <template id="mycom2">
        <h3>這是通過Templete定義的組件舌劳,在html代碼中有智能提示</h3>
    </template>
    <script>
        Vue.component('myCom1',{
            template:"#mycom2"
        });
        var vm = new Vue({
            el:'#app',
            data:{
            }
            
        })
    </script>
    </body>
</html>

需要注意的是,上述的定義方式都是定以的全局Vue對象均可使用玫荣,下面我們定義一個私有的組件

Vue.component私有組件

Vue對象內部有一個components組件甚淡,可以定義我們想要的組件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <login></login>
        </div>

    <script>
        var vm = new Vue({
            el:'#app',
            data:{
            },
            components:{
                login:{
                    template:'<h3>這是私有的login組件</h3>'
                }
            }
            
        })
    </script>
    </body>
</html>

同時仍然可以使用上述的template方式來定義組件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <login></login>
        </div>
    <template id="app2">
        <h3>這是私有組件配合template方式定義的組件</h3>
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
            },
            components:{
                login:{
                    template:'#app2'
                }
            }
            
        })
    </script>
    </body>
</html>

組件的data

定義的組件可以有自己的data數(shù)據(jù)域,但是data必須為一個function且必須返回一個對象格式的數(shù)據(jù)捅厂,除此之外和Vue對象中的data的使用方法完全一致

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <login></login>
        </div>
    <template id="app2">
        <h3>這是私有組件配合template方式定義的組件---{{msg}}</h3>
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
            },
            components:{
                login:{
                    template:'#app2',
                    data:function(){
                        return {
                            msg:"這是組件中的數(shù)據(jù)"
                        }
                    }
                }
            }
            
        })
    </script>
    </body>
</html>


組件切換

使用v-if和v-else實現(xiàn)組件切換

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <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>
    <template id="app2">
        <h3>這是登錄組件</h3>
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                flag:true
            },
            components:{
                login:{
                    template:'#app2',
                },
                register:{
                    template:'<h3>注冊組件</h3>',

                }
            }
            
        })
    </script>
    </body>
</html>


不過使用這種方式只能實現(xiàn)兩種類型的組件切換

使用component元素進行組件切換

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <a href="#" @click.prevent="comName='login'">登錄</a>
            <a href="#" @click.prevent="comName='register'">注冊</a>
            <component :is="comName"></component>
        </div>
    <template id="app2">
        <h3>這是登錄組件</h3>
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                comName:'login'
            },
            components:{
                login:{
                    template:'#app2',
                },
                register:{
                    template:'<h3>注冊組件</h3>',

                }
            }
            
        })
    </script>
    </body>
</html>

我們使用定義在data中的屬性來切換component中要展示的組件贯卦,使用:is來代表最后要展示的組件的值

父子組件傳值

父組件向子組件傳遞數(shù)據(jù)

子組件默認無法直接訪問到父組件(對象)中的數(shù)據(jù),需要使用v-bind表達式來傳遞焙贷,結合組件的props屬性來使用撵割,即可達到父組件向子組件傳遞數(shù)據(jù)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <login v-bind:parentmsg="msg"></login>
        </div>
    <template id="app2">
        <h3>這是私有組件配合template方式定義的組件--{{parentmsg}}</h3>
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                msg:"這是父組件中的數(shù)據(jù)"
            },
            components:{
                login:{
                    template:'#app2',
                    data(){
                        return {
                            name:'zhangsan',
                            age:'24'
                        }
                    },
                    props:['parentmsg']
                }

            }
            
        })
    </script>
    </body>
</html>

需要注意的是,通過props傳遞過來的數(shù)據(jù)是不推薦被修改的辙芍,強行修改會報錯

props中定義的屬性全部都是由父組件傳遞給子組件的

而子組件data中的數(shù)據(jù)是組件私有啡彬,可以被修改的

子組件向父組件傳遞數(shù)據(jù)

子組件向父組件傳值是通過父組件向子組件傳遞事件實現(xiàn)的

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
        <script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
        <link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
    </head>
    <body>
        <div id="app">
            <login @func="show"></login>
        </div>
    <template id="app2">
        <input type="button" value="子組件按鈕" @click="myclick" />
    </template>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                msg:"這是父組件中的數(shù)據(jù)"
            },
            methods:{
                show(data){
                    console.log("這是父組件的事件"+data)
                }
            },
            components:{
                login:{
                    template:'#app2',
                    data(){
                        return {
                            name:'zhangsan',
                            age:'24'
                        }
                    },
                    props:['parentmsg'],
                    methods:{
                        myclick(){
                            this.$emit('func',this.name);
                        }
                    }
                }

            }
            
        })
    </script>
    </body>
</html>

從如上代碼可知,父組件調用子組件中的數(shù)據(jù)需要借助this.$emit來進行傳遞沸手,傳遞的第一個參數(shù)都是函數(shù)名外遇,后面的參數(shù)都是傳遞的數(shù)據(jù),可以傳遞單個屬性或者是對象

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末契吉,一起剝皮案震驚了整個濱河市跳仿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捐晶,老刑警劉巖菲语,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惑灵,居然都是意外死亡山上,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門英支,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佩憾,“玉大人,你說我怎么就攤上這事干花⊥保” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵池凄,是天一觀的道長抡驼。 經常有香客問我,道長肿仑,這世上最難降的妖魔是什么致盟? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任碎税,我火速辦了婚禮,結果婚禮上馏锡,老公的妹妹穿的比我還像新娘雷蹂。我一直安慰自己,他們只是感情好眷篇,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布萎河。 她就那樣靜靜地躺著,像睡著了一般蕉饼。 火紅的嫁衣襯著肌膚如雪虐杯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天昧港,我揣著相機與錄音擎椰,去河邊找鬼。 笑死创肥,一個胖子當著我的面吹牛达舒,可吹牛的內容都是我干的。 我是一名探鬼主播叹侄,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼巩搏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趾代?” 一聲冷哼從身側響起贯底,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撒强,沒想到半個月后禽捆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡飘哨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年胚想,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽隆。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡浊服,死狀恐怖,靈堂內的尸體忽然破棺而出胚吁,到底是詐尸還是另有隱情臼闻,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布囤采,位于F島的核電站,受9級特大地震影響惩淳,放射性物質發(fā)生泄漏蕉毯。R本人自食惡果不足惜乓搬,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望代虾。 院中可真熱鬧进肯,春花似錦、人聲如沸棉磨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘瓤。三九已至环形,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衙傀,已是汗流浹背抬吟。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留统抬,地道東北人火本。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像聪建,于是被迫代替她去往敵國和親钙畔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容