私はこのようなコンポーネントツリーを持っています:
-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>
)
}
}
UserList.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>
)
}
ここで何を実装しようとしているのかわかりません。アプリは、UserList
いつルートがであるかをレンダリングし/
ます。UserList
レンダリングUserItem
各々に対するコンポーネントuser
の配列です。それぞれがUserItem
単にすべてのユーザーに固有のルートをレンダリングし、User
そのルートがトリガーされた場合にコンポーネントをレンダリングします。
しかし、私が間違っていUserList
なければ、ルートが以外の場合はレンダリングされない/
ため、誰かがアクセスしたuser/...
場合、内部ルートは実際には存在しません。
基本的に、このアプリは何もレンダリングしません。
exact
のルートからキーワードを削除すると、App
探している結果が得られると思います。この場合、開く/user/<USER_NAME>
とUser
そのユーザーの要素がレンダリングされます。
あなたの質問は、ルートを介して小道具をコンポーネントに渡すことに関するものであり、使用したメカニズムは正しいです。
<Route path={...} render={() => <User user={user} />} />
これは実際には正しいです。以下にリンクされているコードを参照してください。ルートを/user/User1
に変更すると、アプリに「User1」の名前が表示されます。
ここで動作するコードを参照してください:https://codesandbox.io/s/18w3393767
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加