Vue.js學習筆記:props傳遞數據(轉)


一.傳遞數據

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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM