vue使用自定义指令打开dialog

在web后台管理项目中,经常要用到dialog,就vue来说,使用方式则是引入组件,注册,在template中使用。试想一下,如果我们需要在项目中的不同.vue文件中使用该dialog,但是又不想每次都在template中写入组件该如何实现呢?本文我们介绍用指令控制dialog

完整代码见:codesandbox.io/p/sandbox/a…

1. 写一个dialog

既然要展示一个dialog,那么首先我们需要准备一个dialog,供展示用,如下:实现了一个简单的dialog,接收message和visible作为参数

<template>
  <el-dialog
    title="提示"
    :visible.sync="dialogVisible"
    width="30%"
    @close="handleClose"
  >
    <span>这是一段信息: {{ message }}</span>
  </el-dialog>
</template>

<script>
export default {
  components: {},
  props: {
    message: {
      type: String,
      default: "",
    },
    visible: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      dialogVisible: false,
    };
  },
  watch: {
    visible: {
      handler: function (v) {
        this.dialogVisible = v;
      },
      immediate: true,
    },
  },
  methods: {
    handleClose() {
      this.$emit("close");
    },
  },
};
</script>

<style></style>

2. 用自定义指令来控制dialog

弹窗有了,接下来实现个自定义指令来打开它

import Popup from "../components/Popup.vue";
import Vue from "vue";
/**
 * 打开弹窗
 * @param {Object} binding
 */
const openDialog = (binding) => {
  const popupComponent = Vue.extend(Popup);
  const instance = new popupComponent({
    propsData: {
      visible: true,
      message: binding.value,
    },
  });
  instance.$mount();
  document.body.appendChild(instance.$el);
  instance.$on("close", () => {
    document.body.removeChild(instance.$el);
    instance.$destroy();
  });
};

export default {
  bind(el, binding) {
    const handler = () => {
      openDialog(binding);
    };
    el.addEventListener("click", handler);
    el._clickHandler = handler;
  },
  unbind: function (el) {
    el.removeEventListener("click", el._clickHandler);
  },
};

3. 每次渲染新的dialog

如上述代码,我们每次打开都会是一个新的弹窗,所以visible从外面传入其实没什么存在的意义,所以我们将弹窗中的内容再改造下,将visible相关的逻辑删除,dialogVisible默认为true即可。

4.使用该自定义指令

<template>
  <div id="app">
    <div v-popup="msg">点击打开弹窗</div>
  </div>
</template>

<script>
import popup from "./directives/popup";
export default {
  name: "App",
  directives: {
    popup,
  },
  data() {
    return {
      msg: "传递的消息",
    };
  },
};
</script>

效果图示:

image.png

原文转自: https://juejin.cn/post/7389225110312468480

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Element中,你可以使用自定义指令来实现一些特定的功能。在你提供的代码中,你使用了一个自定义指令`v-dialog-drag`来实现拖拽功能。这个指令是通过在外层div上绑定该指令来实现的。当点击打开按钮时,dialog会显示出来,并且可以通过拖拽来移动它的位置。\[1\] 另外,你还提到了如何使用二次确认框Dialog。在你的代码中,你使用了一个自定义的组件`SubDialog`来实现二次确认框的功能。你可以通过调用`proxy.$subDialog`方法来打开二次确认框,并传入相应的参数,比如宽度、是否隐藏标题栏、是否显示关闭按钮等。在确认按钮被点击时,你可以通过回调函数来处理确认操作。\[2\] 最后,在`main.ts`文件中,你需要引入并注册`SubDialog`组件,以便在整个应用程序中可以使用它。你可以使用`createApp`方法创建Vue实例,并通过`use`方法注册`SubDialog`组件。\[3\] #### 引用[.reference_title] - *1* [【vue3】使用自定义指令,实现el-dialog的拖拽功能。](https://blog.csdn.net/Android062005/article/details/126941193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue3封装全局自定义弹框,结合element的el-dialog](https://blog.csdn.net/HelloWorldLJY/article/details/125874489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值