我有一个医生列表,我正在尝试在选择时动态呈现详细信息页面。我看到大多数人建议通过 Route 组件传递道具,如下所示:
<Route path={`${match.url}/:name`}
component={ (props) => <DoctorView doctor={this.props.doctors} {...props} />}
/>
虽然我不清楚我应该在哪里执行这个。我在 DoctorList 和 DoctorItem 中尝试过,但没有奏效。所以我在 App 组件中设置了 Route,我可以选择一个医生,然后渲染 DoctorView 组件并很好地显示 match.params 道具。但是如何将选定的医生数据获取到 DoctorView?我可能比它应该做的更难。这是我的代码:
应用程序.jsx
const App = () => {
return (
<div>
<NavigationBar />
<FlashMessagesList />
<Switch>
<Route exact path="/" component={Greeting} />
<Route path="/signup" component={SignupPage} />
<Route path="/login" component={LoginPage} />
<Route path="/content" component={requireAuth(ShareContentPage)} />
<Route path="/doctors" component={requireAuth(Doctors)} />
<Route path="/doctor/:name" component={requireAuth(DoctorView)} />
</Switch>
</div>
);
}
医生列表.jsx
class DoctorList extends React.Component {
render() {
const { doctors } = this.props;
const linkList = doctors.map((doctor, index) => {
return (
<DoctorItem doctor={doctor} key={index} />
);
});
return (
<div>
<h3>Doctor List</h3>
<ul>{linkList}</ul>
</div>
);
}
}
DoctorItem.jsx
const DoctorItem = ({ doctor, match }) => (
<div>
<Link
to={{ pathname:`/doctor/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
{doctor.profile.first_name} {doctor.profile.last_name}
</Link>
</div>
);
DoctorView.jsx
const DoctorItem = ({ doctor, match }) => (
<div>
<Link
to={{ pathname:`/doctor/${doctor.profile.first_name}-${doctor.profile.last_name}` }}>
{doctor.profile.first_name} {doctor.profile.last_name}
</Link>
</div>
);
我可以通过 Redux 访问医生列表,我可以连接组件,引入列表并比较 id,但这感觉像是很多不必要的步骤。