reactjs - 将组件作为 prop 传递给 Route 与在渲染函数中包装组件之间的区别

标签 reactjs routes react-router react-router-v4 react-router-v5

路由到这样的组件有什么区别:

 <Route path="coolPath" component={MyComponent} />
or
 <Route path="coolPath" render={props => <MyComponent {...props} customProp="s" } />

对此:
 <Route path"=coolPath">
      <MyComponent />
 </Route>
or
 <Route path"=coolPath">
      <MyComponent cusomProps="cp"/>
 </Route>

最佳答案

首先你应该通读这个网站:
https://reacttraining.com/react-router/web/api/Route

但要解释一下,这里发生了三件事,前两件事是以前版本 react-router 的路由示例。 (v5 之前)第三个是 react-router (v5 - 当前)推荐的方法。

1.带组件的路由

<Route path="/coolPath" component={MyComponent} />

这种类型的路由渲染传递给 prop 的单个组件。如果将内联函数传递给路由的 component prop,它将通过使用 React.createElement 在每个渲染上卸载和重新安装组件.这可能效率低下,并且只能通过内联函数通过此方法传递自定义 Prop 。 React Router 的作者推荐使用 rendercomponent 相对的 Prop prop 用于处理内联函数,如下所示。

2. 路由渲染
<Route path="/coolPath" render={props => <MyComponent {...props} customProp="s" } />

与使用带有内联函数的组件属性为您创建新的 React 元素不同,此路由类型传入一个函数,当位置匹配时调用该函数,并且不会卸载组件并在重新渲染期间重新安装全新的组件。通过这种方法传递自定义 Prop 也容易得多。

3. 以子节点为组件的路由
<Route path="/coolPath">
    <MyComponent customProp="s" />
</Route>

这是目前推荐的路由方式,当路由匹配路径时,子组件将被渲染。使用此方法传递自定义 Prop 也非常容易。

请记住,还有第四种类型,即:

4. 带子函数的路由

来自 reacttraining.com:
import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Link,
  Route
} from "react-router-dom";

function ListItemLink({ to, ...rest }) {
  return (
    <Route
      path={to}
      children={({ match }) => (
        <li className={match ? "active" : ""}>
          <Link to={to} {...rest} />
        </li>
      )}
    />
  );
}

ReactDOM.render(
  <Router>
    <ul>
      <ListItemLink to="/somewhere" />
      <ListItemLink to="/somewhere-else" />
    </ul>
  </Router>,
  node
);

有时您需要渲染路径是否与位置匹配。在这些情况下,您可以使用函数 children Prop 。它的工作原理与 render 完全一样,只是无论是否匹配都会调用它。

关于reactjs - 将组件作为 prop 传递给 Route 与在渲染函数中包装组件之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256109/

相关文章:

javascript - 在 React Router v4 中表示 URL 查询

javascript - 更新停止后 React props 解构?

javascript - 断言 `this.props.children` 中仅传递单个子项

c# - 具有自定义类型的路由不会显示在 Swagger 中

asp.net-mvc - 从业务逻辑类重定向asp.net mvc页面

reactjs - 仅在部署到 Azure Web 应用程序后,React JS 应用程序路由问题

reactjs - 避免 react-router goBack() 退出应用程序

javascript - 在 JSX 中使用 For 循环

javascript - 如何使用 Promise.all 正确获取 React 应用程序的数据

windows-7 - 路由表中的环回