uni-app webview组件更新src后进行了路由的push问题

发布于 1周前 作者 h691938207 来自 Uni-App

uni-app webview组件更新src后进行了路由的push问题

开发环境 版本号 项目创建方式
Windows win11 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:4.24

手机系统:Android

手机系统版本号:Android 15

手机厂商:华为

手机机型:xiaomi14

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

```html
<web-view :src="workSrc"></web-view>
const workSrc = ref('www.bilibili.com')
onMounted(() => {
  setTimeout(() => {
    workSrc.value = "www.baidu.com"
  }, 2000)
})

操作步骤:

  • 需要返回两次

预期结果:

  • 更改webview的src,不影响app的页面栈

实际结果:

  • 需要返回两次

bug描述:

我切换webview的src,会增加一个路由在页面栈中, 原本:[‘index’,‘webpage’] 切换后:[‘index’,‘webpage’,‘webpage’] 会导致需要返回两次才能回到index页面


4 回复

你好, 我这边用HBuilderX 4.24, 安卓模拟器,没有复现此问题。 发一下你这边的复现的demo工程


我刚刚看了一下,路由没啥问题,就是点击原生导航栏返回需要返回两次才能回到index(见测试demo)

在处理uni-app中webview组件更新src属性后引发的路由push问题时,通常需要注意几个关键点:确保webview组件正确加载新页面、管理页面栈以避免重复push、以及处理可能的生命周期事件。以下是一个简化的代码示例,展示如何在uni-app中管理webview组件的src更新以及路由push逻辑。

示例代码

1. 页面结构(假设在pages/index/index.vue中)

<template>
  <view>
    <button @click="changeWebViewSrc('https://example.com')">Open Example</button>
    <web-view :src="webViewSrc" @loaded="onWebViewLoaded"></web-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      webViewSrc: '' // 初始为空或默认URL
    };
  },
  methods: {
    changeWebViewSrc(newSrc) {
      // 更新webview的src属性前,检查是否需要push新页面到路由栈
      if (this.webViewSrc !== newSrc) {
        this.webViewSrc = newSrc;
        // 根据需求决定是否调用路由push(通常webview内部导航不需要额外push)
        // this.$router.push({ path: '/some-path', query: { src: newSrc } }); // 示例,实际使用需调整
      }
    },
    onWebViewLoaded() {
      console.log('WebView loaded:', this.webViewSrc);
      // 可以在这里处理加载完成后的逻辑,比如更新页面状态等
    }
  }
};
</script>

2. 注意事项

  • 避免重复push:在changeWebViewSrc方法中,通过比较新旧src值来决定是否更新,防止不必要的路由操作。
  • 生命周期事件:监听web-viewloaded事件来确认页面加载完成,这有助于执行后续逻辑,如隐藏加载指示器等。
  • 路由管理:通常,webview组件内部已经处理了页面导航,因此不需要在外部通过$router.push来管理。如果确实需要在外部管理(例如,为了同步应用内的导航历史),则需要设计一套机制来同步webview的导航和Vue路由的状态。

3. 高级用法

对于更复杂的场景,如需要在webview和外部页面之间传递数据或同步状态,可以考虑使用postMessage API进行跨域通信,或者通过Vuex等状态管理工具来管理全局状态。

以上代码提供了一个基本的框架来处理uni-app中webview组件src更新后的路由管理问题。根据具体需求,可能需要对代码进行进一步的定制和优化。

回到顶部