vue3+vite函数式组件,子组件能不需要再次导入element-plus依赖么?

新手上路,请多包涵

在vue3 + vite 的环境下想写一个函数式弹窗,不过需要在弹窗里重新导入用到的element-plus组件。
有办法不需要再次引用么?

部分代码

main.ts 导入 element-plus 依赖

import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
// 导入 弹窗
import Dialog from "@/plugins/dialog/index.js";

...
  app.use(ElementPlus);
  app.use(Dialog);

弹出框核心代码 plugin/dialog/index.js 代码

import { createApp, defineAsyncComponent } from "vue";
export default {
  install(app) {
    // 注册全局属性
    app.config.globalProperties.$Dialog = (cname, cdata) => {
      return new Promise((resolve, reject) => {
        const divEle = document.createElement("div");
        // 让我们节点挂在到一个dom元素上a
        document.body.appendChild(divEle);
        const dialog = createApp({
          data() {
            return {
              cdata
            };
          },
          template: `<div><${cname} v-bind="cdata" @submit="submit" @cancel="cancel"></${cname}> </div> `,
          methods: {
            submit() {
              console.log(dialog);
              document.body.removeChild(divEle);
              resolve(true);
            },
            cancel(res) {
              document.body.removeChild(divEle);
              reject(res);
            }
          },
          components: {
            [cname]: defineAsyncComponent(() => import(`./common/${cname}.vue`))
          }
        });
        dialog.mount(divEle);
      });
    };
  }
};

这里主要使用 defineAsyncComponent 异步加载,自己已经写好的vue页面。也尝试过将这里修改成用render方法返回h函数,结果组件不识别。

子组件代码

<template>
  <el-dialog
    v-model="dialogVisible"
    title="Tips"
    width="30%"
    :before-close="handleClose"
  >
    <span>This is a message</span>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="handleCancel">Cancel</el-button>
        <el-button type="primary" @click="handleConfirm"> Confirm </el-button>
      </span>
    </template>
  </el-dialog>
</template>

<script lang="ts" setup>
import { ref } from "vue";
import { ElMessageBox, ElDialog, ElButton } from "element-plus";
import { getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const emit = proxy.$emit;
const dialogVisible = ref(true);

const handleClose = (done: () => void) => {
  ElMessageBox.confirm("Are you sure to close this dialog?")
    .then(() => {
      done();
      dialogVisible.value = false;
    })
    .catch(() => {
      // catch error
    });
};

const handleCancel = () => {
  emit("cancel");
  dialogVisible.value = false;
};
const handleConfirm = () => {
  emit("submit");
  dialogVisible.value = false;
};
</script>

在子组件里必须要手动在引入使用过的element-plus组件例如示例代码:
import { ElMessageBox, ElDialog, ElButton } from "element-plus";
如果能不引入就好了。

父组件代码

<script setup lang="ts">
import { getCurrentInstance } from "vue";

defineOptions({
  name: "Welcome"
});
const { proxy } = getCurrentInstance();
function handleTouch() {
  proxy.$Dialog("alert", {});
}
</script>

<template>
  <div>
    <h1>Pure-Admin-Thin(非国际化版本)</h1>
    <el-button @click="handleTouch">Touch alert window</el-button>
  </div>
</template>
阅读 582
avatarAI BotBETA

这个问题是关于如何在 Vue3 + Vite 的环境中,以函数式组件的方式使用 Element Plus。

Element Plus 是一个基于 Vue3 的组件库,而 Vue3 的一个重要特性是它支持 Composition API。在 Vue3 和 Vite 的环境下,你可以利用这个特性,通过 defineAsyncComponent 来异步加载你的组件,而不需要在每个子组件中都显式地引入 Element Plus 组件。

在你的代码中,你已经使用了 defineAsyncComponent 来异步加载子组件。然而,你的子组件仍然需要显式地引入 Element Plus 的组件,这是因为你在创建 Vue 应用时并没有将 Element Plus 添加到全局组件中。

在 Vue3 中,如果你想使用某个组件,你需要在你的应用中注册它。你可以在你的主应用文件中(不是 main.ts,而是你在 Vue 应用根实例中使用的文件)注册 Element Plus 的所有组件。这样,你就可以在任何组件中(无论它们是否异步加载)使用这些组件,而无需再次导入它们。

以下是如何在主应用文件中注册 Element Plus 的所有组件:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import Dialog from './plugins/dialog/index.js'

const app = createApp(App)
app.use(ElementPlus)
app.use(Dialog)
app.mount('#app')

这样,你就可以在任何组件中使用 Element Plus 的组件,而无需再次导入它们。例如,你可以这样使用 el-button

<template>
  <el-button type="primary">Click me</el-button>
</template>

注意:在 Vue3 中,你需要使用 setup 选项来使用 Composition API。你也需要确保你的 Vite 配置支持异步组件。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题