Vue3中调用外部iframe链接方法

35 篇文章 1 订阅
29 篇文章 0 订阅

业务场景,点击某个按钮需要跳转到外部iframe的地址,但是需要在本项目内显示。以前项目中写过调用外部链接的功能,是有菜单的,但是这次是按钮,所以不能直接把地址配到菜单里。

实现方法:在本地路由文件里写个路由,meta里的iframe地址设为空字符串,然后在点击按钮的页面通过一个方法,获取以前配置过跳外部iframe的菜单地址(红框里的),并替换路径,然后再把新地址设置到写的路由文件里,再携带参数跳转。

1、 src/router/index.ts,增加路由,@/views/Iframe/index.vue这个组件是写好的解析路径的组件

 {
    path: '/',
    component: LayoutComponent,
    name: 'XXX预览',
    children: [
      {
        path: '/4705778289',
        component: () => import('@/views/Iframe/index.vue'),
        name: '4705778289',
        meta: {
          hidden: true,
          title: 'XXX预览',
          iframe: "",
          id: "4705778289",
          outorin: '1',
        },
      }
    ],
    meta: {
      hidden: true,
    }
  }

2、在routerHelper.ts文件里写一个查找某条路由的方法,以前iframe使用uuid查找,但是这里查找的时候需要加个?,所以改了一下uuid的方法,改成了直接传入一个参数

// 根据name,从多层数组获取路由对象。 
export const getRouteItemByIframeUuidName = (name, ignoreType = true)=>{
  const list = permissionStore.getAllAuthMenu;
  if(!name){ return false; }
  let result
  let hasFound = false
  const fn = function(list, name){
    for(let i=0; i < list.length; i++){
      if(list[i]?.meta?.iframe?.includes?.(name) && !hasFound && (ignoreType ? true : list[i].moduletype === '1')){
        result = list[i]
        hasFound = true
      }else if(list[i].children && list[i].children.length > 0){
        fn(list[i].children, name)
      }
    }
  }
  fn(list, name)
  return result
}

3、在文件里引入方法,使用递归方法 getRouteItemByIframeUuidName('secondnet?')查找包含字符串,找到后台添加的iframe地址,

4、找到后使用replace替换secondnet,替换为secondnetpreview,

5、然后引入router文件,通过循环找到这条路由,更新meta.iframe,然后再携带query跳转

 

 import { getRouteItemByIframeUuidName } from '@/utils/routerHelper'
 import { constantRouterMap } from '@/router' // 写的路由文件里的路由

  <el-tooltip effect="dark" content="XXX按钮" placement="right" popper-class="atooltip">
        <el-button
          type="primary"
          plain
          size="small"
          @click="goSecondnet"
          class="goFirstnet font14 iconfont"
        >
          <i class="iconfont iconjinruerciguanwang"></i>
        </el-button>
      </el-tooltip>


// 调取预览:type:4;ObjectID :编号
      goSecondnet() {
        const cur = getRouteItemByIframeUuidName('secondnet?'); // 通过方法获取以前配置过的地址
        const url = cur.meta.iframe.replace('secondnet', `secondnetpreview`) // 路径替换为现在需要的路径
        
        // 修改在路由文件里刚刚写的路由的iframe
        constantRouterMap.forEach(item => {
          if (item.name == 'XXX预览') {
            if (item.children[0].name == '4705778289') {
              item.children[0].meta.iframe = url;
            }
          }
        });
        // 携带参数跳转
        if (props.selectEle?.type == "communityRange" && props.selectEle?.item) {
          router.push({ 
            path: '/4705778289', 
            query: {
              id: props.selectEle?.item.STATIONID,
              type: '4',
            }
          });
        }
      },

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了使用 iframe,还有一种方法是使用 Vue 的异步组件来嵌套外部页面。这种方法可以通过动态加载外部页面的内容并将其作为组件渲染到 Vue 应用。 下面是一个示例: 首先,创建一个名为 ExternalPage.vue 的组件文件,用于渲染外部页面的内容。例如: ```html <template> <div> <div v-if="loading">Loading...</div> <div v-else v-html="content"></div> </div> </template> <script> export default { data() { return { loading: true, content: '' } }, mounted() { this.loadExternalPage() }, methods: { loadExternalPage() { // 发起异步请求获取外部页面的内容 // 你可以使用 axios 或其他方式来获取内容 // 这里仅作示例,直接使用了一个简单的 fetch 请求 fetch('https://example.com/external-page') .then(response => response.text()) .then(data => { this.loading = false this.content = data }) .catch(error => { console.error(error) this.loading = false this.content = 'Failed to load external page.' }) } } } </script> ``` 在上面的代码,我们使用了一个 loading 变量来表示是否正在加载外部页面的内容,并使用 content 变量来存储外部页面的内容。在组件的 mounted 钩子函数,我们调用了 loadExternalPage 方法来异步加载外部页面的内容。 接下来,在你的路由配置,将该组件与相应的路径关联起来。例如: ```javascript const routes = [ { path: '/external', name: 'ExternalPage', component: () => import('@/views/ExternalPage.vue') }, // 其他路由配置... ] ``` 在上面的代码,我们使用了 Vue 的异步组件语法,通过 `() => import('@/views/ExternalPage.vue')` 来动态加载 ExternalPage.vue 组件。 最后,在你的模板,可以通过 `<router-view>` 标签来显示路由对应的组件。例如: ```html <template> <div id="app"> <!-- 其他内容... --> <router-view></router-view> </div> </template> ``` 现在,当你访问 '/external' 路径时,Vue Router 将会渲染 ExternalPage 组件,并在组件异步加载外部页面的内容。 希望这个方法对你有帮助。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值