首先咱們定義一個組件並接收javascript
var com1 =Vue.extend({ template:"<h3>這是經過Vue.extend建立的組件</h3>" });
而後咱們全局註冊這個組件css
Vue.component('mycom1',com1);
這樣咱們就能夠在咱們的代碼中使用咱們的mycom1組件了html
<div id="app"> <mycom1></mycom1> </div>
須要注意的是,若是咱們註冊的組件名稱是以駝峯命名法來命名的,那麼咱們在使用的時候將不能使用本來註冊時的命名,以下的寫法時錯誤的vue
//定義 Vue.component('myCom1',com1); //使用 <div id="app"> <myCom1></myCom1> </div>
咱們在使用的時候須要將駝峯命名法的兩個單詞使用‘-’進行分開,而且更加推薦‘-’左右兩端的單詞均使用小寫,以下java
<!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建立的組件</h3>" }); Vue.component('myCom1',com1); var vm = new Vue({ el:'#app', data:{ } }) </script> </body> </html>
同時咱們能夠將構造和註冊結合在一塊兒bootstrap
Vue.component('myCom1',Vue.extend({ template:"<h3>這是經過Vue.extend建立的組件</h3>" }));
更加簡化的方式app
Vue.component('myCom1',{ template:"<h3>這是經過Vue.extend建立的組件</h3>" });
須要注意的是,咱們無論使用哪一種方式來定義組件,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"> <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-resource
Vue對象內部有一個components組件,能夠定義咱們想要的組件this
<!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必須爲一個function且必須返回一個對象格式的數據,除此以外和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:"這是組件中的數據" } } } } }) </script> </body> </html>
<!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>
不過使用這種方式只能實現兩種類型的組件切換
使用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來表明最後要展現的組件的值
子組件默認沒法直接訪問到父組件(對象)中的數據,須要使用v-bind表達式來傳遞,結合組件的props屬性來使用,便可達到父組件向子組件傳遞數據
<!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:"這是父組件中的數據" }, components:{ login:{ template:'#app2', data(){ return { name:'zhangsan', age:'24' } }, props:['parentmsg'] } } }) </script> </body> </html>
須要注意的是,經過props傳遞過來的數據是不推薦被修改的,強行修改會報錯
props中定義的屬性所有都是由父組件傳遞給子組件的
而子組件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 @func="show"></login> </div> <template id="app2"> <input type="button" value="子組件按鈕" @click="myclick" /> </template> <script> var vm = new Vue({ el:'#app', data:{ msg:"這是父組件中的數據" }, 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>
從如上代碼可知,父組件調用子組件中的數據須要藉助this.$emit來進行傳遞,傳遞的第一個參數都是函數名,後面的參數都是傳遞的數據,能夠傳遞單個屬性或者是對象