Vue3中如何自定义双向绑定

 更新时间:2023年11月16日 09:01:43   作者:青颜的天空  
这篇文章主要介绍了Vue3中如何自定义双向绑定问题,具有很好的参考价价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.父组件绑定变化

vue2中父组件通过v-model绑定,子组件默认接收一个value属性

vue3中需要通过v-model指定一个需要绑定的属性名称

   <!-- 通过:后面指定子组件接收的props名称 -->
   <AddBook v-model:dialogVisible="addFormVisible"></AddBook>

2. 子组件通过props接收

然后在setup函数中,通过watch监听,定义一个中间变量。

1)emits:Vue3新增属性,定义子组件通过emit传递给父组件的事件名称,以及通过事件传递的参数

2)Vue3需要通过update方法可以实现双向绑定

<template>
  <el-dialog class="add-book-dialog" :title="target && target._id ? '编辑账本': '添加账本'"
             :close-on-click-modal="false"
             v-model="dialogVisibleData">
    <el-form :model="targetForm" :rules="rules" ref="bookForm">
     ...
    </el-form>
    <template #footer>
    <span class="dialog-footer">
      <el-button @click="cancel">取 消</el-button>
      <el-button type="primary" @click="save">确 定</el-button>
    </span>
    </template>
  </el-dialog>
</template>

<script lang="ts">
import { reactive, ref, watch, toRefs, readonly, defineComponent } from 'vue';

export default defineComponent({
  // 触发的事件的名称
  emits: {
    'update:dialogVisible': (val: boolean) => {
      return val;
    }
  },
  props: {
   ...
    dialogVisible: { // 是否显示模态框
      type: Boolean,
      default: false
    },
  },
  setup(props, { emit }) {
    const { dialogVisible } = toRefs(props) as any;
    let dialogVisibleData = ref(false);
    const cancel = () => {
      dialogVisibleData.value = false;
      // 可以直接emit update事件,也可以改变dialogVisibleData value值,触发watch监听
      emit('update:dialogVisible', dialogVisibleData.value);
    };
    // 监听props中dialogVisible值
    watch(() => dialogVisible.value, (newValue: boolean, oldValue: boolean) => {
      dialogVisibleData.value = newValue;
      console.log(oldValue, newValue, '改变');
    });
    watch(() => dialogVisibleData.value, (newVal: boolean, oldVal: boolean) => {
      emit('update:dialogVisible', newVal);
    });
    return { dialogVisibleData, cancel };
  },
});
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 7个适用于Vue 3的高颜值UI组件库

    7个适用于Vue 3的高颜值UI组件库

    这篇文章主要给大家分享介绍了7个适用于Vue 3的高颜值UI组件库,合理利用,又或者学习借鉴都是不错的选择,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 快速解决 keep-alive 缓存组件中定时器干扰问题

    快速解决 keep-alive 缓存组件中定时器干扰问题

    文章介绍了在使用keep-alive缓存组件时,如何在组件被缓存后清理定时器以避免干扰其他组件的逻辑,通过在deactivated钩子中清理定时器,可以确保组件被缓存时不会继续运行定时器,感兴趣的朋友一起看看吧
    2025-02-02
  • vue前端框架—Mint UI详解(更适用于移动端)

    vue前端框架—Mint UI详解(更适用于移动端)

    这篇文章主要介绍了vue前端框架—Mint UI的详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Vue中的v-model 和 :value 深度解析

    Vue中的v-model 和 :value 深度解析

    本文详细解析了Vue中的v-model和:value两种绑定方式的区别、使用场景以及最佳实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2026-01-01
  • vue2.0 获取从http接口中获取数据,组件开发,路由配置方式

    vue2.0 获取从http接口中获取数据,组件开发,路由配置方式

    今天小编就为大家分享一篇vue2.0 获取从http接口中获取数据,组件开发,路由配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • ResizeObserver loop limit exceeded报错原因及解决方案

    ResizeObserver loop limit exceeded报错原因及解决方案

    这篇文章主要给大家介绍了关于ResizeObserver loop limit exceeded报错原因及解决的相关资料,公司项目监听系统中发现一个高频错误ResizeObserver loop limit exceeded,而浏览器的console中却没有提示,需要的朋友可以参考下
    2023-09-09
  • Ant Design Vue Table组件合并单元格方式

    Ant Design Vue Table组件合并单元格方式

    这篇文章主要介绍了Ant Design Vue Table组件合并单元格方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解Vue 开发模式下跨域问题

    详解Vue 开发模式下跨域问题

    本篇文章主要介绍了Vue 开发模式下跨域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • elementui 开始结束时间可以选择同一天不同时间段的实现代码

    elementui 开始结束时间可以选择同一天不同时间段的实现代码

    这篇文章主要介绍了elementui 开始结束时间可以选择同一天不同时间段的实现代码,需要先在main.js中导入相应代码,代码简单易懂,需要的朋友可以参考下
    2024-02-02
  • 对Vue beforeRouteEnter 的next执行时机详解

    对Vue beforeRouteEnter 的next执行时机详解

    今天小编就为大家分享一篇对Vue beforeRouteEnter 的next执行时机详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08

最新评论