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

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

v-model指令是什么?

刚刚提到,iview通过v-model双向绑定数据,所以首先我们要明白v-model在这个过程中做了什么。有vue基础的同学应该知道,v-model本质是一个语法糖,在v-bind和v-on的整合。表单元素比如input,v-bind绑定一个值,就把data数据传给了value,同时再通过v-on监听input事件,当表单数据改变的时候,也会把值传给data数据,代码如下

<input type=‘text‘ v-model=‘msg‘>

// 相当于

<input type=‘text‘ :value=msg @input=‘msg =$event.target.value‘>

vue2.2新增model API

虽说新增,实际上vue3.0都已经发布了,这其实算个比较旧特性,官网是这么写的

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

这句话比较长,咱们来一步步理解,首先是第一句

  1. 允许一个自定义组件在使用v-model时定制prop和event

一般说来,v-model用在表单元素上进行数据的双向绑定,自定义组件通常通过父子组件传值绑定数据

  1. 默认情况下,一个组件上的v-model会把value用作prop且把input用作event

前边说了,v-modelv-bindv-on的语法糖,那么这里v-model就完成两个步骤

举一个栗子

比如

// 父组件
<Child v-model=‘iptValue‘></Child>

// 子组件
Vue.components(‘Child‘,{
        model: {
            prop: ipt,
            evnet: change
        }
        props: {
            ipt: Number
        }
        template: `<input type=‘number‘ :value=‘ipt‘ @change=‘$emit("change",parseInt($event.target.value))‘>`
})

这里父组件中的v-model相当于

 <Child :value=‘iptValue‘ @change=‘value => iptValue = value‘></Child>

用文字解释下上面的代码

前面说了,父子组件传值通过prop和$emit,第一步父组件把iptValue通过prop传给了子组件,但要注意,我这里的子组件给prop取了一个别名叫做ipt作为区分,所以子组件的prop对象中的键为我取的别名ipt。第二步,当子组件input值改变的时候,子组件监听了一个onchange方法,注意我这里也给$emit中的事件取了一个别名,只不过这个别名和原来的名字一样change,input值改变emit提交change事件并把新值传给父组件,又又又要注意,$emit的荷载都是字符串....

然后就跟上面代码一样

父组件执行value => iptValue = value语句,这样就完成了父子组件数据的双向绑定

个人觉得v-model用在自定义组件最大的好处是提高了组件的封装性,父组件不必要另外写一个接受子组件发送给来的$emit方法

  1. 最后是第三句话,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的

其实这很容易理解,因为value字符串在input中是有意义的,取别名有利于区分,不太重要啦这一小部分...

结束

那么以上就是个人对于自定义组件v-model的一点心得,文章有疑问或错误的地方还请指出,感谢阅读

原文地址:https://www.cnblogs.com/chris-oil/p/12260257.html

时间: 2024-08-29 18:20:36

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

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目的是向外传递值,也就是向他的父组件传递值,

vue自定义组件v-model

  一个组件上的`v-model`默认会利用名为`value`的prop(属性)和名为input的事件,但是像单选框.复选框等类型的输入控件可能会将`value`特性用于不同的目的.这时候我们可以在定义组件的时候,通过设置`model`选项可以用来实现不同的处理方式. 在创建组件的时候,添加`model`属性,其中要包含两个属性配置,分别是: event:什么时候触发v-model行为 prop:定义传递给v-model的那个变量,绑定到哪个属性值上 下面是实现计数器作用的代码: <!DOCTY

在自定义组件中获取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双向绑定、 父子组件同步通信

父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx') 2.父组件传值直接传对象,子组件收到对象后可随意改变对象的属性,但不能改变对象本身. 3.父组件使用: v-model 第一种曾经被废除过,由于维护成本的原因被删掉,但经过证实,确实有存在的意义,又被加上. 第一种: 父组件: <template> <div> <aa cl

vue自定义组件并使用

以下是使用自己写的一个简单的文件上传框为例 时间:20180710 编写:luoxm qq:1085656523 1.自定义组件结构(一个js文件,一个vue文件),最好单独放一个文件 2.upload.vue 内容   其中,action是父组件传递给子组件的参数,使用props进行接收,并关联到action中. props 父级传给组件的数据   然后用  $emit('方法名',数据) 返回父级数据 3.index.js内容 index.js的内容分成3个步骤(缺一不可): a).引入vu

[转] vue自定义组件(通过Vue.use()来使用)即install的使用

在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue<template> <div> 我是组件 </div></template> <script> export default { }</script> <style scoped> div{ font-size:40px; color:

vue自定义组件(通过Vue.use()来使用)即install的使用

在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个loading.vue文件 // Cmponent.vue <template> <div> ...loading </div> </template> <script> export default { } </script> <style scoped> div{ font-size:40px

Vue.js 组件中data的使用

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con