vue2 以及 vue3 自定义组件使用 v-model使用默认值以及自定义事件

文章介绍了Vue2和Vue3中自定义组件如何使用v-model,包括默认值设定、事件处理(如input和update:modelValue)以及如何根据需要自定义prop和事件名。着重展示了在ElementUI和ElementPlus中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue2 以及 vue3 自定义组件使用 v-model使用默认值以及自定义事件

1. vue2 自定义组件的 v-model

  1. vue2官网,自定义组件
  2. 官方解释:一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件
  3. 上代码
  4. 代码中使用了 element-ui

子组件 使用默认 value 和input 事件


// dialog.vue

<template>
  <el-dialog
    title="提示"
    :visible.sync="value"
    width="30%"
    :before-close="handleClose"
  >
    <span>2222222</span>
    <span slot="footer" class="dialog-footer">
      <el-button @click="handleClose">取 消</el-button>
      <el-button type="primary" @click="submit">确 定</el-button>
    </span>
  </el-dialog>
</template>
<script>
export default {
  props: {
    value: {
      type: Boolean,
      default: () => false,
    },
  },
  methods: {
    // 取消
    handleClose() {
      // 弹窗关闭 默认的event事件为 input
      this.$emit("input", false);
    },
    // 提交
    submit() {},
  },
};
</script>

父组件使用

<template>
  <div>
    <el-button type="primary" @click="visible = true">打开弹窗</el-button> 
    <Dialog v-model="visible"></Dialog>
  </div>
</template>
<script>
import Dialog from "@/components/dialog.vue";
export default {
  components: {
    Dialog,
  },
  data() {
    return {
      visible: false,
    };
  },
  methods:{
    changeDialog(data){
       console.log(data)
       this.text = data
    },
  }
};
</script>
  1. 官方解释后半段:自定义 prop 和 事件名 像单选框、复选框等类型的输入控件可能会将 value attribute 用于不同的目的。model 选项可以用来避免

子组件

<template>
  <el-dialog
    title="提示"
    :visible.sync="visible"
    width="30%"
    :before-close="handleClose"
  >
    <span>2222222</span>
    <span slot="footer" class="dialog-footer">
      <el-button @click="handleClose">取 消</el-button>
      <el-button type="primary" @click="submit">确 定</el-button>
    </span>
  </el-dialog>
</template>
<script>
export default {
  model: {
    prop: "visible",
    event: "update", // 为了避免事件名称冲突 此处可以自定义方法名
  },
  props: {
    visible: {
      type: Boolean,
      default: () => false,
    },
  },
  data() {
    return {};
  },
  methods: {
    // 取消
    handleClose() {
      //   使用自定义方法名 和上面这行代码效果一致
      this.$emit("update", false);
    },
    // 提交
    submit() {},
  },
};
</script>

父组件

<template>
  <div>
    <el-button type="primary" @click="visible = true">打开弹窗</el-button> 
    <Dialog v-model="visible"></Dialog>
  </div>
</template>
<script>
import Dialog from "@/components/dialog.vue";
export default {
  components: {
    Dialog,
  },
  data() {
    return {
      visible: false,
    };
  },
  methods:{
    changeDialog(data){
       console.log(data)
       this.text = data
    },
  }
};
</script>

2. vue3 自定义组件的 v-model

  1. vue3官网,自定义组件
  2. 官方解释:默认情况下,v-model 在组件上都是使用 modelValue 作为 prop,并以 update:modelValue 作为对应的事件
  3. 上代码
  4. 代码中使用了 element-plus

子组件 使用默认 modelValue 和 update:modelValue事件

// 子组件   dialog.vue
<template>
  <el-dialog
    v-model="props.modelValue"
    title="Tips"
    width="30%"
    :before-close="handleClose"
  >
    <span>This is a message</span>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="handleClose">取消</el-button>
        <el-button type="primary" @click="submit"> 确定 </el-button>
      </span>
    </template>
  </el-dialog>
</template>
      
<script setup lang="ts">
// 接受数据
const props = defineProps({
  modelValue: {
    type: Boolean,
    default: () => false,
  },
});

// 注册事件
const emit = defineEmits(["update:modelValue"]);

// 关闭
const handleClose = () => {
  emit("update:modelValue", false);
};
// 提交
const submit = () => {};
</script>

父组件

<template>
  <div>
    <el-button text @click="visible = true"> 打开弹窗 </el-button>
    <!-- 第一种方式 使用默认方式 -->
    <Dialog v-model="visible"></Dialog>
  </div>
</template>
    
<script setup lang="ts">
import Dialog from "@/components/dialog.vue";
import { ref } from "vue";

const visible = ref(false);
</script>
  1. 官方解释后半段:自定义 prop 和 事件名 我们可以通过给 v-model 指定一个参数来更改这些名字

子组件

<template>
  <el-dialog
    v-model="props.visible"
    title="Tips"
    width="30%"
    :before-close="handleClose"
  >
    <span>This is a message</span>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="handleClose">取消</el-button>
        <el-button type="primary" @click="submit"> 确定 </el-button>
      </span>
    </template>
  </el-dialog>
</template>
      
<script setup lang="ts">
// 接受数据
const props = defineProps({
    visible: {
    type: Boolean,
    default: () => false,
  },
});

// 注册事件
const emit = defineEmits(["update:visible"]);

// 关闭
const handleClose = () => {
  emit("update:visible", false);
};
// 提交
const submit = () => {};
</script>

父组件

<template>
  <div>
    <el-button text @click="visible = true"> 打开弹窗 </el-button>
    <!-- 第二种方式 自定义props 名称为 visible -->
    <Dialog v-model:visible="visible"></Dialog>
  </div>
</template>
    
<script setup lang="ts" name="debounceDirect">
import Dialog from "@/components/dialog.vue";
import { ref } from "vue";

const visible = ref(false);
</script>

以上就是vue2或者vue3 自定义组件 v-model 的使用!

<think>好的,我现在要回答用户关于Vue3自定义组件的v-modelinput标签的v-model语法糖是否相同以及区别的问题。首先,我需要回忆一下Vue3的相关文档引用内容,确保信息准确。 根据用户提供的引用,引用[1]提到v-model对于input元素等同于v-bind:valuev-on:input的组合。而引用[3]指出,在Vue3中,自定义组件的v-model默认使用props.modelValue事件update:modelValue,而Vue2是valueinput。这说明两者在实现机制上有差异,尤其是在prop事件名称上。 接下来,我需要对比两者的语法糖结构。对于input标签,v-model直接绑定到value属性,并监听input事件。而自定义组件则需要显式定义modelValue属性emit update:modelValue事件,或者使用参数来改变默认行为。例如,用户可以自定义属性名,如v-model:title,这时prop变为title,事件变为update:title,这增加了灵活性。 另外,Vue3允许在单个组件使用多个v-model绑定,这是Vue2不具备的功能。这也需要提到,说明自定义组件在功能上的扩展。 还需要注意默认值事件触发的区别。input标签自动处理,而自定义组件需要手动设置prop事件。同时,参数传递的方式不同,自定义组件需要更明确的声明。 最后,总结两者的异同,确保回答结构清晰,分点列出相同点不同点,帮助用户一目了然。同时生成相关问题,如实现方式、多v-model使用默认属性差异等,引导进一步学习。</think>### Vue3 自定义组件 v-model 与 input 标签 v-model 语法糖的异同 #### **1. 语法糖的底层实现** - **input 标签的 v-model** 等价于 `:value` 绑定属性 `@input` 事件监听,例如: ```html <input :value="data" @input="data = $event.target.value"> ``` 用户输入时自动触发 `input` 事件更新数据[^1]。 - **自定义组件的 v-model** 默认等价于 `:modelValue` 属性绑定 `@update:modelValue` 事件监听。例如: ```html <CustomComponent :modelValue="data" @update:modelValue="newValue => data = newValue" /> ``` 需要组件内部通过 `props` 接收 `modelValue` 并通过 `emit(&#39;update:modelValue&#39;)` 触发更新[^3]。 #### **2. 默认属性与事件名称的差异** - **input 标签** 固定使用 `value` 属性 `input` 事件Vue2Vue3行为一致)[^1][^2]。 - **自定义组件** Vue3 默认使用 `modelValue` 属性 `update:modelValue` 事件Vue2 为 `value` `input`),且支持通过参数修改默认名称,例如 `v-model:title` 会绑定到 `title` 属性 `update:title` 事件。 #### **3. 灵活性对比** - **input 标签** 语法糖行为固定,不可修改属性事件名称。 - **自定义组件** 支持两种扩展方式: 1. 通过 `v-model:param` 指定自定义属性事件名称; 2. 通过组件的 `model` 配置(Vue3 已弃用,推荐使用参数形式)[^3]。 #### **4. 多 v-model 绑定支持** - **input 标签** 单个元素仅支持一个 `v-model`。 - **自定义组件** Vue3 允许在单个组件上绑定多个 `v-model`,例如: ```html <UserForm v-model:name="name" v-model:age="age" /> ``` 对应组件需定义 `name` `age` 属性,并触发 `update:name` `update:age` 事件。 #### **总结异同** | 特性 | input 标签 v-model | 自定义组件 v-model | |---------------------|---------------------------|----------------------------| | 默认属性名 | `value` | `modelValue` | | 默认事件名 | `input` | `update:modelValue` | | 多绑定支持 | 否 | 是(Vue3) | | 自定义属性/事件名称 | 否 | 是(通过参数) | | 底层实现 | `:value + @input` | `:modelValue + @update:modelValue` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值