vue框架之自定义组件中使用v-model

Posted or2-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue框架之自定义组件中使用v-model相关的知识,希望对你有一定的参考价值。

通常 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/[email protected]/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       <[email protected]=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     });

 

 



以上是关于vue框架之自定义组件中使用v-model的主要内容,如果未能解决你的问题,请参考以下文章

vue之自定义组件

vue 组件自定义v-model

NO.08--VUE之自定义组件添加原生事件

vue3自定义组件使用v-model实现双向数据绑定

vue 自定义组件使用v-model

vue之自定义组件的写法与用法