Vue3+ts 如何实现v-model父子间的通信

本文探讨了在Vue.js中如何实现在父组件中使用v-model与子组件进行双向绑定的问题。通过两种解决方法展示了如何在子组件中监听input事件并触发更新,同时在父组件中正确接收和更新数据。方法一是通过`@input`和`:value`属性,方法二是通过定义`update`方法并在子组件中使用`$emit`。这些方法确保了父子组件间的数据同步。
摘要由CSDN通过智能技术生成

使用背景

在登录页面中,在父组件中给子组件(form-input)添加v-model进行数据绑定,发现这种方法根本行不通!那怎么在父组件中使用v-model与子组件进行双向绑定呢?

这行不通啊!

//子组件(form-input)
<template>
  <input type="text">密码
</template>
// 父组件
<template>
  <form-input v-model="password"></form-input>
</template>

结果是这样的:
在这里插入图片描述

解决方法1

子组件

<template>
<div>
  <input type="text" @input="$emit('update:test', $event.target.value)" :value="test">密码
  我是子组件,我也要值:{{ test }}
</div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
  props: {
    test: String
  },
  emits: ['update:test'] // 感觉是多余的,应该是规范问题,如有错误球球纠正我
})
</script>

父组件

<template>
  <form-input v-model:test="password"></form-input>
  <div>我是父组件的v-model绑定的对象:{{password}}</div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'
import FormInput from './components/FormInput.vue'

export default defineComponent({
  name: 'App',
  components: {
    FormInput
  },
  setup () {
    const password = ref('123')
    return {
      password
    }
  }
})
</script>

结果

在这里插入图片描述

解决方法2

子组件

// 子组件
<template>
	<input type="text" @input="updateInput">密码
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'

export default defineComponent({
  props: {
    // modelValue: String 默认的可以不写
    test: String //自定义的
  },
  setup (props, context) {
    const updateInput = (e: InputEvent) => {
      const targetVal = (e.target as HTMLInputElement).value
      // test: 'update:test' 这里我使用test 在props中设置  
      // 默认(modelValue):update:modelValue
      context.emit('update:test', targetVal) //把targetVal的值传到父组件v-model:test绑定的对象
    }
    return {
      updateInput
    }
  }
})
</script>

父组件

// 父组件
<template>
  <form-input v-model:test="password"></form-input> //默认时v-model,自定义的记得v-model:xxx
  <div>我是父组件的v-model:{{password}}</div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'
import FormInput from './components/FormInput.vue'

export default defineComponent({
  name: 'App',
  components: {
    FormInput
  },
  setup () {
    const password = ref('')
    return {
      password
    }
  }
})
</script>

实现啦

在这里插入图片描述

运作流程

(自己的理解,有不对的请纠正一下哈!)
通过@input在输入时,执行updateInput函数。每次输入都会取输入框中的值然后更新targetVal的值,然后emit发出update事件,要求更新父组件中绑定的对象(也就是父组件的password啦),要求更新的值是传过去的targetVal。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值