Vue组件解析之如何自定义弹窗组件ByDialog

 更新时间:2024年01月11日 09:54:37   作者:Leo_Mr  
这篇文章主要介绍了Vue组件解析之如何自定义弹窗组件ByDialog问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在Vue.js前端开发中,弹窗组件是常见的交互元素之一。

为了提高开发效率并保持代码的可维护性,我们可以创建自定义弹窗组件。

本文将详细解析Vue.js结合ElementUi自定义弹窗组件ByDialog的实现原理和使用示例,并提供相关代码和注释。

ByDialog组件代码

下面是ByDialog组件的完整代码:

<template>
  <!-- 
    el组件的大部分属性在by-dialog标签上都可以使用,如果某属性或事件不生效可以在by-dialog组件中    去扩展        
   (例如通过props)
    -->
  <el-dialog
    :title="title"
    :visible="visible"
    v-bind="$attrs"
    v-on="$listeners"
    @close="$emit('cancel')"
    :width="width"
    @touchmove.prevent
    class="by-dialog"
  >
    <div class="by-dialog-content">
      <slot></slot>
    </div>
    <slot name="footer" slot="footer">
      <el-button @click="$emit('ok')" type="primary">{{ okText }}</el-button>
      <el-button @click="$emit('cancel')">{{ cancelText }}</el-button>
    </slot>
  </el-dialog>
</template>
<script>
export default {
  name: 'ByDialog',
  props: {
    // 弹框的显示隐藏
    value: {
      type: Boolean,
      default: false,
    },
    // 确定按钮文本
    okText: {
      type: String,
      default: '确定',
    },
    // 取消按钮文本
    cancelText: {
      type: String,
      default: '取消',
    },
    // 弹框标题
    title: {
      type: String,
      default: '',
    },
    // 弹框的宽度
    width: {
      type: String,
      default: '600px',
    },
  },
  computed: {
    visible: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('input', val);
      },
    },
  },
  methods: {
  },
};
</script>
<style scoped>
.by-dialog-content {
  max-height: 500px;
  overflow-y: auto;
}
</style>

ByDialog组件详解

下面对ByDialog组件的关键部分进行详细解释:

模板部分

  • el-dialog是Element UI库提供的弹窗组件,我们在此基础上进行扩展和定制。
  • :title属性绑定了弹窗的标题,可以通过父组件传递属性进行自定义。
  • :visible属性控制弹窗的显示与隐藏,我们使用了双向绑定,即通过v-model将组件内部的visible属性与外部的value属性进行关联。
  • v-bind="$attrs"v-on="$listeners"用于将父组件传递的属性和事件绑定到内部的el-dialog组件上,以实现属性和事件的传递和继承。
  • @close事件绑定了$emit('cancel'),当弹窗关闭时触发,向父组件传递取消按钮被点击的信号。
  • :width属性控制弹窗的宽度,可以根据实际需求进行自定义。
  • @touchmove.prevent阻止在触摸设备上滚动弹窗时的默认滚动行为。

插槽部分

  • <slot></slot>标签用于显示弹窗的主要内容,父组件可以在使用<by-dialog>标签时插入自定义的内容。
  • <slot name="footer" slot="footer"></slot>定义了名为footer的插槽,用于显示弹窗底部的按钮区域。父组件可以通过使用<template v-slot:footer><template #footer>的方式插入自定义的按钮组件或文本。

属性部分

  • value属性是组件的一个props,用于控制弹窗的显示与隐藏,它的类型是布尔型,默认值为false
  • okTextcancelText属性分别用于设置确定按钮和取消按钮的文案,默认值分别为"确定"和"取消"。
  • title属性用于设置弹窗的标题,默认值为空字符串。
  • width属性用于设置弹窗的宽度,默认值为"600px"。

计算属性和方法部分

  • visible是一个计算属性,用于对外部的value属性进行双向绑定。通过get方法获取value的值,通过set方法触发input事件,将新的值传递给父组件。
  • close方法用于关闭弹窗,它触发cancel事件,向父组件传递取消按钮被点击的信号。
  • $emit('ok')$emit('cancel')分别用于处理确定按钮和取消按钮的点击事件。在实际应用中,您可以在这两个事件向父组件传递确定跟取消的信号。

样式部分

.by-dialog-content类定义了弹窗内容区域的样式,其中max-height属性限制了内容区域的最大高度,并通过overflow-y属性实现垂直滚动效果。

使用示例

在使用ByDialog组件时,我们可以通过传递不同的属性和事件监听器来实现定制化的弹窗效果。

下面是一个使用示例:

<template>
  <!-- 其他组件内容 -->
  <by-dialog
    title="修改密码"
    width="350px"
    v-model="dialogVisible"
    okText="确认修改"
    cancelText="取消修改"
    @ok="handleOk"
    @cancel="handleCancel"
  >
    <!-- 弹窗内容区域 -->
    <div>
      <label for="password">新密码:</label>
      <input type="password" id="password" v-model="password" />
    </div>
  </by-dialog>
  <!-- 其他组件内容 -->
</template>
<script>
export default {
  // 组件代码
  data() {
    return {
      dialogVisible: false,
      password: '',
    };
  },
  methods: {
    // 其他方法
 
    handleOk() {
      // 处理确认按钮点击事件
      // 执行修改密码操作
      if (this.password !== '') {
        // 执行密码修改逻辑
        this.dialogVisible = false; // 关闭弹窗
        this.password = ''; // 清空密码输入框
        // 其他操作...
      } else {
        // 提示密码不能为空
        // 其他逻辑...
      }
    },
    handleCancel() {
      // 处理取消按钮点击事件
      this.dialogVisible = false; // 关闭弹窗
      this.password = ''; // 清空密码输入框
      // 其他操作...
    },
  },
};
</script>

总结

通过自定义弹窗组件ByDialog,我们可以在Vue.js应用中创建高度定制化的弹窗功能。

通过属性、事件和插槽的灵活运用,我们可以实现各种弹窗样式和交互效果。

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

相关文章

  • vite创建一个标准vue3+ts+pinia项目

    vite创建一个标准vue3+ts+pinia项目

    本文主要介绍了vite创建一个标准vue3+ts+pinia项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 基于Vue实现图书管理功能

    基于Vue实现图书管理功能

    这篇文章主要为大家详细介绍了基于Vue实现图书管理功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 详解Vue computed计算属性是什么

    详解Vue computed计算属性是什么

    在vue中,有时候你需要对data中的数据进行处理,或者对抓取的数据进行处理之后再挂载呈现到标签中,这时候你就需要计算属性了,当然看到这里你可能还是不了解那下面我举几个实例并附代码解释
    2023-03-03
  • 深入了解Vue中Vuex的用法

    深入了解Vue中Vuex的用法

    Vuex的官方解释是一个专为vue.js应用程序开发的状态管理模式,这篇文章主要为大家介绍了Vuex的具体用法,希望对大家深入了解Vuex有一定的帮助
    2023-06-06
  • Vue3+NodeJS+Soket.io实现实时聊天的示例代码

    Vue3+NodeJS+Soket.io实现实时聊天的示例代码

    本文主要介绍了Vue3+NodeJS+Soket.io实现实时聊天的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • vue服务器代理proxyTable配置如何解决跨域

    vue服务器代理proxyTable配置如何解决跨域

    这篇文章主要介绍了vue服务器代理proxyTable配置如何解决跨域问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 详解Vue中AXIOS的封装

    详解Vue中AXIOS的封装

    这篇文章主要为大家介绍了Vue中AXIOS的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Vue向后端传数据后端接收为null问题及解决

    Vue向后端传数据后端接收为null问题及解决

    这篇文章主要介绍了Vue向后端传数据后端接收为null问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue实现定时刷新数据,每隔5分钟执行一次

    vue实现定时刷新数据,每隔5分钟执行一次

    这篇文章主要介绍了vue实现定时刷新数据,每隔5分钟执行一次问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Vue3+ts+setup getCurrentInstance使用时遇到的问题以及解决办法

    Vue3+ts+setup getCurrentInstance使用时遇到的问题以及解决办法

    getCurrentInstance方法用于获取当前组件实例,仅在setup和生命周期中起作用,下面这篇文章主要给大家介绍了关于Vue3+ts+setup getCurrentInstance使用时遇到的问题以及解决办法,需要的朋友可以参考下
    2022-08-08

最新评论