代码之家  ›  专栏  ›  技术社区  ›  Umair Abid

如何将道具传递到路由而不导致组件安装两次?

  •  0
  • Umair Abid  · 技术社区  · 5 年前

    我正试图通过接受的方式将道具传递给我的组件,这些道具来自不同的来源,比如 comment

    <Router>
      ...
      <Route path="/:id" exact component={() => <GymMain id={params.id} appointmentTypes={appointmentTypeList} />} />
      <Route path={`/:id/:name`} component={(props) => {
        const { params } = props.match;
        const aType = appointmentTypeList.find(at => at.uri === params.name);
        return <AppointmentType id={params.id} appointmentType={aType} />
      }} />
      ...
    </Router>
    

    但是,这会导致组件装载两次,一次是在导航到组件时,另一次是在离开组件时(在离开旧道具时)。发生这种情况是因为我正在用一个匿名组件装饰我的原始组件 answer

    我的问题是如何根据路由参数为子组件准备道具,然后将其传递给路由组件。谢谢!

    0 回复  |  直到 5 年前
        1
  •  1
  •   Shubham Khatri    5 年前

    使用 component 道具vs render 属性以呈现功能组件。

    根据 docs

    当你使用 (而不是下面的渲染或子对象) 路由器使用 React.createElement 给定的组件。这意味着如果您提供一个内联函数 在组件属性中,每次渲染都会创建一个新组件。 . 当使用内联函数进行内联渲染时,请使用 儿童道具(下图)。

    提供

    <Router>
      ...
      <Route path="/:id" exact render={() => <GymMain id={params.id} appointmentTypes={appointmentTypeList} />} />
      <Route path={`/:id/:name`} render={(props) => {
        const { params } = props.match;
        const aType = appointmentTypeList.find(at => at.uri === params.name);
        return <AppointmentType id={params.id} appointmentType={aType} />
      }} />
      ...
    </Router>
    
        2
  •  0
  •   vamshi krishna    5 年前

    这不是最好的办法。 你可以用 UNSAFE_componentWillUpdate()

    UNSAFE_componentWillUpdate(nextProps, nextState){
    // check for your condition for updating component
     if (this.porps !== nextProps) { 
       this.forceUpdate()
    }
     else {
        return
       }
    }