Vue 3 中使用 const model=defineModel() 简化 v-model 的技巧

当我们在 Vue 3 中处理表单输入时,经常会使用 v-model 来实现数据的双向绑定。然而,在某些情况下,我们可能需要对 v-model 进行一些额外的处理,例如对输入值进行格式化、验证或者其他操作。这时,可以使用 const model = defineModel(); 来简化 v-model 的使用,并使代码更加清晰和易于维护。

问题背景

在 Vue 3 中,当我们想要创建一个带有自定义逻辑的双向绑定输入框时,通常会这样写:

javascript 复制代码
<template>
  <el-select style="width:100%;" :size="styleSize" clearable filterable @change="changeData" v-model="selectValue"
             placeholder="请选择">
    <el-option
        v-for="item in options"
        :key="item.dataCode"
        :label="item.dataCode"
        :value="item.dataValue">
    </el-option>
  </el-select>
</template>

<script>
export default {
  name: "nb-select",
  props: ['value', "catalog", "size"],
  data: function () {
    return {
      selectValue: "",
      loading: false,
      options: [],
      styleSize: "normal"
    }
  },
  mounted: function () {
    console.info("init");
    this.loadData();
    this.selectValue = this.value;
    if (this.size != null && this.size != "") {
      this.styleSize = this.size;
    }
  },
  watch: {
    value: function (val) {
      this.selectValue = val;
    }
  },
  methods: {
    async loadData() {
      let param = {};
      param.dictKey = this.catalog;
      let res = await this.$http.form("/dictItem/list", param);
      if (res.code === 200) {
        this.options = res.data;
      }

    },
    changeData(value) {
      console.info(value);
      this.$emit('input', value);
    }
  }
}
</script>

<style scoped>

</style>

这种方式虽然可以实现双向绑定,但是当涉及到多个输入框时,代码会显得重复而冗长。

使用 const model = defineModel();

Vue 3 提供了一个工具函数 defineModel(),它可以帮助我们简化 v-model 的使用,并更好地组织代码。

javascript 复制代码
<template>
  <el-select style="width:100%;"   clearable filterable  v-model="model" >
    <el-option
        v-for="item in options"
        :key="item.dataCode"
        :label="item.dataCode"
        :value="item.dataValue">
    </el-option>
  </el-select>
</template>

<script setup>
import {useLoadData} from "@/uses/useLoadData";

const model=defineModel();
const props=defineProps({
  dictKey: {
    type: String,
    default: ""
  }
})

let param = {
  dictKey: props.dictKey,
};
const {data:options}= useLoadData("/dictItem/list",param);

</script>

<style scoped>

</style>

通过上面的代码,我们可以看到 const model = defineModel(); 的用法。这里的 model 就相当于我们之前手动创建的 inputValue,但它更加灵活和通用。

defineModel() 的优势

  • 简化代码 :使用 const model = defineModel(); 可以减少重复的代码,使得代码更加简洁清晰。
  • 更好的组织代码 :将 v-model 的处理逻辑统一到一个地方,便于维护和管理。
  • 灵活性defineModel() 可以处理任意类型的输入,包括表单输入、复杂组件等。

示例:自定义输入框组件

下面是一个简单的示例,展示如何使用 const model = defineModel(); 创建一个自定义的输入框组件,并添加了一些自定义的逻辑:

javascript 复制代码
<template>
  <input
    :value="model"
    @input="handleInput"
    @blur="handleBlur"
  />
</template>

<script setup>
import { defineModel } from 'vue';

const model = defineModel();


// 处理输入事件
const handleInput = (event) => {
  const newValue = event.target.value.toUpperCase(); // 将输入值转换为大写
  model.value = newValue;
};

// 处理失焦事件
const handleBlur = () => {
  console.log('Input blurred');
};
</script>

在这个示例中,我们使用 const model = defineModel(); 来简化双向绑定,同时添加了自定义的输入处理逻辑和失焦处理逻辑。

总体来说,const model = defineModel(); 是一个非常方便的工具函数,能够帮助我们更好地处理 v-model,简化代码,提高开发效率。在实际开发中,可以根据需要结合自定义逻辑,更灵活地处理表单输入和其他交互操作。

相关推荐
李剑一20 小时前
uni-app实现leaflet地图图标旋转
前端·trae
zhengxianyi51520 小时前
ruoyi-vue-pro优化——如何将一个模块快速变成一个独立的应用进行开发,部署,管理
vue.js·前后端分离·数据大屏·ruoyi-vue-pro优化
风度前端21 小时前
npm 2026安全新规下的免登录发包策略
前端
冴羽21 小时前
2026 年前端必须掌握的 4 个 CSS 新特性!
前端·javascript·css
rgeshfgreh21 小时前
Python流程控制:从条件到循环实战
前端·数据库·python
狗头大军之江苏分军21 小时前
告别旧生态:Ant Design 6 不再支持 IE 与现代前端趋势解读
前端·javascript·后端
C_心欲无痕21 小时前
nginx - 开启 gzip 压缩
运维·前端·nginx
闲云一鹤1 天前
2026 最新 ComfyUI 教程 - 本地部署 AI 生图模型 - Z-Image-Turbo
前端·人工智能·ai编程
开开心心_Every1 天前
安卓后台录像APP:息屏录存片段,行车用
java·服务器·前端·学习·eclipse·edge·powerpoint
狗头大军之江苏分军1 天前
Ant Design 6.0 正式发布:从 V5 到 V6 有哪些变化?
前端