有人能解释一下“react-router-domain”中的{Link}和{useNavigate}之间的区别吗?我是第一次使用React,我看到{Link}和{useNavigate}都用于导航路线。那么它们有什么区别呢?
jgzswidk1#
Link(* 和NavLink和Navigate)***组件和useNavigate钩子返回的navigate***函数*之间的区别实际上与 * 声明性 * 和 * 命令性 * 编程之间的区别相同。声明式编程与命令式编程声明式编程是一种描述程序做什么的范式,但没有明确指定其控制流;命令式编程是一种描述程序应该如何做某事的范式,它通过一步一步地明确指定每个指令(或语句)来改变程序的状态。
Link
NavLink
Navigate
useNavigate
navigate
使用Link(* 和NavLink和Navigate *)组件,您可以有效地声明或推迟您希望发生的事情,组件负责完成和执行这些事情。声明性链接示例:
<Link to="page">Page</Link>
它只指定了它想要到达的目标,但没有解释如何到达那里。使用navigate函数,您可以显式地发出一个 command 来立即导航。这是一个命令式操作。命令式链接示例:
<Link to="page" onClick={(e) => { e.preventDefault(); navigate("page"); }} > Page </Link>
此版本明确说明,如果单击,将运行此特定逻辑以导航到此页面。还要注意,Link是一个React组件,因此它***必须***作为React组件返回的一部分呈现到DOM中,而navigate函数是一个函数,可以在回调中使用。
46qrfjad2#
Link是JSX元素,它是replace <a>,因此当它点击时可以在路线之间导航,而无需刷新页面。
<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>;
ilmyapht3#
Link和NavLink基本上是一回事。我们都用它们来路由页面。但不同的是,当我们使用NavLink时,我们得到了一些好处,比如我们可以设计具有活动状态的导航。因为NavLink组件在它内部提供了一个活动类。所以我们可以在它处于活动状态时设计我们的导航,并且我们可以跟踪活动页面。useNavigate是一个钩子,它返回一个导航函数,但要做到这一点,我们需要调用一个导航函数,它声明了它将如何工作。
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内。
4条答案
按热度按时间jgzswidk1#
Link
(* 和NavLink
和Navigate
)***组件和useNavigate
钩子返回的navigate
***函数*之间的区别实际上与 * 声明性 * 和 * 命令性 * 编程之间的区别相同。声明式编程与命令式编程
声明式编程是一种描述程序做什么的范式,但没有明确指定其控制流;命令式编程是一种描述程序应该如何做某事的范式,它通过一步一步地明确指定每个指令(或语句)来改变程序的状态。
使用
Link
(* 和NavLink
和Navigate
*)组件,您可以有效地声明或推迟您希望发生的事情,组件负责完成和执行这些事情。声明性链接示例:
它只指定了它想要到达的目标,但没有解释如何到达那里。
使用
navigate
函数,您可以显式地发出一个 command 来立即导航。这是一个命令式操作。命令式链接示例:
此版本明确说明,如果单击,将运行此特定逻辑以导航到此页面。
还要注意,
Link
是一个React组件,因此它***必须***作为React组件返回的一部分呈现到DOM中,而navigate
函数是一个函数,可以在回调中使用。46qrfjad2#
Link是JSX元素,它是replace
<a>
,因此当它点击时可以在路线之间导航,而无需刷新页面。useNavigate是路由器钩子。与Link相同,但它可以通过编程在路由之间导航,如onSubmit,它将重定向到另一个页面
ilmyapht3#
Link和NavLink基本上是一回事。我们都用它们来路由页面。但不同的是,当我们使用NavLink时,我们得到了一些好处,比如我们可以设计具有活动状态的导航。因为NavLink组件在它内部提供了一个活动类。所以我们可以在它处于活动状态时设计我们的导航,并且我们可以跟踪活动页面。
useNavigate是一个钩子,它返回一个导航函数,但要做到这一点,我们需要调用一个导航函数,它声明了它将如何工作。
eiee3dmh4#
让我们说你有一些需要呈现一些页面后,检查的东西(例如,你有条件来检查用户是否有登录之前或没有,所以首先你检查网页的会话,如果会话是有效的或存在,然后你重定向到用户主页,否则你告诉用户是注销。)这是时间链接和useNavigate用例非常闪耀。
index.js
App.js
如果我使用链接,尽管useNavigate然后浏览器将不会抱怨,但它不是在引擎盖下工作。因为链接是唯一有效的,直到如果你包括在网页(DOM)内,如锚或标签内的html页面,因为链接是一样的标签。但useNavigate是一个函数或挂钩什么是在你的代码中的任何地方使用。因为useNavigate不需要添加到DOM内。