javascript 使用React Router进行编程导航

6bc51xsx  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(108)

我有一个带有ReactTS的Web应用程序。我使用react-router库进行导航,我需要通过编程方式将用户导航到Registration按钮点击的注册页面。
我在react-router中找到了几种编程方法:
1.带useNavigate挂钩-只能在组件内部使用。
1.带有redirect功能-仅适用于装载机。
我使用带钩子的函数组件,但不想在组件中保留太多逻辑,我想把逻辑移到服务层,现在我正在寻找不带钩子的程序导航方法。
这是我的准则

import { redirect, useNavigate } from 'react-router-dom';
import { AUTHORIZATION_REGISTRATION_MAILBOX } from '../../../constants/routes';

export const LogInComponent = () => {
  const navigate = useNavigate();

  const goToRegistration = () => {
    redirect(AUTHORIZATION_REGISTRATION_MAILBOX); // it's not working
    navigate(AUTHORIZATION_REGISTRATION_MAILBOX); // it's working but only inside component
  }

  return (
    <div>
      <button className='enter-button' onClick={goToRegistration}>
        Registration
      </button>
    </div>
  );
};

统一方案主任1

我在寻找这样的解决方案:
1.组件使用服务

import { registrateUser } from './registrationService'

export const RegistrationComponent = () => {
  
  const registrate = () => {
    registrateUser();
  }

  return (
    <div>
      <button onClick={registrate}>
        Registrate
      </button>
    </div>
  );
}

1.服务生成一些逻辑并通过导航服务重定向用户

import { redirectTo } from './navigationService'

export const registrateUser = () => {
  
  // makes some logic

  redirectTo(/*some path*/);
}

1.导航服务应重定向用户

export const registrateUser = (path: string) => {
  window.location.href = path; // as example
}

使用window.location.href的解决方案是有效的,但是它清除了状态值(上下文值和存储值),所以这不是一个好的决定。

5n0oy7gb

5n0oy7gb1#

我已经在共享服务函数中使用了useNavigate钩子,它对我很有效。请尝试下面的例子。

应用程序tsx

import React from "react";
import { navigateTo } from "./sharedService";

const App = () => {
    navigateTo('/path');
    return (
        <></>
    );
};

export default App;

共享服务.ts

import { useNavigate } from "react-router-dom";

export const navigateTo = (redirectTo: string) => {
    const navigate = useNavigate();
    navigate(redirectTo);
};
91zkwejq

91zkwejq2#

使用useNavigate钩子和导航函数的版本是您所提供的选项中正确的一个。

import { useNavigate } from 'react-router-dom';
import { AUTHORIZATION_REGISTRATION_MAILBOX } from '../../../constants/routes';

export const LogInComponent = () => {
  const navigate = useNavigate();

  const goToRegistration = () => {
    navigate(AUTHORIZATION_REGISTRATION_MAILBOX);
  }

  return (
    <div>
      <button className='enter-button' onClick={goToRegistration}>
        Registration
      </button>
    </div>
  );
};

如果你想把这个逻辑提取到一个可重用的单元中,那么你可能需要创建一个定制的钩子,这样useNavigate钩子才能被有效地调用。定制的React钩子允许代码重用。
示例:
x一个一个一个一个x一个一个二个x

相关问题