如何覆盖 IonBackButton 的 onclick 行为

How can I override the onclick behavior of IonBackButton

如何覆盖 IonBackButton 的点击行为?我能够添加自己的监听器,但我不知道如何防止默认监听器触发。如果用户有未保存的数据,我打算警告他们。

如果你使用的是 ionic 4/5,你可以这样设置,

<ion-buttons slot="start">
      <ion-back-button defaultHref="home"></ion-back-button>
</ion-buttons>

如果还是不行,您也可以使用ion-icon并放置点击功能来导航到其他页面。

根据你对我上次 post 的评论的回复,我不确定我是否理解你真正想要的,但在我看来,只要满足条件,你就可以为用户禁用后退按钮不是真的。并且一旦满足条件,将disabled改为false。

在html,

<ion-buttons slot="start">
      <ion-back-button disabled="btnCondition"></ion-back-button>
</ion-buttons>

在 .ts 中,

btnCondition:boolean = true; //declare

yourfunction() {
    //Whatever code you want
    if(yourcondition==true){
      btnCondition = false; //This will make the back button to work
    }
    elseif(yourcondition==false) {
      //Do anything
    }
}

我使用 IonBackButton 中使用的 NavContext 制作了一个自定义后退按钮。 IonBackButton就是这样实现的。 https://github.com/ionic-team/ionic-framework/blob/main/packages/react/src/components/navigation/IonBackButton.tsx

onClick of IonBackButton 实现如下

(e: React.MouseEvent) => {
    const { defaultHref, routerAnimation } = this.props
    if (this.context.hasIonicRouter()) {
      e.stopPropagation()
      this.context.goBack(defaultHref, routerAnimation)
    } else if (defaultHref !== undefined) {
      window.location.href = defaultHref
    }
  }

这是一个简单的自定义 BackButton 使用 NavContext

import { NavContext } from "@ionic/react"
import React, { useContext } from "react"

interface IBackButtonProps {
  defaultHref?: string
}

export const BackButton: React.FC<IBackButtonProps> = function BackButton({
  defaultHref = "/",
}) {
  const navContext = useContext(NavContext)
  const onClick = (e: React.MouseEvent) => {
    if (navContext.hasIonicRouter()) {
      e.stopPropagation()
      navContext.goBack(defaultHref, undefined)
    } else if (defaultHref !== undefined) {
      window.location.href = defaultHref
    }
  }

  return <button onClick={onClick} style={{ width: 48, height: 48 }} />
}

请确保可能出现一些意外行为,因为上述组件仅实现了 onClick 事件。它不使用 IonBackButtonInner 这是 IonBackButton.

的内部组件

您也可以覆盖后退按钮的订阅,例如 app.component.ts

  private backButtonEvent() {
    this.platform.backButton.subscribeWithPriority(1, () => {
      console.log('BACK BUTTON TRIGGERED');
      this.yourFunction();
    });
  }

如果您只想阻止当前 ts 文件中的任何操作:

ionViewWillEnter() {
    this.backButtonSubscription = this.platform.backButton.subscribeWithPriority(9999, () => {});
  }

ionViewWillLeave() {
  this.backButtonSubscription.unsubscribe();
}