vue框架之自定義元件中使用v-model

c3tc3tc3t發表於2019-03-08

通常 vue在html常見表單空間支援v-model雙向繫結例如

1 <input v-model="message" placeholder="edit me">
2 <p>Message is: {{ message }}</p>

1,當我們自定義元件時如何使用v-model?

答:程式碼例項如下

2 我們在自定義元件中使用v-model的目的是什麼?

答:自定義模板上定義v-mode目的是向外傳遞值,也就是向他的父元件傳遞值,影響父元件的屬性,通過父元件的屬性初始化自定義的子元件,然後在子元件上操作來與父元件達到互動目的

 
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5   <meta charset="UTF-8" />
 6   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 7   <meta http-equiv="X-UA-Compatible" content="ie=edge" />
 8   <script src="https://cdn.jsdelivr.net/npm/vue@2.6.8/dist/vue.min.js"></script>
 9   <title>Document</title>
10 </head>
11 
12 <body>
13   <template id="greetings">
14     <div>
15       <h1>父元件中的hk:{{ hk }}</h1>
16       <hr />
17       <!--這裡我們將父元件中的hk的值傳遞給子元件zz的modelVal屬性,112傳遞給子元件的kk-->
18       <zz v-model="hk" kk="112"></zz>
19     </div>
20   </template>
21 
22   <template id="fff">
23     <label>
24       <!--這裡的:checked是input自帶屬性,不是我們定義的,它的值是checkval方法計算的值-->
25       <!--:kk="kk"是上面我們使用zz元件時,我們寫的 kk=112,可以理解將112傳遞給kk,kk傳遞給:kk,因為我們在zz元件裡定義了kk屬性-->
26       <!--@change=update使我們定義一個監聽函式,當點選這個radio時發生變化觸發這個update方法-->
27       <input type="radio" :checked="checkVal" :kk="kk" @change="update" />
28       <!--這裡我們列印我們自定義v-model屬性值-->
29       這裡列印父元件中呼叫子元件時傳遞hk的值給modelVal:{{ modelVal }}
30       <hr />
31       <!--這裡我們用來檢視checkVal值-->
32       checkVal:{{ checkVal }}
33     </label>
34   </template>
35 
36   <div id="app">
37     <greetings-component></greetings-component>
38   </div>
39 </body>
40 <script>
41   Vue.component('zz', {
42     template: '#fff',
43     model: {
44       prop: 'modelVal', //這裡使我們定義的v-model屬性,叫做modelVal,這裡我們命名為modelVal
45       event: 'change'
46     },
47     props: {
48       modelVal: {
49         //這裡我們要定義這個modelVal,才能在model中的prop中使用
50         type: String
51       },
52       kk: {
53         type: String
54       }
55     },
56     computed: {
57       checkVal() {
58         console.log('---in checkval');
59         console.log('this.modelVal:', this.modelVal); //這裡列印this.modeVal值
60         console.log('kk:', this.kk); //列印傳遞給kk的值
61         console.log('---in checkval');
62         //這裡返回的是false,表示沒有被點選,然後我們再次點選
63         return false;
64       }
65     },
66     methods: {
67       update($event) {
68         console.log('---in update');
69         console.log('this.modelVal:', this.modelVal); //這裡列印this.modeVal值
70         console.log('---in update');
71         var a = $event.target.checked;
72         this.$emit('change', $event.target.checked); //這裡是返回給父元件,當我們點選radio時,選中了,返回true,影響了父元件中的hk的值
73       }
74     }
75   });
76 
77   Vue.component('greetings-component', {
78     template: '#greetings',
79     data: function () {
80       return {
81         hk: 'greetings-component-hk'
82       };
83     }
84   });
85 
86   /* eslint-disable no-new */
87   new Vue({
88     el: '#app'
89   });
90 </script>
91 
92 </html>

 3,按照我的思路我們修改官方的例子

官方程式碼如下

1     <div id="app">
2       <greetings-component></greetings-component>
3     </div>

 

 1 <template id="greetings">
 2       <div>
 3         <custom-input v-model="searchText"></custom-input>
 4         {{ searchText }}
 5       </div>
 6     </template>
7 8 <script> 9 Vue.component('custom-input', { 10 props: ['value'], 11 template: ` 12 <input 13 v-bind:value="value" 14 v-on:input="$emit('input', $event.target.value)" 15 > 16 ` 17 }) 18 19 Vue.component('greetings-component', { 20 template: '#greetings', 21 data: function() { 22 return { 23 24 searchText: 'searchText' 25 }; 26 } 27 }); 28 29 /* eslint-disable no-new */ 30 new Vue({ 31 el: '#app' 32 }); 33 </script>

然後按照我講的思路,不用預設的value這個名稱

 1 <div id="app">
 2       <greetings-component></greetings-component>
 3  </div>
 4 
 5 <template id="greetings">
 6       <div>
 7         <custom-input v-model="searchText"></custom-input>
 8         {{ searchText }}
 9       </div>
10  </template>
11 
12 Vue.component('custom-input', {
13       model: {
14         prop: 'modelVal',
15         event: 'input' //這裡我們監聽input事件
16       },
17       props: {
18         modelVal: {
19           type: String
20         }
21       },
 
      methods: {
         hello: function() {
            console.log(this.modelVal);
          }
      },
22    template: `
23 24     <input @input="hello

25 v-bind:value="modelVal"

26 v-on:input="$emit('input', $event.target.value)"
27     >
28   `
29     });
30 
31 Vue.component('greetings-component', {
32       template: '#greetings',
33       data: function() {
34         return {
35          
36           searchText: 'searchText'
37         };
38       }
39     });
40 
41     /* eslint-disable no-new */
42     new Vue({
43       el: '#app'
44     });

 

 



相關文章