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>

总结

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

相关文章

  • Vue3使用indexDB缓存静态资源的示例代码

    Vue3使用indexDB缓存静态资源的示例代码

    IndexedDB 是一个浏览器内建的数据库,它可以存放对象格式的数据,默认情况下,浏览器会将自身所在的硬盘位置剩余容量全部作为indexedDB的存储容量,本文给大家介绍了Vue3使用indexDB缓存静态资源,需要的朋友可以参考下
    2024-10-10
  • vue使用Element的Tree树形控件实现拖动改变节点顺序方式

    vue使用Element的Tree树形控件实现拖动改变节点顺序方式

    这篇文章主要介绍了vue使用Element的Tree树形控件实现拖动改变节点顺序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Vue中使用event的坑及解决event is not defined

    Vue中使用event的坑及解决event is not defined

    这篇文章主要介绍了Vue中使用event的坑及解决event is not defined,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue中的请求拦截器和响应拦截器用法及说明

    Vue中的请求拦截器和响应拦截器用法及说明

    这篇文章主要介绍了Vue中的请求拦截器和响应拦截器用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue使用v-bind动态绑定CSS样式

    Vue使用v-bind动态绑定CSS样式

    这篇文章给大家介绍了Vue使用v-bind动态绑定CSS样式,文中有相关的代码示例供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • vue3.0找不到模块“./App.vue”或其相应的类型声明(多种情况分析)

    vue3.0找不到模块“./App.vue”或其相应的类型声明(多种情况分析)

    这篇文章主要介绍了vue3.0找不到模块“./App.vue”或其相应的类型声明,报错原因是typescript 只能理解 .ts 文件,无法理解 .vue文件,本文通过多种情况分析给大家详细讲解,需要的朋友可以参考下
    2023-01-01
  • element-ui中Table表格省市区合并单元格的方法实现

    element-ui中Table表格省市区合并单元格的方法实现

    这篇文章主要介绍了element-ui中Table表格省市区合并单元格的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • vue.config.js打包优化配置

    vue.config.js打包优化配置

    这篇文章主要介绍了vue.config.js打包优化配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Vue 全部生命周期组件梳理整理

    Vue 全部生命周期组件梳理整理

    这篇文章主要介绍了Vue 全部生命周期组件梳理整理,在创建组件之前使用;在实例初始化之后,进行数据侦听和事件,侦听器的配置之前同步调用
    2022-06-06
  • Vue3+Vite4项目进行性能优化的配置方案

    Vue3+Vite4项目进行性能优化的配置方案

    这篇文章主要为大家详细介绍了Vue3如何结合Vite4对项目进行性能优化的相关配置,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04

最新评论