vue学习(七) v-model 双向数据绑定

博客介绍了Vue中v-bind和v-model的数据绑定特点。v-bind只能实现数据从model到view的单向绑定,而v-model可实现表单元素和model中数据的双向绑定,即数据能在model和view间相互传递,并给出了相关效果示例。
//html
<div id="app">
    <input type="text"v-model="msg" style="width:100%">
</div>

//script
<script>
  var vm = new Vue({
    el:'app',
    data:{
      msg:'点击一下'
    }
  })
</script>

说明:

v-bind只能实现数据的单向绑定 从model 自动绑定到 view中,无法实现数据的双向绑定

v-model指令可以实现 表单元素和model中数据的双向绑定 v-model只能运用在表单元素中,即除了能够实现数据从model渲染到到view,也能实现从view中道model中去

 

效果:

页面渲染完成之后,会有一个点击一下 和一个input,input的内容是点击一下   修改input中的值,页面上的点击一下 会随着input内容的变化而变化

转载于:https://www.cnblogs.com/xuchao0506/p/10805269.html

Vue 3 中使用自定义 `v-model` 时,如果不正确地操作数据绑定逻辑,可能会导致**双向绑定陷入死循环(无限递归)**,这通常是因为组件内部直接修改了 `modelValue` 并触发了 `update:modelValue`,但又没有正确处理更新逻辑。 --- ### ✅ 正确实现 Vue 3 自定义 `v-model` 的方式 在 Vue 3 中,你可以通过 `modelValue` 和 `update:modelValue` 实现自定义组件的双向绑定。Vue 3 使用了 `v-model:xxx` 的语法来支持多个双向绑定。 下面是一个防止死循环的示例: ```vue <template> <input :type="type" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> <script setup> const props = defineProps({ modelValue: { type: [String, Number], required: true }, type: { type: String, default: 'text' } }); const emit = defineEmits(['update:modelValue']); </script> ``` #### 使用方式: ```vue <template> <CustomInput v-model="inputValue" /> </template> <script setup> import { ref } from 'vue'; const inputValue = ref(''); </script> ``` --- ### ❌ 死循环常见原因 你可能会写出如下代码导致死循环: ```vue <template> <input :value="modelValue" @input="handleInput" /> </template> <script setup> const props = defineProps(['modelValue']); const emit = defineEmits(['update:modelValue']); function handleInput(e) { emit('update:modelValue', e.target.value); // 错误操作:直接修改 props.modelValue,这会触发 handleInput,导致死循环 props.modelValue = e.target.value; } </script> ``` > ❗错误原因:你不能直接修改 props(Vue 的单项数据流原则),并且在 `@input` 中修改 `props.modelValue` 会再次触发 `@input`,从而造成无限循环。 --- ### ✅ 正确做法 - 不要直接修改 `props.modelValue` - 使用 `$emit('update:modelValue')` 来通知父组件更新 - 父组件通过 `v-model` 传递新,子组件自动更新 --- ### ✅ 多个 v-model 的用法(Vue 3 支持) ```vue <template> <CustomComponent v-model:title="title" v-model:content="content" /> </template> ``` 对应子组件: ```vue <script setup> const props = defineProps(['title', 'content']); const emit = defineEmits(['update:title', 'update:content']); </script> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值