请教一下写前端的各位大佬, vue 动态组件如何动态定义名字呢?
Jinnrry2024-07-23 15:120
vue 版本:3.3
背景:我项目里面希望给第三方提供一个页面。第三方通过网络接口的方式返回 html 代码,我程序里面把别人的 html 代码嵌入到我的页面中。
目前想到的方案:
1 、使用 v-html 标签嵌入。问题:这种方式嵌入,对方页面中如何调用我 vue 页面的方法属性呢?比如我这里有一个$http 变量是 axios 的实例,这个里面封装的验签相关处理,他必须用我这个$http 属性才能正常调用接口,不然他过不去验签。
2 、使用 vue 的异步组件。目前还没研究明白怎么用
下面是 demo 代码
<template>
<div id="main">
<el-tabs type="border-card">
<el-tab-pane v-for="(html,name) in pluginList" :label="name">
// 方案 1
<div v-html="html">
</div>
// 方案 2
<AsyncComp /> // 这样写的话第二个 plugin 又叫啥名字呢?
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup>
import { reactive, ref, getCurrentInstance } from 'vue'
const app = getCurrentInstance()
const $http = app.appContext.config.globalProperties.$http
import { defineAsyncComponent } from 'vue'
const pluginList = reactive({})
$http.get('/api/plugin/list').then(res => {
if (res.data != null && res.data.length > 0 ) {
pluginList[res.data] = ""
getPlugHtml(res.data)
}
})
const getPlugHtml = function(name){
// 方案 1
$http.post('/api/plugin/settings/'+name+"/index").then(res => {
if (res.data != null && res.data!="" ) {
pluginList[name] = res.data
}else{
pluginList[name] = "Load Error!"
}
})
// 方案 2. 但是 AsyncComp 这个名字怎么处理呢?这里换成变量以后,我模板里面的代码该怎么调用异步组件呢?
const AsyncComp = defineAsyncComponent(() => {
return new Promise((resolve, reject) => {
$http.post('/api/plugin/settings/'+name+"/index").then(res => {
if (res.data != null && res.data!="" ) {
resolve(res.data)
}else{
reject("Plugin Load Error!")
}
})
})
})
}
</script>
最新回复 (20)
- saberlove4月前引用2楼您是否在寻找 QianKun?
- tog4月前引用3楼为什么不用 iframe ?
发方案 1 按道理可行。 - weixind4月前引用4楼需要定义个 bridge 。和 VUE 关系不大。
- Jinnrry楼主4月前引用5楼@saberlove #1 太重了,就这么简单一个功能,不想引入这么重的一个依赖。三四年前用过这玩意,当时留下了难以磨灭的记忆
- Jinnrry楼主4月前引用6楼@tog #2 主要是和我原来 vue 属性通讯的问题,使用 iframe 怎么把我的$http 之类的属性给到他的页面呢
- Jinnrry楼主4月前引用7楼@tog #2 方案 1 的主要问题是 v-html 里面不执行 js 代码,只能插入 html 内容
- Jinnrry楼主4月前引用8楼@weixind #3 大佬细说?这一句话理解不了啊
- bojackhorseman4月前引用9楼听着有点像微前端的范畴。可以试试 micro-app ,接入很简单,就是主应用和子应用要按照框架约定好一些东西。
- horizon4月前引用10楼全部暴露到 window 上啊。。
- daysv4月前引用11楼搞那么麻烦, 全挂全局
- lisia4月前引用12楼把$http 写入到 window 对象中。
第三方 HTML 里面就可用在 HTML 里面插入 script 来获取了吧,不过这种安全风险有点大。 - murmur4月前引用13楼这东西我在某个大型 OA 上见过,可以用 react 代码直接把内置组件换掉,还自带 babel
- op3514月前引用14楼@murmur 泛微的 ecode 吗?
- Jinnrry楼主4月前引用15楼@murmur #12 我其实也就是干这个事,我希望第三方可以通过某些方式,替换掉我本身的一些组件。第三方可以通过这种方式引入新的功能、或者替换我以前的功能模块
- dfkjgklfdjg4月前引用16楼@Jinnrry #4 ,但是你的这个需求就不是一个简单的需求啊,得有一整套的方案。就是前两年常常提到的微前端。
如果单纯为了临时解决就选择 iframe 。数据交互可以用 [postMessage]( https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage) - dfkjgklfdjg4月前引用17楼@dfkjgklfdjg #15 ,最近去年开始微前端慢慢被认为是“伪需求”,[Web Component]( https://developer.mozilla.org/zh-CN/docs/Web/API/Web_components) 方案开始流行起来了。
- moxxun4月前引用18楼看看 vue 文档动态组件,异步组件部分
- duanxianze4月前引用19楼不想麻烦直接挂载全局就行了 稍微复杂一些就是提供一个 js 文件,里面封装你要提供的 API ,更复杂就是搞微前端,或者服务端渲染
- Jinnrry楼主4月前引用20楼@moxxun #17 我看了起码 10 遍了。官方文档上面只有一句
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() => {
return new Promise((resolve, reject) => {
// ...从服务器获取组件
resolve(/* 获取到的组件 */)
})
})
// ... 像使用其他一般组件一样使用 `AsyncComp`
这个 AsyncComp 怎么能换成变量,怎么局部声明组件,实在是没找到地方介绍 - moxxun4月前引用21楼@Jinnrry resolve 里可以插入 template 吧
- 回复请 登录 or 快速注册
Jinnrry
主题数 56 | 帖子数 2871 | 注册排名 2 |