Vue Router的NavigationDuplicated错误

  • NavigationDuplicated: Avoided redundant navigation to current location: “/”.
  • Error: Redirected when going from “" to "” via a navigation guard.

Vue router最近将NavigationDuplicated的错误置顶了,posva的高赞回答提出的解决方案如下:

import Router from 'vue-router'

const originalPush = Router.prototype.push
Router.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject)
    return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch((err) => {
    if (Router.isNavigationFailure(err)) {
      // resolve err
      return err
    }
    // rethrow error
    return Promise.reject(err)
  })
}

但开发环境下需要查看错误信息,因此可以做一些小修改。

1 自定义开发模式启动语句,添加dev模式语句package.json

{
  "scripts": {
    "dev": "NODE_ENV=development vue-cli-service serve",
  },
}

2 自定义日志打印,创建Log.js

/**
 * 转换为html的style
 * @param {Object} style 
 */
const styleTranslate = (style) => {
  return Object.entries(style)
    .map(([key, value]) => `${key}:${value}`)
    .join(';')
}
const style = {
  'color': '#FFFFFF',
  'padding': '4px',
  'border-radius': '4px',
}
const STYLE_DEV_ERROR = styleTranslate({
  'background-color': '#FF0000',
  ...style
})
// ...

export default {
  // ...
  /**
   * 如果当前的NODE_ENV是development模式,则向控制台输出错误信息
   *
   * @param {*} callback
   */
  devError(...message) {
    if (process.env.NODE_ENV === 'development') {
      console.error('%cdevError', STYLE_DEV_ERROR, ...message)
    }
  },
}

3 开发者模式下打印日志Log.devError(err)

import Router from 'vue-router'
import Log from './Log'

const originalPush = Router.prototype.push
Router.prototype.push = function push(location, onResolve, onReject) {
  if (onResolve || onReject)
    return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch((err) => {
    Log.devError(err)
    if (Router.isNavigationFailure(err)) {
      // resolve err
      return err
    }
    // rethrow error
    return Promise.reject(err)
  })
}
### UniApp 中 `image` 组件使用教程 #### 基础语法 在 UniApp 中,`<image>` 是用于显示图片的基础组件。该组件支持多种属性来控制图像的加载方式、样式以及交互行为。 ```html <template> <view class="container"> <image src="/static/logo.png"></image> </view> </template> <style> .container { display: flex; justify-content: center; } </style> ``` 此代码展示了如何通过设置 `src` 属性指定要展示的图片路径[^1]。 #### 动态绑定图片源 为了实现更灵活的应用场景,可以利用 Vue 的数据绑定特性动态更改图片地址: ```html <template> <view class="container"> <image :src="imgSrc"></image> </view> </template> <script> export default { data() { return { imgSrc: '/static/logo.png' } }, methods: { changeImage(newPath) { this.imgSrc = newPath } } } </script> ``` 上述例子中定义了一个方法 `changeImage()` 来改变当前显示的图片资源。 #### 加载模式与占位符 对于网络图片,在其完全下载之前可能需要提供一种视觉反馈给用户。可以通过配置 `loading` 和 `error` 插槽来自定义这些状态下的表现形式;另外还可以设定默认宽度高度以防止页面布局闪烁。 ```html <template> <view class="container"> <image mode="aspectFit" lazy-load @load="onLoad" @error="onError"> <!-- 自定义加载中的提示 --> <text slot="loading">正在加载...</text> <!-- 错误情况处理 --> <text slot="error">加载失败</text> </image> </view> </template> <script> export default { onLoad(event){ console.log('图片已成功加载') }, onError(errorEvent){ console.error('图片加载错误:', errorEvent.detail.errMsg) } } </script> ``` 这里设置了 `mode="aspectFit"` 参数确保图片按比例缩放适应容器大小而不失真,并启用了懒加载功能 (`lazy-load`) 减少初始渲染时间开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值