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/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     });
 


原文地址:https://www.cnblogs.com/or2-/p/10496532.html

时间: 2024-08-29 10:34:04

vue框架之自定义组件中使用v-model的相关文章

在自定义组件中获取spring底层组件

要想在自定义组件中获取spring底层的各种组件,只需让自定义组件实现一系列接口即可,这些接口都是Aware的子接口.常见的有: 1. ApplicationContextAware——用于获取IOC容器: 2. BeanNameAware——用于获取bean的名称: 3. EmbeddedValueResolverAware——用于获取字符串解析器,可以解析各种占位符,例如${}.$#{}等. 示例代码如下,自定义bean类实现了三种Aware接口 public class Candy imp

微信小程序自定义组件的使用以及调用自定义组件中的方法

在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说的自定义组件,自定义组件类似于页面,它有wxml 模版.wxss 样式和js文件,然后在页面中使用该自定义组件即可. 例如,我的自定义组件代码结构是这样的: myComponent文件就是我所创的自定义组件,myComponent.wxml文件代码为: <view class="inner&q

[转] vue自定义组件中的v-model简单解释

在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件的封装效果更好.所以,个人认为,我们自己封装组件也应该有这样的思维,父组件通过slot或者props传值,由子组件完成一些效果,再抛出必要的事件让父组件接受,这样组件的可复用性就很强,有利于多次使用. v-model指令是什么? 刚刚提到,iview通过v-model双向绑定数据,所以首先我们要明白

Vue.extend提供自定义组件的构造器

Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元素时,会自动调用“扩展实例构造器”来生产组件实例,并挂载到自定义元素上. 自定义无参数标签 我们想象一个需求,需求是这样的,要在博客页面多处显示作者的网名,并在网名上直接有链接地址.我们希望在html中只需要写<message></message> ,这和自定义组件很像,但是他没有传递

vue.js2.0 自定义组件初体验

理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 使用组件 创建单文件组件 <template> </template> <script> export default { }; </script> <style lang="st

vue框架下的组件化的购物车实现

最近在学习vue,然后了解到这个框架的一个突出特点就是组件化,所以用这种形式实现了一个购物车,因为在实际项目中,数量加减可能不只在购物车里用到,所以把这个小的效果也提取出来了,在实现过程中形成了很多坑,这里记录一下,希望对大家能有所帮助. tip1: 这里会用到使用的组件库是vux,  需要先安装(npm insatall vux --save   npm install vux-loader --save-dev),然后具体怎么使用,如果不清楚请去看vux官网. 我把列表和底部的全选计数分别写

Egret-我的探索:自定义组件中通过ID获取子组件实例

可以看到,在exml编辑器中我们给UI组件添加了ID属性; 之后在对应的 ts文件中使用这个组件 namespace ui { export class GameCtrl extends eui.Component { constructor() { super(); this.skinName = "resource/eui_skins/GameMainCtrl.exml"; this.addEventListener(eui.UIEvent.COMPLETE, this.ctrlI

使用vue的extend自定义组件开发

index.js import Vue from 'vue' import tip from './tip.vue' const Constructor = Vue.extend(tip); const Tip = (options={})=>{ options.showAlert = options.fn//传来的fn给options,赋值data const vm = new Constructor({ data:options }) vm.$mount() document.body.ap

小程序自定义组件中observer函数的应用

<!-- 单个数据监听 --> <view>白菜</view> <view>价格:{{price}}</view> <!-- bindinput输入时触发方法 --> <view>数量: <input type="number" bindinput='changee' value="{{num1}}"></input></view> <vie