vue3的组件v-model(defineModel()宏)

这里展示的是vue3.4版本之前的如何在组件上使用以实现双向绑定 

<template>
    <p>我是子组件</p>
    <input :value="props.modelValue" @input="handelInput"/>
</template>

<script lang="ts" setup>
    const props = defineProps({
     modelValue: {
            default: '',
            type: String,
        }
    })

    const emits = defineEmits(['update:modelValue']);
    cosnt handelInput = (e)=>{
     emits('update:modelValue', e.target.value);
}
</script>
<template>
<p>我是父组件</p>
<Child v-model="msg">

</template>


<script lang="ts" setup>
    const msg = ref('v-model调试')
</script>

 v-model 的参数

在 v-model中学到的指定参数,我们可以在单个组件实例上创建多个 v-model 双向绑定。

<template>
    <p>我是子组件</p>
    <input :value="props.msg" @input="handelInput"/>
    <input :value="props.msg2" @input="handelInput2"/
</template>

<script lang="ts" setup>
    const props = defineProps({
     msg: {
            default: '',
            type: String,
        },
     msg2: {
            default: '',
            type: String,
        },
    })

    const emits = defineEmits(['update:msg','update:msg2']);
    cosnt handelInput = (e)=>{
     emits('update:msg', e.target.value);
    }
cosnt handelInput2 = (e)=>{
     emits('update:msg2', e.target.value);
    }
</script>
<template>
<p>我是父组件</p>
<Child v-model:msg="msg" v-model:msg2="text">

</template>


<script lang="ts" setup>
    const msg = ref('v-model调试')
    const text = ref('v-model多个参数调试')
</script>

从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏:

<!-- Child.vue -->
<template>
    <p>我是子组件</p>
  <div>展示父组件传来的双向绑定值: {
  { model }}</div>
  <button @click="update">Increment</button>
</template>


<script setup>
const model = defineModel()

const update =()=>{
  model.value++
}
</script>

<!-- Parent.vue -->
<template>
    <p>我是父组件</p>
    <Child v-model="countModel" />
</template>
<script lang="ts" setup>
    const countModel = ref(0)
</script>

defineModel() 返回的值是一个 ref(所以使用的时候要.value)。它可以像其他 ref 一样被访问以及修改,不过它能起到在父组件和当前变量之间的双向绑定的作用

上面还讲到带参的v-model,那么defineModel如何带参呢:

<!-- MyComponent.vue -->
<template>
   <p>我是子组件</p>
  <input type="text" v-model="title" />
  <input type="text" v-model="content" />
</template>


<script setup>
const title = defineModel('title')
const content = defineModel('content')
</script>

<template>
<p>我是父组件</p>
<MyComponent v-model:title="bookTitle"  v-model:content="bookContent"/>
</template>
<script lang="ts" setup>
    const  bookTitle = ref('bookTitle')
    const  bookContent = ref('bookContent')
</script>

参考文档:组件 v-model | Vue.js

### 使用 `v-model` 绑定 Props 在 Vue 3 中,组件可以通过自定义模型选项来实现更灵活的数据双向绑定。对于希望使用 `v-model` 来绑定 props 的场景,可以利用 `.model` 修改器以及通过设置 `emits` 和 `props` 实现父子组件间数据流的管理。 #### 自定义事件与属性组合方式 当父级向子级传递初始值作为 prop 并期望接收来自子级的变化通知时,可以在子组件内声明一个名为 `value` 或者其他名称(如果指定了 modelOptions)的 prop,并且发出带有新值参数的 input/update 事件给父级[^1]。 ```vue <!--组件 --> <template> <input :value="modelValue" @input="$emit(&#39;update:modelValue&#39;, $event.target.value)" /> </template> <script lang="ts"> import { defineComponent } from &#39;vue&#39;; export default defineComponent({ props: { modelValue: String, }, emits: [&#39;update:modelValue&#39;], }); </script> ``` ```vue <!--组件 --> <template> <ChildComponent v-model:title="parentTitle" /> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; const parentTitle = ref(&#39;Initial Title&#39;); </script> ``` 这种模式允许开发者创建更加直观易读的模板语法,同时也保持了单向数据流动的原则,即所有的状态变更都由父组件控制并显式触发。 为了进一步增强灵活性,还可以指定不同的 event 名字用于更新特定字段: ```javascript // 定义多个可选的 v-model 参数 defineModel([&#39;title&#39;, &#39;content&#39;]) ``` 这使得同一个组件能够支持多处独立的状态同步操作而不必担心命名冲突等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值