首页 > 其他分享 >vue - v-model在组件上的应用(包含子传父)

vue - v-model在组件上的应用(包含子传父)

时间:2023-07-07 15:56:22浏览次数:45  
标签:vue 子传父 default update prop 组件 model modelValue

一、v-model 的参数

默认情况下,v-model 在组件上都是使用 modelValue 作为 prop,并以 update:modelValue 作为对应的事件。我们可以通过给 v-model 指定一个参数来更改这些名字:

<MyComponent v-model:title="bookTitle" />

在这个例子中,子组件应声明一个 title prop,并通过触发 update:title 事件更新父组件值:

<!-- MyComponent.vue -->
<script>
export default {
  props: ['title'],
  emits: ['update:title']
}
</script>

<template>
  <input
    type="text"
    :value="title"
    @input="$emit('update:title', $event.target.value)"
  />
</template>

二、组件多个 v-model 绑定

利用刚才在 v-model 参数小节中学到的指定参数与事件名的技巧,我们可以在单个组件实例上创建多个 v-model 双向绑定。

组件上的每一个 v-model 都会同步不同的 prop,而无需额外的选项:如

<UserName
  v-model:first-name="first"
  v-model:last-name="last"
/>
<script>
export default {
  props: {
    firstName: String,
    lastName: String
  },
  emits: ['update:firstName', 'update:lastName']
}
</script>

<template>
  <input
    type="text"
    :value="firstName"
    @input="$emit('update:firstName', $event.target.value)"
  />
  <input
    type="text"
    :value="lastName"
    @input="$emit('update:lastName', $event.target.value)"
  />
</template>

三、处理 v-model 修饰符

在学习输入绑定时,我们知道了 v-model 有一些内置的修饰符,例如 .trim.number.lazy。在某些场景下,你可能想要一个自定义组件的 v-model 支持自定义的修饰符。
栗子1
我们来创建一个自定义的修饰符 capitalize,它的功能会自动将 v-model 绑定输入的字符串值第一个字母转为大写:

<MyComponent v-model.capitalize="myText" />

栗子2
组件的 v-model 上所添加的修饰符,可以通过 modelModifiers prop 在组件内访问到。在下面的组件中,我们声明了 modelModifiers 这个 prop,它的默认值是一个空对象:

<script>
export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  emits: ['update:modelValue'],
  created() {
    console.log(this.modelModifiers) // { capitalize: true }
  }
}
</script>

<template>
  <input
    type="text"
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

注意这里组件的modelModifiersprop 包含了 capitalize 且其值为 true,因为它在模板中的 v-model 绑定 v-model.capitalize="myText" 上被使用了。

有了这个 prop,我们就可以检查 modelModifiers 对象的键,并编写一个处理函数来改变抛出的值。在下面的代码里,我们就是在每次 <input /> 元素触发 input 事件时将值的首字母大写:

<script>
export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  emits: ['update:modelValue'],
  methods: {
    emitValue(e) {
      let value = e.target.value
      if (this.modelModifiers.capitalize) {
        value = value.charAt(0).toUpperCase() + value.slice(1)
      }
      this.$emit('update:modelValue', value)
    }
  }
}
</script>

<template>
  <input type="text" :value="modelValue" @input="emitValue" />
</template>

另外

对于又有参数又有修饰符的 v-model 绑定,生成的 prop 名将是 arg + "Modifiers"。举例来说:

<MyComponent v-model:title.capitalize="myText">

相应的声明应该是:

export default {
  props: ['title', 'titleModifiers'],
  emits: ['update:title'],
  created() {
    console.log(this.titleModifiers) // { capitalize: true }
  }
}

标签:vue,子传父,default,update,prop,组件,model,modelValue
From: https://www.cnblogs.com/axingya/p/17535200.html

相关文章

  • vue项目跨域问题
    vue项目跨域问题一、vue项目直接调用第三方接口后,打包成dist部署到服务器后,提示404以及跨域问题解决方式:使用宝塔部署时:如图:在图中位置加入以下代码即可!!!location/api/{rewrite^.+api/?(.*)$/$1break;proxy_passhttp://122.112.215.133:9901/;......
  • vue-slot插槽
    今天大致了解些vue插槽。在Vue.js中,插槽(slot)是一种机制,它允许你将内容插入到组件的特定位置。使用插槽,你可以在组件内定义一些可以被填充的占位符,然后在使用该组件时,将具体的内容插入到这些占位符中。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><......
  • vue3使用表格el-table-infinite-scroll.js:18 Uncaught (in promise) Error: [el-tabl
    先看下表格里面有没有这个el-scrollbar__wrapclass类 没有的话升级一下element-plus到最新的就行你可以先查看element-plus的版本npmview element-plus下载完之后 就有了......
  • SublimeText添加对vue的支持和格式化
    添加对vue的语法的高亮支持首先需要安装插件installpackage,按下ctrl+shift+p,输入install即可看见installpackage,选中回车即可,等待一段时间会提示是否安装成功安装成功后开始安装开发VUE需要用到的插件,安装方式为ctrl+shift+p,选择installpackage......
  • 13:vue3 插槽 slot
    1、插槽基础知识用Parent.vue,导入SlotBase.vue组件1<template>2<SlotBase>3<div>4<h3>插槽标题</h3>5<p>插槽内容</p>6</div>7</SlotBase>8</template>......
  • Vue + Volo.Abp 实现Auth2.0客户端授权模式认证
    @目录注册ClientAuth2.0授权创建vue-oidc-client创建Auth2.0认证跳转获取令牌创建回调页面创建退出登录最终效果Volo.Abp的身份服务器模块默认使用IdentityServer4实现身份认证。IdentityServer4是一个开源的OpenIDConnect和OAuth2.0框架,它实现了这些规范中的所有必需功能。......
  • Vue3主要的响应类方法(ref、reactive、toRef、toRefs)
    1.Vue.ref()1.1.可以为单个属性添加响应式状态。1.2.可以为对象添加响应式状态,当给对象的某个属性单独ref后,改变后的属性值不会同时改变原始值。1.3.访问数据值,需要添加.value。1.4.原始数据的拷贝。(原始数据不被改变)2.Vue.reactive()2.1.给对象添加响应式状态2.2.访问数据值......
  • vue - 动态组件(:is在组件中的使用)
    使用场景:有些场景会需要在两个组件间来回切换,比如Tab界面:我们可以通过Vue的<component>元素和特殊的isattribute实现的:如<!--currentTab改变时组件也改变--><component:is="currentTab"></component>在上面的例子中,被传给:is的值可以是以下几种:被注册的组件......
  • vue3--setUp以及ref的使用
    <template><h1>计数统计:{{countRef}}</h1><h2><button@click="inCreate">数量加1</button></h2><h2><button@click="inDelete">数量-1</button></h2></template><!--......
  • vue--计算属性
    在Vue.js中,计算属性(ComputedProperty)是一种特殊的属性,它基于现有的数据计算出一个新的值,并且会根据其依赖的数据进行自动更新。计算属性主要用于将复杂的逻辑和变量计算封装为属性,以便在模板中直接使用。以下是使用计算属性的一般步骤:1.在Vue实例的computed对象中定义计算......