reactjs “react-router-dom”中的{Link}和{useNavigate}之间的差异

o2gm4chl  于 2023-02-15  发布在  React
关注(0)|答案(4)|浏览(399)

有人能解释一下“react-router-domain”中的{Link}和{useNavigate}之间的区别吗?我是第一次使用React,我看到{Link}和{useNavigate}都用于导航路线。那么它们有什么区别呢?

jgzswidk

jgzswidk1#

Link(* 和NavLinkNavigate)***组件useNavigate钩子返回的navigate***函数*之间的区别实际上与 * 声明性 * 和 * 命令性 * 编程之间的区别相同。
声明式编程与命令式编程
声明式编程是一种描述程序做什么的范式,但没有明确指定其控制流;命令式编程是一种描述程序应该如何做某事的范式,它通过一步一步地明确指定每个指令(或语句)来改变程序的状态。

  • 命令式编程-关注于如何执行,将控制流定义为改变程序状态的语句。
  • 声明式编程-专注于执行什么,定义程序逻辑,但不是详细的控制流。

使用Link(* 和NavLinkNavigate *)组件,您可以有效地声明或推迟您希望发生的事情,组件负责完成和执行这些事情。
声明性链接示例:

<Link to="page">Page</Link>

它只指定了它想要到达的目标,但没有解释如何到达那里。
使用navigate函数,您可以显式地发出一个 command 来立即导航。这是一个命令式操作。
命令式链接示例:

<Link
  to="page"
  onClick={(e) => {
    e.preventDefault();
    navigate("page");
  }}
>
  Page
</Link>

此版本明确说明,如果单击,将运行此特定逻辑以导航到此页面。
还要注意,Link是一个React组件,因此它***必须***作为React组件返回的一部分呈现到DOM中,而navigate函数是一个函数,可以在回调中使用。

46qrfjad

46qrfjad2#

Link是JSX元素,它是replace <a>,因此当它点击时可以在路线之间导航,而无需刷新页面。

<Link to='/about'>To About Page</Link>

useNavigate是路由器钩子。与Link相同,但它可以通过编程在路由之间导航,如onSubmit,它将重定向到另一个页面

let navigate = useNavigate();

  async function handleSubmit(event) {
    event.preventDefault();
    await submitForm(event.target);
    navigate("/success", { replace: true });
  }

  return <form onSubmit={handleSubmit}>{/* ... */}</form>;
ilmyapht

ilmyapht3#

Link和NavLink基本上是一回事。我们都用它们来路由页面。但不同的是,当我们使用NavLink时,我们得到了一些好处,比如我们可以设计具有活动状态的导航。因为NavLink组件在它内部提供了一个活动类。所以我们可以在它处于活动状态时设计我们的导航,并且我们可以跟踪活动页面。
useNavigate是一个钩子,它返回一个导航函数,但要做到这一点,我们需要调用一个导航函数,它声明了它将如何工作。

eiee3dmh

eiee3dmh4#

让我们说你有一些需要呈现一些页面后,检查的东西(例如,你有条件来检查用户是否有登录之前或没有,所以首先你检查网页的会话,如果会话是有效的或存在,然后你重定向到用户主页,否则你告诉用户是注销。)这是时间链接和useNavigate用例非常闪耀。
index.js

root.render(
  <BrowserRouter>
    <App/>
</BrowserRouter>
);

App.js

const navigate=useNavigate()  //remember useNavigate only valid inside
    useEffect(()=>{          // BrowserRouter that's why I wrap App.js 
                            //  by BrowserRouter in index.js
        const key=localStorage.getItem('key');
        console.log(key);
        if(key===undefined){
            navigate('/')
        }else{
           navigate('/list')
        }
    },[1])
    return  <Routes>
    <Route path="/" element={<Authentication/>}/>
    <Route path="/list" element={<List/>}/>
    </Routes>

如果我使用链接,尽管useNavigate然后浏览器将不会抱怨,但它不是在引擎盖下工作。因为链接是唯一有效的,直到如果你包括在网页(DOM)内,如锚或标签内的html页面,因为链接是一样的标签。但useNavigate是一个函数或挂钩什么是在你的代码中的任何地方使用。因为useNavigate不需要添加到DOM内。

相关问题