当前位置: 首页 > news >正文

Vue3 v-bind 和 v-model 对比

1. 基本概念

1.1 v-bind

  • 单向数据绑定
  • 从父组件向子组件传递数据
  • 简写形式为 :

1.2 v-model

  • 双向数据绑定
  • 父子组件数据同步
  • 本质是 v-bind 和 v-on 的语法糖

2. 基础用法对比

2.1 表单元素绑定

<!-- v-bind 示例 -->
<template><input :value="text" @input="text = $event.target.value" />
</template><script setup>
import { ref } from 'vue'
const text = ref('')
</script><!-- v-model 示例 -->
<template><input v-model="text" />
</template><script setup>
import { ref } from 'vue'
const text = ref('')
</script>

2.2 组件属性绑定

<!-- v-bind 方式 -->
<template><CustomInput:value="searchText"@input="searchText = $event"/>
</template><!-- v-model 方式 -->
<template><CustomInput v-model="searchText" />
</template>

3. 主要区别

3.1 数据流向

<!-- v-bind: 单向数据流 -->
<ChildComponent:title="pageTitle"  <!-- 数据只能从父组件流向子组件 -->
/><!-- v-model: 双向数据流 -->
<ChildComponentv-model="pageTitle"  <!-- 数据可以双向同步 -->
/>

3.2 实现原理

<!-- v-bind 原理 -->
<ChildComponent :value="value" /><!-- v-model 原理(等价于) -->
<ChildComponent:modelValue="value"@update:modelValue="value = $event"
/>

3.3 自定义组件实现对比

<!-- 使用 v-bind 的组件 -->
<template><div><input:value="value"@input="$emit('input', $event.target.value)"/></div>
</template><script setup>
defineProps(['value'])
defineEmits(['input'])
</script><!-- 使用 v-model 的组件 -->
<template><div><input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)"/></div>
</template><script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script>

4. 使用场景对比

4.1 适合使用 v-bind 的场景

<!-- 1. 纯展示数据 -->
<template><div :class="className"><h1 :title="headerTitle">{{ title }}</h1><img :src="imageUrl" :alt="imageAlt" /></div>
</template><!-- 2. 传递回调函数 -->
<template><button :onClick="handleClick">点击</button>
</template><!-- 3. 动态属性 -->
<template><div :[dynamicProp]="value"></div>
</template>

4.2 适合使用 v-model 的场景

<!-- 1. 表单控件 -->
<template><input v-model="username" /><textarea v-model="description"></textarea><select v-model="selected"><option value="">请选择</option></select>
</template><!-- 2. 自定义组件的数据同步 -->
<template><CustomInput v-model="searchText" /><ColorPicker v-model="themeColor" /><DatePicker v-model="selectedDate" />
</template><!-- 3. 多个数据的双向绑定 -->
<template><UserFormv-model:firstName="user.firstName"v-model:lastName="user.lastName"/>
</template>

5. 性能考虑

5.1 v-bind

  • 单向数据流,性能开销较小
  • 适合大量数据的展示场景
  • 不会触发额外的更新事件

5.2 v-model

  • 双向绑定,需要监听变化
  • 涉及父子组件的数据同步
  • 可能触发多次更新

6. 最佳实践

  1. 选择原则

    • 仅需展示数据时使用 v-bind
    • 需要数据同步时使用 v-model
    • 考虑性能影响选择合适的方式
  2. 代码可维护性

    • v-bind 更直观,易于追踪数据流向
    • v-model 代码更简洁,但需要注意数据追踪
  3. 性能优化

    • 合理使用计算属性
    • 避免不必要的双向绑定
    • 大量数据展示场景优先使用 v-bind
http://www.lryc.cn/news/529827.html

相关文章:

  • Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?
  • KVM/ARM——基于ARM虚拟化扩展的VMM
  • Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
  • 【架构面试】二、消息队列和MySQL和Redis
  • 算法【完全背包】
  • 二叉树的遍历
  • 1.31 实现五个线程的同步
  • three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
  • 【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)
  • 《大数据时代“快刀”:Flink实时数据处理框架优势全解析》
  • antdesignvue统计数据源条数、计算某列合计值、小数计算不精确多了很多小数位
  • 02.05、链表求和
  • dmfldr实战
  • Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
  • 爬虫基础(二)Web网页的基本原理
  • 外网访问禅道软件项目管理系统
  • Python 梯度下降法(五):Adam Optimize
  • 笔试-二进制
  • springboot 2.7.6 security mysql redis jwt配置例子
  • FreeRTOS从入门到精通 第十六章(任务通知)
  • TensorFlow 简单的二分类神经网络的训练和应用流程
  • 无人机图传模块 wfb-ng openipc-fpv,4G
  • .cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?
  • 【MyDB】4-VersionManager 之 3-死锁及超时检测
  • 【Linux】使用管道实现一个简易版本的进程池
  • 【OpenGL】OpenGL游戏案例(二)
  • 28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
  • Java 泛型<? extends Object>
  • FPGA|使用quartus II通过AS下载POF固件
  • “新月之智”智能战术头盔系统(CITHS)