vue3学习(十一)--- v-model

文章目录

v-model 其实是一个语法糖 通过propsemit组合而成的

v-model的更新

vue2和vue3中的v-model是有一些差别的:

  1. prop:value 变为 modelValue
  2. 事件:input 变为 update:modelValue
  3. v-bind 的 .sync 修饰符和组件的 model 选项已移除
  4. 新增 支持多个v-model
  5. 新增 支持自定义修饰符 Modifiers
javascript 复制代码
父组件
<template>
  <button @click="show = !show">开关{{show}}</button>
  <Dialog v-model="show"></Dialog>
</template>
 
<script setup lang='ts'>
import Dialog from "./components/Dialog/index.vue";
import {ref} from 'vue'
const show = ref(false)
</script>
 
<style>
</style>
javascript 复制代码
子组件
<template>
     <div v-if='propData.modelValue ' class="dialog">
         <div class="dialog-header">
             <div>标题</div><div @click="close">x</div>
         </div>
         <div class="dialog-content">
            内容
         </div>
         
     </div>
</template>
 
<script setup lang='ts'>
 
type Props = {
	默认就叫modelValue
   modelValue:boolean
}
 
const propData = defineProps<Props>()

emit的默认事件名称写法
const emit = defineEmits(['update:modelValue'])
 
const close = () => {
     emit('update:modelValue',false)
}
 
</script>

多个 v-model 绑定

javascript 复制代码
父组件
<template>
  <button @click="show = !show">开关{{show}} ----- {{title}}</button>
  <Dialog v-model:title='title' v-model="show"></Dialog>
</template>
 
<script setup lang='ts'>
import Dialog from "./components/Dialog/index.vue";
import {ref} from 'vue'
const show = ref(false)
const title = ref('我是标题')
</script>
 
<style>
</style>
javascript 复制代码
子组件
<template>
     <div v-if='modelValue ' class="dialog">
         <div class="dialog-header">
             <div>标题---{{title}}</div><div @click="close">x</div>
         </div>
         <div class="dialog-content">
            内容
         </div>
         
     </div>
</template>
 
<script setup lang='ts'>
 
type Props = {
   modelValue:boolean,
   title:string
}
 
const propData = defineProps<Props>()
 
const emit = defineEmits(['update:modelValue','update:title'])
 
const close = () => {
     emit('update:modelValue',false)
     emit('update:title','我要改变')
}
 
</script>

自定义修饰符

添加到组件 v-model 的修饰符将通过 modelModifiers prop 提供给组件。在下面的示例中,我们创建了一个组件,其中包含默认为空对象的 modelModifiers prop

javascript 复制代码
父组件
<template>
  <button @click="show = !show">开关{{show}} ----- {{title}}</button>
  这里添加修饰符
  <Dialog v-model:title.flag='title' v-model="show"></Dialog>
</template>
 
<script setup lang='ts'>
import Dialog from "./components/Dialog/index.vue";
import {ref} from 'vue'
const show = ref(false)
const title = ref('我是标题')
</script>
 
<style>
</style>
javascript 复制代码
<script setup lang='ts'>
 
type Props = {
    modelValue: boolean,
    title?: string,
    默认写法
    modelModifiers?: {
        default: () => {}
    }
    用的是修饰符前面的参数 + 'Modifiers'的固定写法
    titleModifiers?: {
        default: () => {}
    }
 
}
 
const propData = defineProps<Props>()

 console.log(propData.modelModifiers) ===> //{}
 console.log(propData.titleModifiers) ===> //flag:true

const emit = defineEmits(['update:modelValue', 'update:title'])
 
const close = () => {
    console.log(propData.modelModifiers);
 
    emit('update:modelValue', false)
    emit('update:title', '我要改变')
}
相关推荐
LYFlied1 分钟前
前端路由核心原理深入剖析
前端
用户19017684478651 分钟前
vue3规范化示例
前端
用户19017684478653 分钟前
Git分支管理与代码合并实践:保持特性分支与主分支同步
前端
没有鸡汤吃不下饭22 分钟前
前端打包出一个项目(文件夹),怎么本地快速启一个服务运行
前端·javascript
liusheng24 分钟前
Capacitor + React 的 iOS 侧滑返回手势
前端·ios
CUYG36 分钟前
v-model封装组件(定义 model 属性)
前端·vue.js
子洋38 分钟前
基于远程开发的大型前端项目实践
运维·前端·后端
用户350201588474841 分钟前
基于react-routet v7 的配置式 + 约定式路由系统 第一步:引入react-routerv7
前端
用户350201588474843 分钟前
基于react-routet v7 的配置式 + 约定式路由系统 第二步:一个简单的约定式路由系统
前端
万事可爱^44 分钟前
LangChain v1.0学习笔记(4)—— 核心组件Models
人工智能·笔记·学习·langchain·大模型