vue3-sfc-loader动态加载一个异步vue组件生成cesium画面

15 篇文章 0 订阅
1 篇文章 0 订阅

在 Vue.js 3 中,使用 vue3-sfc-loader 可以动态加载异步的 Vue 单文件组件(.vue 文件)。这个工具允许你在运行时根据需要加载和解析 .vue 文件,使得组件的加载变得更加灵活和动态。

下面是一个简单的示例,演示如何使用 vue3-sfc-loader 动态加载一个异步的 Vue 组件:

安装依赖: 首先,需要安装 vue3-sfc-loader@vue/compiler-sfc(Vue 3 的单文件组件编译器)。

import { loadModule } from "vue3-sfc-loader";

开始加载时需要知道的事

defineAsyncComponent 是 Vue 3 提供的用于定义异步组件的函数

<template>
  <div>
    <component :is="previewComp"></component>
  </div>
</template>
  • <component :is="previewComp"></component> 是动态组件,根据 previewComp 的值来决定显示哪个组件。

 

import {
  ref,
  defineAsyncComponent,
  shallowRef,
  watch,
  onMounted,
  nextTick,
} from "vue";
import * as Vue from "vue";
import * as Cesium from "cesium";
import { loadModule } from "vue3-sfc-loader";
//映入你需要渲染的资源。包含js 在下面的代码中需要再次注册,

比如我们的vue下面仍然需要注册,第三方资源包也是如此

const init = (code: string) => {
  try {
    const options = {
      moduleCache: {
        vue: Vue,
        cesium: Cesium,
      },
      async getFile() {
        return code;
      },
      addStyle(textContent) {
        const style = Object.assign(document.createElement("style"), {
          textContent,
        });
        const ref = document.head.getElementsByTagName("style")[0] || null;
        document.head.insertBefore(style, ref);
      },
    };
    const comp = defineAsyncComponent(() =>
      loadModule("myComponent.vue", options)
    );
    previewComp.value = comp;
  } catch (err) {
    console.error(err);
  }
};
  • init 方法是初始化方法,根据传入的 code 加载模块并设置到 previewComp
  • moduleCache:这是一个对象,用来缓存模块。根据代码中的变量命名,它可能预先加载了一些模块,例如 VueFFCesiumCesiumturfCesiumNavigation。这些模块可以在加载 myComponent.vue 组件时使用。

  • etFile() 函数:这是一个异步函数,返回值是传入的 code 参数,即函数初始化时传入的字符串。

  • defineAsyncComponent() 是一个 Vue 3 提供的函数,用于定义异步组件。它接受一个函数作为参数,这个函数返回一个 Promise,用来加载和解析组件。
  • loadModule("myComponent.vue", options) 调用 loadModule 函数加载名为 myComponent.vue 的 Vue 组件,并传入之前定义的 options 对象作为配置。

 就是这样拉。

然而我的示例里面previewComp是外面编辑器传进来的。展示一下源码

<template>
  <div v-if="show" class="big">
    <component :is="previewComp"></component>
  </div>
</template>

<script setup lang="ts">
import {
  ref,
  defineAsyncComponent,
  shallowRef,
  watch,
  onMounted,
  nextTick,
} from "vue";
import * as Vue from "vue";
import * as Cesium from "cesium";
import { loadModule } from "vue3-sfc-loader";
import * as turf from "@turf/turf";
import * as CesiumNavigation from "cesium-navigation-es6"; //指南针插件
import FFCesium from "@/FFCesium/core/index.js";

let show = ref(false);
// import { particle } from "../cesium/resoure/index.ts";
const props = defineProps({
  code: {
    type: String,
    required: true,
  },
});
watch(
  () => props.code,
  (newValue, oldValue) => {
    // 这里可以执行其他操作
    console.log("监听");

    init(newValue);
  }
);

onMounted(() => {
  // 初始化
  show.value = true;
  // 初始化
  init(props.code);
});
const setCode = (code: string) => {
  show.value = false;
  // 重新渲染显示页,解决改错报错不再回归
  console.log("yunx,shuoax");
  nextTick(() => {
    show.value = true;
    // 在父组件里面再调用一次
    init(code);
  });
};

defineExpose({ setCode });

const previewComp = shallowRef();
const init = (code: string) => {
  // console.log("FFCesium12", FFCesium);
  try {
    const options = {
      moduleCache: {
        vue: Vue,
        FFCesium: FFCesium,
        cesium: Cesium,
        turf: turf,
        CesiumNavigation: CesiumNavigation,
      },
      async getFile() {
        return code;
      },
      addStyle(textContent) {
        const style = Object.assign(document.createElement("style"), {
          textContent,
        });
        const ref = document.head.getElementsByTagName("style")[0] || null;
        document.head.insertBefore(style, ref);
      },
    };
    const comp = defineAsyncComponent(() =>
      loadModule("myComponent.vue", options)
    );
    previewComp.value = comp;
  } catch (err) {
    console.error(err);
  }
};
// // 初始化
// init(props.code);
</script>
<style scoped>
.big {
  width: 100%;
  height: 100%;
}
</style>

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vue3-sfc-loader 是用于加载 Vue 单文件组件的 webpack loader,它可以利用 Vue 3 的新特性来加快编译速度。它可以通过以下方式加载依赖: 1. 使用 import 语句引入所需的依赖 在 .vue 文件中,可以使用 import 语句引入所需的依赖,如下所示: ```html <template> <div>{{ message }}</div> </template> <script> import axios from "axios"; export default { data() { return { message: "", }; }, mounted() { axios.get("/api/message").then((response) => { this.message = response.data; }); }, }; </script> ``` 在这个例子中,我们使用 import 语句引入了 axios,它是一个用于发送 HTTP 请求的库。 2. 使用 resolveComponent 函数动态加载组件 Vue 3 提供了 resolveComponent 函数,可以用于动态加载组件。在 .vue 文件中,可以使用 resolveComponent 函数来动态加载某个组件,如下所示: ```html <template> <div> <component :is="componentName" /> </div> </template> <script> export default { data() { return { componentName: "MyComponent", }; }, mounted() { import("./MyComponent.vue").then((module) => { this.componentName = module.default; }); }, }; </script> ``` 在这个例子中,我们使用 resolveComponent 函数和 import 语句动态加载一个名为 MyComponent 的组件。在 mounted 生命周期钩子中,我们使用 import 语句加载了 MyComponent.vue 文件,并将它的 default 导出赋值给 componentName。最终,componentName 的值将被传递给 `<component>` 元素的 :is 属性,从而动态渲染 MyComponent 组件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值