You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用React Router实现列表跳转详情页及导航栏返回首页问题咨询

实现方案

问题根因

你现在的列表和详情同时展示,是因为<PokemonList>组件放在了路由匹配规则<Switch>的外部,不管路由如何变化,列表组件都会全局渲染。

分步修改代码

1. 修改app.js路由结构

把首页列表放到根路径的专属路由中,用exact严格匹配根路径,确保只有访问首页时才渲染列表,访问详情页时只渲染详情组件:

return (
    <div className="main-bg">
        <div className='container'>
            <div>
                <Navbar/>
            </div>
            <div className='row'>                        
                <Switch>        
                    {/* 仅匹配根路径时渲染列表 */}
                    <Route exact path="/">
                        <PokemonList
                            pokemons={pokemons}
                            handleFavouritesClick={addFavouritePokemon}
                            favouriteComponent={AddFavourites}
                        />
                    </Route>
                    <Route path="/pokemon/:id" component={PokemonDetail} /> 
                </Switch>   
            </div>       
        </div>
    </div>
);

2. 修正列表跳转路径

把跳转路径改成绝对路径,避免相对路径在嵌套路由场景下匹配错误:

<StyledLink to={`/pokemon/${pokemon.id}`}>
    <Card>
        <div className="w-100 p-2 rounded text-center card-outer">
            <h5 className="card-header">{pokemon.id}</h5> 
            {/* 其余原有代码保持不变 */}
        </div>
    </Card> 
</StyledLink>

3. 实现导航栏logo返回首页

在Navbar组件中导入react-router-dom的Link组件,把logo元素用Link包裹,指向根路径即可:

// 先在Navbar组件顶部导入依赖
import { Link } from 'react-router-dom';

// 替换原有logo渲染逻辑
<Link to="/">
    {/* 这里放你的logo元素代码,比如img标签、文字logo等 */}
    <img src="logo资源路径" alt="站点logo" />
</Link>

4. 补充详情页参数获取逻辑

你当前详情页的pokemons变量没有绑定对应数据,需要从路由参数中拿到宝可梦ID后请求对应详情再渲染:

// 详情页顶部导入依赖
import { useParams } from 'react-router-dom';
import { useState, useEffect } from 'react';

const PokemonDetail = () => {
    // 从路由参数中获取宝可梦ID
    const { id } = useParams();
    const [currentPokemon, setCurrentPokemon] = useState(null);
    // 调用你的接口获取单个宝可梦详情数据
    useEffect(() => {
        fetch(`你的API基础地址/${id}`)
            .then(res => res.json())
            .then(data => setCurrentPokemon(data))
    }, [id])

    if(!currentPokemon) return <div>加载中...</div>
    return (
        <div className="col-md-3 my-5">
            <div className="card-outer w-100 p-2 rounded text-center">
                <h5 className="card-header">{currentPokemon.name}</h5> 
                {/* 按需渲染其余详情字段 */}
            </div>                      
        </div>              
    )
}

内容的提问来源于stack exchange,提问作者Yasmins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:18:01