一.傳遞數據
1.props 傳入單數據
就像 data 一樣,prop 可以用在模板內,同樣也可以在 vm 實例中像“this.message”這樣使用
1 <template> 2 <div id="app"> 3 <h1>{{title}}</h1> 4 <child message="hello! Prop"></child> 5 </div> 6 </template> 7 <script> 8 import Vue from 'vue'; 9 Vue.component('child', { 10 // 聲明 props 11 props: ['message'], 12 template: '<span>{{ message }}</span>' 13 }) 14 export default { 15 name: 'app', 16 data: function () { 17 return { 18 title: '使用 Prop 傳遞數據' 19 } 20 } 21 } 22 </script> 23 <child message="hello! Prop"></child>
2.props 傳入多個數據
如果在父組件的模板類添加其他元素或者字符會有:
①在最前面加入—每個子組件渲染出來都會在其前面加上
②在最后面加入—每個子組件渲染出來都會在其后面加上
③在中間加入—他前面子組件后面加上,后面的子組件后面加上
(1)1種
1 <template> 2 <div id="app"> 3 <child msg="hello!"></child> 4 <child nihao="hello1!"></child> 5 <child nisha="hello2!"></child> 6 </div> 7 </template> 8 <script> 9 import Vue from 'vue'; 10 Vue.component('child', { 11 props: ['msg','nihao','nisha'], 12 template: '<span>{{ msg }}{{nihao}}{{nisha}}</span>', 13 }); 14 export default { 15 name: 'app', 16 data: function () { 17 return { 18 } 19 } 20 } 21 </script>
(2)2種
1 template: '<span>小明,{{ msg }}{{nihao}}{{nisha}}</span>',
(3)3種
1 template: '<span>{{ msg }}{{nihao}}{{nisha}}小明</span>',
(4)4種
1 template: '<p>{{ msg }}小明 {{nihao}} {{nisha}}小林</p>',
注意:camelCased (駝峰式) 命名的 prop 需要轉換為相對應的 kebab-case (短橫線隔開式) 命名:
1 Vue.component('child', { 2 // camelCase in JavaScript 3 props: ['myMessage'], 4 template: '<span>{{ myMessage }}</span>' 5 }) 6 7 <!-- kebab-case in HTML --> 8 <child my-message="hello!"></child>
二.動態prop
要動態地綁定父組件的數據到子模板的 props,與綁定到任何普通的HTML特性相類似,就是用 v-bind。每當父組件的數據變化時,該變化也會傳導給子組件
1 <template> 2 <div id="app"> 3 <input v-model="parentMsg"> 4 <br> 5 <child v-bind:my-message="parentMsg"></child> 6 </div> 7 </template> 8 <script> 9 import Vue from 'vue'; 10 export default { 11 name: 'app', 12 data: function () { 13 return { 14 title: '使用 Prop 傳遞數據', 15 parentMsg: 'Message from parent' 16 } 17 }, 18 components: { 19 child: { 20 props: ['myMessage'], 21 template: '<span>{{myMessage}}</span>' 22 } 23 } 24 } 25 </script>
三.表達式計算,傳遞值
如果想傳遞一個實際的 number,需要使用 v-bind,從而讓它的值被當作 JavaScript 表達式計算
1 <comp v-bind:some-prop="1"></comp> 2 3 <template> 4 <div id="app"> 5 <p>{{tle1}}:<comp total="123+456"></comp></p> 6 <p>{{tle2}}<comp :total="123+456"></comp></p> 7 </div> 8 </template> 9 <script> 10 import Vue from 'vue'; 11 Vue.component("comp", { 12 props: ["total"], 13 template: "<span>total: {{total}}</span>", 14 }); 15 export default { 16 name: 'app', 17 data: function () { 18 return { 19 tle1: '這里傳遞是字符串', 20 tle2: '用了v-bind動態語法,傳遞值會通過js的表達式計算,得到個值:' 21 } 22 } 23 } 24 </script>
四.Prop類型綁定
prop 默認是單向綁定:當父組件的屬性變化時,將傳導給子組件,但是反過來不會。這是為了防止子組件無意修改了父組件的狀態——這會讓應用的數據流難以理解。
五.prop驗證
傳入的數據不符合規格,Vue 會發出警告。當組件給其他人使用時,這很有用。
1 <template> 2 <div id="app"> 3 <div>name:{{dr.name}}, age:{{dr.age}}.<input v-model="telphone" /> </div> 4 <br /><br /> 5 <div> 6 <span>vue自定義組件</span><br /> 7 <child :msg_null="123+456" msg_string="adss" 8 :msg_number="0" :msg_twoway.sync="telphone" 9 :msg_validate="mobilephone" 10 :msg_number2String="mobilephone" 11 :msg_obj2json="dr" 12 :msg_json2obj="drJson"> 13 14 </child> 15 </div> 16 </div> 17 </template> 18 <script> 19 import Vue from 'vue'; 20 Vue.component("child", { 21 props: { 22 msg_null: null,//基礎類型檢測("null"意思是任何類型都可以) 23 msg_string: { //String類型,必須是定義過的,可以是空字符串"" 24 type: String, 25 required: true, 26 }, 27 msg_number: {//Number類型,默認值100 28 type: Number, 29 default: 100, 30 }, 31 msg_obj: {//Object類型,返回值必須是js對象 32 type: Object, 33 default: function() { 34 return { 35 name: "DarkRanger", 36 age: "18", 37 } 38 } 39 }, 40 msg_twoway: { //指定這個prop為雙向綁定,如果綁定類型不對將拋出一條警告 41 type: String, 42 twoWay: true, 43 }, 44 msg_validate: { //自定義驗證,必須是Number類型,驗證規則:大於0 45 type: Number, 46 validator: function(val) { 47 return val > 0; 48 } 49 }, 50 msg_number2string: { //將值轉為String類型,在設置值之前轉換值(1.0.12+) 51 coerce: function(val) { 52 return val + "" 53 } 54 }, 55 msg_obj2json: { //js對象轉JSON字符串 56 coerce: function(obj) { 57 return JSON.stringify(obj); 58 } 59 }, 60 msg_json2obj: {//JSON轉js對象 61 coerce: function(val) { 62 return JSON.parse(val); 63 } 64 }, 65 }, 66 template: '<div><b>msg_null=123+456=</b> {{msg_null}}</br> 67 </br><b>msg_string="1":</b>{{msg_string}}</br></br><b>msg_number:</b> {{msg_number}}</br> 68 </br><b>msg_obj:</b>{{"name-->"+msg_obj.name+", age-->"+msg_obj.age}}</br> 69 </br><b>msg_twoway:</b><input v-model="msg_twoway"></br></br><b>msg_validate:</b>{{msg_validate}}</br> 70 </br><b>msg_number2String:</b> {{msg_number2string}}</br></br><b>msg_obj2json:</b> {{msg_obj2json}}</br> 71 </br><b>msg_json2obj:</b>{{"name: "+msg_json2obj.name+"; age: "+msg_json2obj.age}}</div>' 72 }); 73 export default { 74 name: 'app', 75 data: function () { 76 return { 77 telphone: "0356-1234567", 78 mobilephone: 15912345678, 79 dr: { 80 name: "DarkRanger", 81 age: 25 82 }, 83 drJson: {"name":"DarkRanger","age":25} 84 } 85 } 86 } 87 </script>
解釋:
①、msg_null:不論什么數據類型,只要能解析成功,就渲染成正確的html
②、msg_string:只能傳遞String類型的字符串,如果將child06中的“msg_string="this is string"”更改為“:msg_string="1+2"”,
控制台報錯:
③、msg_number:如果在child06標簽中沒有定義值,我們將會取默認值100,現在定義了“:msg_number="99"”,如果將“:msg_number="99"”更改為“msg_number="99"”,控制台報錯:
④、msg_obj:在js中我們定義的msg_obj的default屬性是一個具有返回js對象的函數,這里取值的時候直接取的就是返回值,如果在child06中定義或者綁定了新的js對象,則會將msg_obj更新為新的數據。取js對象屬性值的時候用{{Object.prop}}取值即可。
⑤、msg_twoway:雙向數據綁定,在測試的過程中發現,即使設置“twoWay: true”,當子組件發生變化時,vue實例的數據並不會更新,還是單向的數據綁定,這里我將child06中原先的“:msg_twoway="telphone"”更改為“:msg_twoway.sync="telphone"”,保證測試能夠數據雙向綁定。
⑥、msg_validate:有驗證規則的組件數據,這里定義的規則是當前數值必須大於0,如果將child06中的“:msg_validate="mobilephone"”更改為“:msg_validate="-1"”。控制台報錯:
⑦、msg_number2string:在結果賦值之前將數值轉化為字符串。
⑧、msg_obj2json:vue.js內置了JSON的兩個方法,一個是JSON.parse(jsonStr)--》將JSON字符串轉化為js對象,另外一個是JSON.stringify(obj)--》將js對象序列化為JSON字符串。
這里是將obj轉化為json字符串,需要添加coerce屬性,它是一個具有返回json字符串的函數,當然不是必須得用JSON.stringify(obj)方法,只要方法合理,能夠轉化為json能夠識別的字符串即可。
⑨、msg_json2obj: 將json字符串轉化為js對象。
原文鏈接:https://blog.csdn.net/gao_xu_520/java/article/details/77567096