渲染道具 - 反应路线

Posted

技术标签:

【中文标题】渲染道具 - 反应路线【英文标题】:Render Props - React Route 【发布时间】:2019-02-03 20:02:01 【问题描述】:
const Home = () => <div>Home</div>

const App = () => 
  const someVariable = true;

  return (
    <Switch>
      /* these are good */
      <Route exact path='/' component=Home />
      <Route
        path='/about'
        render=(props) => <About ...props  />
      />
    </Switch>
  )


const About = (props) => 
  return (
    <div>
      About   
    </div>
  )
 

在代码示例中,在

<Route
        path='/about'
        render=(props) => <About ...props  />
      />

当 react 遇到 react-router 的 Route 组件的 render prop 时,它传递了什么 props?

鉴于https://reactjs.org/docs/render-props.html 的文档, 渲染道具是组件用来知道要渲染什么的函数道具, 是在 react-router 中的 Route 声明中传递的 props 传递的值

【问题讨论】:

【参考方案1】:

props 由 Route 组件传递给 render prop 方法。你可以在 React Router 源代码中看到这一点。 Route 组件传递的 props 有match, location, history, staticContext。如果你想使用父组件中的 props,你定义了 render props 方法,那么你可以省略 props 参数。

render=() =&gt; &lt;About ...props /&gt;

然后你会从包含 Route 的组件中获取 props。

您提供的示例没有多大意义,因为它复制了您仅在 Route 上使用“组件”道具所获得的行为。

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Route.js#L120

【讨论】:

【参考方案2】:

在渲染方法中传递 props 时,您会获得 react router 默认 props,就像使用 component 而不是使用隐式获取所有这些 props 匹配、位置、历史记录和 staticContext 的渲染道具一样。并且您需要提供道具作为参数,否则它的渲染方法不会将道具传递给孩子,因为它会认为它未定义。

这是 react 路由器中渲染道具的工作示例: https://codesandbox.io/s/72k8xz669j

【讨论】:

【参考方案3】:

我们使用带有渲染道具的Route,

<Route path = "/about" component=About />

或,

<Route path = "/about" render=  (props) => <About ...props  />

第二个不同于第一个,因为在第二种情况下,About 组件可以访问通过 Route 传入的 props。

比如说, 有一个 Profile 组件,

<Route path="/admin/profile"
       render= props => (
              <Profile tabs= "valuePassed" ...props  />  
        )
 />

现在在 Profile 组件中,我们可以访问所有的道具,

this.props.tabs 在基于类的组件中提供“valuePasses”,而 props.tabs 用于功能组件。

希望这会有所帮助。

【讨论】:

如果不添加...props会得到什么,我应该可以从this.props.tabs访问"valuePassed",不是吗?? @TayyabFerozi 是的,您可以访问 valuePassed,即作为“标签”道具传递。您无法访问的是调用渲染方法的其他道具,即(更具体地说-->) if () 有来自 的 match: ..., location: ..., history: ... 等道具,然后如果您添加 ...props 您可以访问这些在“管理员/个人资料”路线中也可以使用道具,否则您将只能访问 tabs: valuePassed 请参阅:levelup.gitconnected.com/… 希望这会有所帮助!

以上是关于渲染道具 - 反应路线的主要内容,如果未能解决你的问题,请参考以下文章

即使道具没有改变,为啥还要对重新渲染组件做出反应?

将新的商店状态放入道具后,反应不会重新渲染

是否可以仅在初始化道具时才渲染反应组件?

反应父母对孩子道具传递而不重新渲染

在不改变状态、道具或父级的情况下反应子级渲染

通过 connect 和 mapDispatchToProps 反应 redux 传递事件处理程序与使用道具渲染孩子