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

【Vue】深入理解v-model指令-父子组件数据绑定

一、什么是v-model?

v-model是Vue.js中的一个指令,用于在表单元素上实现数据的双向绑定。简单来说,v-model可以让我们轻松地读取和更新数据,无需手动操作DOM。

二、标签选择器组件分析

我们先来看一下子组件的代码:

<template>
  <el-select
    v-model="tags"
    multiple
    filterable
    allow-create
    default-first-option
    :reserve-keyword="false"
    placeholder="可输入添加标签"
    @change="updateTagsValue"
  >
    <el-option
      v-for="item in tagsList"
      :key="item.ID"
      :label="item.label"
      :value="item.label"
    />
  </el-select>
</template>

在这个组件中,我们使用了Element UI的组件来实现多选标签功能。通过v-model指令,我们将tags变量与组件的值进行了双向绑定。

三、v-model在子组件中的应用

在子组件的

const emits = defineEmits(['blur', 'update:tags']);
const props = defineProps({
  tags: {
    type: Array,
    default: [],
  },
});
watch(
  () => props.tags,
  (vals) => {
    tags.value = vals;
  },
  {
    deep: true,
    immediate: true,
  }
);

这里,我们通过defineEmits定义了一个自定义事件update:tags,用于在子组件中更新tags的值。同时,我们通过defineProps接收父组件传递的tags数组。

当props.tags发生变化时,我们通过watch监听器将新的值赋给tags.value,从而实现数据的双向绑定。

四、v-model在父组件中的应用

在父组件中,我们这样使用标签选择器组件:

<TagSelector v-model:tags="formData.tags" />

这里的v-model:tags实际上是一个语法糖,它等同于:

<TagSelector :tags="formData.tags" @update:tags="formData.tags = $event" />

当子组件中的tags值发生变化时,会触发update:tags事件,并将新的值传递给父组件。父组件通过监听这个事件,更新formData.tags的值,从而实现数据的双向绑定。

五、完整示例

子组件

<template>
  <el-select
    v-model="tags"
    multiple
    filterable
    allow-create
    default-first-option
    :reserve-keyword="false"
    placeholder="可输入添加标签"
    @change="updateTagsValue"
  >
    <el-option
      v-for="item in tagsList"
      :key="item.ID"
      :label="item.label"
      :value="item.label"
    />
  </el-select>
</template>

<script setup>
defineOptions({
  name: 'TagSelector',
});

import { watch, ref, onMounted } from 'vue';
import { getTagList } from '@/api/code_quest/tag';

const tagsList = ref([]);
const tags = ref([]);

const emits = defineEmits(['blur', 'update:tags']);
const props = defineProps({
  tags: {
    type: Array,
    default: [],
  },
});

onMounted(() => {
  updateTags();
});

const updateTagsValue = (vals) => {
  emits('update:tags', vals);
};
const updateTags = async () => {
  const res = await getTagList({ pageSize: 9999 });
  if (res.code === 0) {
    tagsList.value = res.data.list;
  }
};

watch(
  () => props.tags,
  (vals) => {
    tags.value = vals;
  },
  {
    deep: true,
    immediate: true,
  }
);
</script>

父组件使用

<TagSelector v-model:tags="formData.tags" />

六、总结

通过本文的讲解,我们了解了v-model在Vue组件中的应用。利用v-model,我们可以轻松实现父子组件之间的数据双向绑定,提高代码的可维护性和简洁性。在实际开发中,掌握v-model的使用技巧对于提高开发效率具有重要意义。


http://www.kler.cn/a/458934.html

相关文章:

  • 联发科MTK6771/MT6771安卓核心板规格参数介绍
  • 海南省大数据发展中心:数据资产场景化评估案例手册(第二期)
  • Vue项目中生成node_modules文件夹的两种常用方法及npm优势
  • MySQL8安装与卸载
  • 啥是大模型
  • 小程序发版后,强制更新为最新版本
  • AI生成视频字幕--VideoCaptioner/卡卡字幕助手
  • 【Java】深入了解 Java 中的 split() 方法
  • 什么是Spring Boot 应用开发?
  • VuePress搭建个人博客
  • 根据 business_group的值在 Django 管理员界面中显示不同字段
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之7 附件(文档)
  • 项目基本配置
  • Xshell日志录制
  • Java:190 基于SSM的药品管理系统
  • 计算机毕设-基于springboot的食品厂管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • 计算机视觉目标检测-2
  • 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据
  • 单机部署elasticsearch集群
  • torch.save的用法
  • 机器学习中的常用特征选择方法及其应用案例
  • 【Qt】多元素控件:QListWidget、QTableWidget、QTreeWidget
  • I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
  • 2024年12月28日人工智能与科技新闻速递
  • 使用 MediaDevices API 录制和下载视频教程
  • 基于Spring Boot + Vue3实现的在线预约看房管理系统源码+文档