在React/Ionic中,当history.push被调用时(或者当我的URL改变时),我如何强制我的组件渲染?

vaqhlq81  于 2023-11-15  发布在  Ionic
关注(0)|答案(1)|浏览(179)

我正在构建一个Ionic 7和一个REact 18应用程序。

const OrderItemRecipientComponent: React.FC = () => {
    ...
  const history = useHistory();
  const [isButtonDisabled, setButtonDisabled] = useState(false);

  useEffect(() => {
    // This effect will run after the component re-renders
    if (isButtonDisabled) {
      // move on to the payment
      history.push("/payment");
    }
  }, [isButtonDisabled, history]);
  

  const handleSaveAndContinue = () => {
    setButtonDisabled(true); // Disable the button

    // add the item to the cart
    addToCart(orderItem);
  };

  return (
    <>
    ...
      <p>
        <AddressForm
          contactInfo={contactInfo}
          setContactInfo={setContactInfo}
        />
      </p>
      <IonButton expand="full" onClick={handleSaveAndContinue}  disabled={isButtonDisabled}>
        Pay
      </IonButton>
    </>
  );
};

export default OrderItemRecipientComponent;

字符串
然后在App.tsx路由中定义

<IonContent className="ion-padding" scroll-y>
    <IonRouterOutlet>
        ...
      <Route exact path="/payment">
        <PaymentContainer />
      </Route>
    </IonRouterOutlet>
  </IonContent>
</IonReactRouter>


问题是,通常当我点击“支付”按钮时,虽然我看到我的URL中的路由发生了变化,但我并不总是看到PaymentContainer组件呈现(原始组件仍然存在)。当我在浏览器上点击“刷新”时,我确实看到正确的组件呈现。我如何纠正我的序列,以便PaymentContainer组件在我的路由发生变化时始终呈现?

nxagd54h

nxagd54h1#

基于joshua-wyllie的回答here,其中提到了github issue:你需要在你的每个页面上有一个 Package <IonPage>(在你的例子中作为PaymentContainer的根)。
如果这不能解决问题,您可以尝试以下方法:正如yairoprothis post中提到的那样,您可以尝试强制更新:

const history = useHistory();
const [, forceUpdate] = useReducer(x => x + 1, 0);

useEffect(() => {
  // This effect will run after the component re-renders
  if (isButtonDisabled) {
    // move on to the payment
    history.push("/payment");
    forceUpdate();
  }
}, [isButtonDisabled, history]);

字符串

相关问题