加载远程.vue文件并使用(Vue3版)

之前写了基于Vue2版的加载远程.vue组件,后面有友友问关于 Vue3 的版本,经过踩坑实践后写出来了记录一下。

vue3-sfc-loader 插件

Vue3/Vue2单文件组件加载器 在运行时从html/js/string动态加载.vue文件并转成响应式组件

loadModule 导入

Vue3 的导入路径和Vue2有点不一样,我这里使用esm版本

js 复制代码
// Vue3 esm 版
import { loadModule } from 'vue3-sfc-loader/dist/vue3-sfc-loader.esm.js'

获取Vue

因为Vue3 不默认导出Vue了,所以这里直接导入所有

js 复制代码
import * as Vue from 'vue'

远程加载

loadModule 第一个参数是组件路径字符串,会传入getFile方法中

getFilehttp 获取远程组件文件,此处我使用fetch API ,请求成功后调text() 返回 最终就是返回的一个字符串文本

这里使用Vue3 defineAsyncComponent 加载组件

js 复制代码
const options = {
  moduleCache: {
    vue: Vue,
  },
  async getFile (url: string) {
    return await fetch(url).then(res => res.text())
  },
  addStyle () {
    /* unused here */
  },
}
const asyncComponent = defineAsyncComponent(() => loadModule('/vue/v3test.vue', options))

渲染组件

渲染就使用 :is 动态渲染

同时传递属性和绑定事件

js 复制代码
<component :is="asyncComponent" v-bind="$attrs"/>

完整代码

js 复制代码
<template>
  <div>
    <component :is="asyncComponent" v-bind="$attrs"/>
  </div>
</template>

<script setup lang="ts">
import * as Vue from 'vue'
import { loadModule } from 'vue3-sfc-loader/dist/vue3-sfc-loader.esm.js'
import { defineAsyncComponent } from 'vue'
const options = {
  moduleCache: {
    vue: Vue,
  },
  async getFile (url: string) {
    return await fetch(url).then(res => res.text())
  },
  addStyle () {
    /* unused here */
  },
}
const asyncComponent = defineAsyncComponent(() => loadModule('/vue/v3test.vue', options))
</script>
相关推荐
冴羽3 分钟前
Cloudflare 崩溃梗图
前端·javascript·vue.js
Jonathan Star30 分钟前
JavaScript 中,原型链的**最顶端(终极原型)只有一个——`Object.prototype`
开发语言·javascript·原型模式
鹿衔`1 小时前
解决Flink on Yarn模式多Yarn Session会话提交
java·前端·flink
u***u6851 小时前
前端组件单元测试模拟,Jest mock函数
前端·单元测试
前端摸鱼匠2 小时前
Vue 3 的watchEffect函数:介绍watchEffect的基本用法和特点
前端·javascript·vue.js·前端框架·ecmascript
拉不动的猪2 小时前
基本数据类型Symbol的基本应用场景
前端·javascript·面试
天庭鸡腿哥2 小时前
谷歌出品,堪称手机版PS!
javascript·智能手机·eclipse·maven
_小九2 小时前
【开源】耗时数月、我开发了一款功能全面【30W行代码】的AI图床
前端·后端·开源
just小千2 小时前
HTML进阶——常用标签及其属性
前端·html
惜.己2 小时前
html笔记(一)
前端·笔记·html