【问题标题】:How to pass props to nested routes in React Router 4?如何将道具传递给 React Router 4 中的嵌套路由?
【发布时间】:2017-12-28 10:48:37
【问题描述】:

我有一个这样的组件树:

-App
--UserList
---UserItem
---UserItem
---UserItem
--User

我无法将用户数据从 UserItem 传递到 User。这就是我所拥有的:

App.js

export default class App extends Component {
  state = { users: [] }

  componentDidMount() {// fetch and setState}

  render() {
    return (
      <BrowserRouter>
        <Route
          exact
          path="/"
          render={() => <UserList users={this.state.users} />}
        />
      </BrowserRouter>
    )
  }

}

用户列表.js

export default function({ users }) {
  return (
    <div>
      {users.map(user => (
        <UserItem user={user} key={`${user.id}`} />
      ))}
    </div>
  )

}

这就是问题所在:我想将数据从父组件传递给子User 组件,而不必再次从 API 获取用户数据。

UserItem.js

export default function({ user }) {
  return (
    <div>
      <Link to="/user">{user.name}</Link>

      <Route path={`/user/${user.name}`} render={() => <User user={user} />} />
    </div>
  )
}

【问题讨论】:

    标签: javascript reactjs react-router react-router-v4 react-router-dom


    【解决方案1】:

    我不确定您要在这里实现什么。当路由为 / 时,您的应用会呈现 UserListUserList 为数组中的每个 user 呈现一个 UserItem 组件。每个UserItem 只是为每个用户呈现一个特定的路由,如果该路由被触发,它将呈现User 组件。

    但如果我没记错的话,如果路由不是/,则不会呈现UserList,因此如果有人访问user/...,则内部路由实际上并不存在。

    基本上,这个应用程序不会渲染任何东西。

    如果你从App 的路由中删除exact 关键字,我想你会得到你想要的结果。在这种情况下,打开/user/&lt;USER_NAME&gt; 将为该用户呈现User 元素。

    您的问题是关于通过路由将道具传递到组件中,您使用的机制是正确的。

    &lt;Route path={...} render={() =&gt; &lt;User user={user} /&gt;} /&gt;

    这其实是对的。请参阅下面链接的代码。在将路由更改为/user/User1 时,您将看到应用程序中呈现的“User1”的名称。

    在此处查看工作代码:https://codesandbox.io/s/18w3393767

    【讨论】:

    • 感谢您的回复 Shishir,您对“确切”道具的看法是正确的。现在的问题是当路由是/user/:userName 时UserItems 将可见。我想隐藏这些项目,只显示主要的 User 组件。这是更新后的沙箱:codesandbox.io/s/7wq1okykq
    • UserItems 将对所有路由可见,因为您的UserList 旨在为传递给它的数组中的每个user 呈现一个UserItem 实例(第21 行) .如果您根本不希望 UserItem 被渲染,您可以将您的路由声明移动到 UserList。请参阅codesandbox.io/s/480wp337pw 请注意,您的Link 元素也在UserItem 中,因此如果您希望它们可见,您可能需要将它们移动到适当的位置。总之,您想在user/:userName 路由上显示的任何内容都应该在Route 元素下。
    【解决方案2】:

    你应该在 UserItem 组件中使用this.props.users

    【讨论】:

    • UserItem 中不需要使用this.props.users。 OP 正在使用解构赋值从传递给 SFC 的道具中提取 user
    【解决方案3】:

    我不确定,但你能像下面这样传递道具吗,这里我将道具传递给渲染,然后传递给用户组件

          <Route path={`/user/${user.name}`} render={(props) => <User user={user} {...props} />} />
    

    【讨论】:

      【解决方案4】:
      export default function({ users }) {
        return (
          <div>
            { this.props.users.map(user => ( 
          //mistake here this.props.users.map not users.map 
              <UserItem user={user} key={`${user.id}`} />
            ))}
          </div>
        )
      
      }
      

      【讨论】:

      • users.map 没有错,因为他使用解构赋值来获取 users 变量。在像这个这样的无状态函数组件中,传递给函数的参数是props 对象。通过使用{users},OP 从道具中提取users,并丢弃其余部分。
      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2018-04-25
      • 2021-12-21
      • 1970-01-01
      • 2017-04-21
      • 2020-04-02
      • 2018-02-13
      相关资源
      最近更新 更多