首页 > 其他分享 >vue项目子组件使用 dialog 弹框,如何实现父子组件弹框展示状态关联?

vue项目子组件使用 dialog 弹框,如何实现父子组件弹框展示状态关联?

时间:2024-07-03 11:43:46浏览次数:16  
标签:vue sync value update visible dialog 组件 弹框

vue 项目,子组件使用 el-dialog 组件,想要实现在父组件可以控制子组件 dialog 的展示和隐藏,子组件自己可以控制 dialog 展示和隐藏,该如何实现?

1. 子组件(DialogComponent.vue)

子组件接受一个来自父组件的 prop,用来控制 dialog 的显示状态,并且当子组件内部需要改变 dialog 状态时,通过 $emit 发送一个事件给父组件。

<template>  
  <el-dialog  
    :visible.sync="localVisible"  
    title="提示"  
    @close="handleClose"  
  >  
    <!-- Dialog 内容 -->  
  </el-dialog>  
</template>  
  
<script>  
export default {  
  props: {  
    visible: {  
      type: Boolean,  
      default: false  
    }  
  },  
  data() {  
    return {  
      localVisible: this.visible  
    };  
  },  
  watch: {  
    visible(newVal) {  
      this.localVisible = newVal;  
    },  
    localVisible(newVal) {  
      this.$emit('update:visible', newVal);  
    }  
  },  
  methods: {  
    handleClose() {  
      this.localVisible = false;  
      // 如果需要,可以添加逻辑处理,如:  
      // this.$emit('someEvent', data);  
    }  
  }  
};  
</script>

注意:这里使用了 .sync 修饰符的简化版(.sync 本质上是监听一个自定义的 update 事件并更新 prop)。但在 Vue 3 中,.sync 修饰符的使用有所变化,并且在这里为了更清楚地展示过程,我们直接使用了 watch 和 $emit

2. 父组件

在父组件中,你定义一个变量来控制 dialog 的显示,并将这个变量传递给子组件作为 prop。同时,监听子组件发出的 update:visible 事件来更新这个变量。

<template>  
  <div>  
    <button @click="showDialog = true">打开 Dialog</button>  
    <DialogComponent :visible="showDialog" @update:visible="showDialog = $event" />  
  </div>  
</template>  
  
<script>  
import DialogComponent from './DialogComponent.vue';  
  
export default {  
  components: {  
    DialogComponent  
  },  
  data() {  
    return {  
      showDialog: false  
    };  
  }  
};  
</script>

3. 注意事项

  • .sync 修饰符的替代:在 Vue 3 中,.sync 修饰符的使用方式有所变化,但在这个例子中,我们直接使用了 watch 和 $emit 来达到 .sync 类似的效果,以便更清晰地理解数据流动的过程。
  • 组件间的通信:通过 props 和自定义事件(emit)是 Vue 组件间通信的基本方式之一,适用于父子组件之间的通信。
  • 状态管理:对于更复杂的应用,可能需要考虑使用 Vuex 或 Pinia 等状态管理库来管理跨组件的状态。

4..sync 修饰符的使用

.sync 修饰符在 Vue 3 中的使用方式有所变化。在 Vue 3 中,.sync 修饰符不再会隐式地监听 update: 开头的事件,而是被视为一个普通的自定义事件监听器的前缀,你仍然需要在子组件中显式地 $emit 带有 update: 前缀的事件,但 Vue 3 提供了 v-model 的多个变体来支持更复杂的场景,包括自定义组件的双向绑定。

子组件:

<template>  
  <div>  
    <!-- 假设我们有一个方法用来更新 value -->  
    <button @click="updateValue">Update</button>  
  </div>  
</template>  
  
<script>  
export default {  
  props: ['value'],  
  methods: {  
    updateValue() {  
      // 发送一个 update:value 事件,并传递新的值  
      this.$emit('update:value', newValue);  
    }  
  }  
}  
</script>

父组件:

<template>  
  <child-component :value.sync="someData"></child-component>  
</template>  
  
<script>  
import ChildComponent from './ChildComponent.vue';  
  
export default {  
  components: {  
    ChildComponent  
  },  
  data() {  
    return {  
      someData: 'initial value'  
    };  
  }  
}  
</script>

 

在这个例子中,.sync 修饰符使得父组件可以监听 update:value 事件,并自动将 someData 更新为事件传递过来的新值,而不需要显式地在父组件的模板中写 @update:value="someData = $event"

5、优化方案

<template>  
  <el-dialog  
    v-model:visible="visible"  
    title="提示"  
    @close="handleClose"  
  >  
    <!-- Dialog 内容 -->  
  </el-dialog>  
</template>  
  
<script>  
export default {  
  props: {  
    modelValue: {  
      type: Boolean,  
      default: false  
    }  
  },  
  computed: {  
    // 使用 computed 属性来代理 prop,这样可以在模板中直接使用 visible  
    visible: {  
      get() {  
        return this.modelValue;  
      },  
      set(value) {  
        this.$emit('update:modelValue', value);  
      }  
    }  
  },  
  methods: {  
    handleClose() {  
      this.visible = false; // 触发 setter,从而发出 update:modelValue 事件  
    }  
  }  
};  
</script>

使用 v-model 而不是 .sync:
在 Vue 3 中,虽然 .sync 修饰符仍然可用,但推荐使用 v-model 的变体来实现双向绑定。对于自定义组件,可以通过 modelValue 和 update:modelValue 来实现这一点。
简化子组件逻辑:
子组件可以只负责发出更新事件,而不必维护一个本地的 localVisible 状态。

上面的代码中,使用了 v-model:visible 来绑定 el-dialog 的 visible 属性,但这通常不是 el-dialog 组件的标准用法,因为 el-dialog 并不直接支持 v-model。实际上,你应该直接监听 close 事件并在父组件中处理它,或者通过其他方式(如上面的 handleClose 方法)来控制显示状态。但为了展示如何使用 v-model 在自定义组件中,我保留了这种写法。

dialog

<template>  
  <el-dialog  
    :visible="visible"  
    @close="handleClose"  
    title="提示"  
  >  
    <!-- Dialog 内容 -->  
  </el-dialog>  
</template>  
  
<script>  
export default {  
  props: {  
    modelValue: Boolean  
  },  
  computed: {  
    visible: {  
      get() {  
        return this.modelValue;  
      },  
      set(value) {  
        this.$emit('update:modelValue', value);  
      }  
    }  
  },  
  methods: {  
    handleClose(done) {  
      this.visible = false; // 或者发送一个关闭的确认信号给父组件  
      done(); // 告诉 el-dialog 关闭动画完成  
    }  
  }  
};  
</script>

 

 

标签:vue,sync,value,update,visible,dialog,组件,弹框
From: https://www.cnblogs.com/beileixinqing/p/18281307

相关文章

  • Vue canvas绘制圆形进度条动画加载
    父组件代码:<template> <!--创建--> <divclass="resource-warp-box">  <divclass="center-box">   <divclass="used-source">    <pageTitletitle="已用资源"/>    <div......
  • element plus 日历组件默认中文样式,配置日期周一为周起始日
    elementui或者plus其实都是西方的展示方式,日立组件的周日视为每一周的开始日期,我们则是周日为每周的最后一天。那咱们要改成周一为每周的开始日期,如下图:elementui是可以直接属性配置的,elementplus不得行,但是配置下面代码到main.ts就可以了~importElementPlusfrom'......
  • VuePress 的更多配置
    08.更多配置现在,读者应该对VuePress、主题和插件等有了基本的认识,除了插件,VuePress自身也有很多有用的配置,这里简单说明下。‍‍VuePress的介绍在介绍了VuePress的基本使用、主题和插件的概念之后,我们再来看看官网对于VuePress的介绍,就很好理解了:VuePress由两部分......
  • 掉了两根头发后,我悟了!vue3的scoped原来是这样避免样式污染(下)
    前言在上一篇掉了两根头发后,我悟了!vue3的scoped原来是这样避免样式污染(上)文章中我们讲了使用scoped后,vue是如何给CSS选择器添加对应的属性选择器[data-v-x]。这篇文章我们来接着讲使用了scoped后,vue是如何给html增加自定义属性data-v-x。注:本文中使用的vue版本为3.4.19,@vitejs/......
  • vue 监视属性
    <divid="root"><h2>今天天气很{{info}}</h2><button@click="changeWeather">切换天气</button><hr/><h3>a的值是{{numbers.a}}</h3><button@click="add">点我让a+1</bu......
  • 树组件实现
    作用提供一个通用的树组件模型,用于将元素列表转成树节点。实现元素节点定义publicinterfaceTreeNodeElement{/***当前节点key*/StringgetKey();/***父节点key*/StringgetParentKey();}树节点定义packagecom.wangta......
  • 基于SpringBoot+Vue+uniapp的论文管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • vue2项目的打包以及部署
        打包          当我们写好vue2的项目后,可以通过npmbuild来对项目进行打包npmbuild        打包完成后我们可以看到在当面目录下生成了dis目录,src下的文件都会被打包进这个目录里,当然打包后的文件我们不能直接在浏览器打开,需要进行部署......
  • java基于ssm+vue 大学生兼职信息系统
    1管理员登录管理员输入个人的用户名、密码和角色登录系统,这时候系统的数据库就会在进行查找相关的信息,如果我们输入的用户名、密码和角色不正确,数据库就会提示出错误的信息提示,同时会提示管理员重新输入自己的用户名、密码、角色,直到账号密码输入成功后,会提登录成功的信息。......
  • 前端vue3项目dagre-d3基础配置项及流程图组件示例(包括安装依赖)
    目录引言d3是什么?dagre是什么?dagre-d3是什么?dagre-d3配置项流程图示例依赖安装组件示例总结引言因为很多文档都是英文,刚开始调研的时候比较费劲,文档里的配置像示例又比较分散,就自己整理了一下,附上测试时写的示例d3是什么?d3.js 是一个强大的JavaScript库,用于在......