react & vue & angular

react的路由

2022-04-03  本文已影响0人  泡杯感冒灵
路由指的就是,根据url的不同显示不同的内容
react路由使用步骤
import { BrowserRouter, Route,Routes} from 'react-router-dom';
// 表示  <BrowserRouter></BrowserRouter>里的内容,要使用路由了
class App extends Component {
  render(){
    return (
      <Provider store={store}>
        <Header/>
        // BrowserRouter代表路由
        // Route 代表一个一个的路由规则
        <BrowserRouter>
          <Routes>
             // 这里的意思是访问根路由/的时候,展示 home
            <Route path='/' element={<div>home</div>}></Route>
            // 这里的意思是访问/detail的时候,展示detail
            <Route path='/detail' element={<div>detail</div>}></Route>
          </Routes>
        </BrowserRouter>
      </Provider>
    )
  }
}
当然,正常情况下我们不同的路由,展示的肯定不是一个简单的div,而是不同的组件或者说是页面。这个时候,我们怎么办呢?
import React ,{Component, Fragment} from 'react';
import { Provider } from 'react-redux';
import { BrowserRouter, Route,Routes} from 'react-router-dom';
import Header from './common/header';
import Home from './pages/home';
import Detail from './pages/detail';
import store from './store';

class App extends Component {
  render(){
    return (
      <Provider store={store}>
        <Header/>
        <BrowserRouter>
          <Routes>
            <Route path='/' element={<Home/>}></Route>
            <Route path='/detail' element={<Detail/>}></Route>
          </Routes>
        </BrowserRouter>
      </Provider>
    )
  }
}

export default App;
单页应用定义是:“整个网站在访问过程中,只加载一次HTML”,而我们如果通过a标签去跳转,每次跳转,都会加载一次HTML,这不符合单页应用的定义,是比较耗费性能的。所以,在react中,我们要借助react-router-dom做单页应用的跳转
// 借助a标签跳转,每次跳转都会加载一次html
{
                    list.map((item,index) => {
                        return (
                            <a key={ index } href="/detail">
                                <ListItem >
                                    <img className="pic" src={ item.get('imgUrl') } alt=""/>
                                    <ListInfo>
                                        <h3 className='title'>{ item.get('title') }</h3>
                                        <p className='desc'>{ item.get('desc') }</p>
                                    </ListInfo>
                                </ListItem>
                            </a>
                        )
                    })
                }
import { Link } from 'react-router-dom';

<Link key={ index } to="/detail">
<ListItem >
    <img className="pic" src={ item.get('imgUrl') } alt=""/>
    <ListInfo>
          <h3 className='title'>{ item.get('title') }</h3>
          <p className='desc'>{ item.get('desc') }</p>
    </ListInfo>
</ListItem>
</Link>
页面路由参数的传递
// 如果从列表进入详情,那么一般情况下需要把item的id传给接口,路由上也要id匹配
                            <Link key={ index } to={'/detail/' + item.get('id')}>
                                <ListItem >
                                    <img className="pic" src={ item.get('imgUrl') } alt=""/>
                                    <ListInfo>
                                        <h3 className='title'>{ item.get('title') }</h3>
                                        <p className='desc'>{ item.get('desc') }</p>
                                    </ListInfo>
                                </ListItem>
                            </Link>
 <BrowserRouter>
          <Header/>
          <Routes>
            <Route path='/' element={<Home/>}></Route>
            <Route path='/detail/:id' element={<Detail/>}></Route>
          </Routes>
        </BrowserRouter>
import { useParams } from 'react-router-dom';

// useParams ()  获取到路由的动态参数  {id:2}
const Detail = (props) => {
    props.getDetail(useParams().id);
    return (
        <DetailWrapper>
            <Header>
                {props.title}
            </Header>
            <Content dangerouslySetInnerHTML={{__html:props.content}} />
        </DetailWrapper>
    )
}

// detail 后边 直接 跟 ?id=xx
<Link key={ index } to={'/detail?id=' + item.get('id')}>
            <ListItem >
                <img className="pic" src={ item.get('imgUrl') } alt=""/>
                <ListInfo>
                   <h3 className='title'>{ item.get('title') }</h3>
                   <p className='desc'>{ item.get('desc') }</p>
                </ListInfo>
            </ListItem>
 </Link>
      // /detail 就可以了
        <BrowserRouter>
          <Header/>
          <Routes>
            <Route path='/' element={<Home/>}></Route>
            <Route path='/detail' element={<Detail/>}></Route>
          </Routes>
        </BrowserRouter>
import { useParams,useLocation } from 'react-router-dom';
const Detail = (props) => {
    console.log(useLocation().search)
    // props.getDetail(useParams().id);
    return (
        <DetailWrapper>
            <Header>
                {props.title}
            </Header>
            <Content dangerouslySetInnerHTML={{__html:props.content}} />
        </DetailWrapper>
    )
}
image.png

这种方式,还需要对值进行处理,比动态路由麻烦。所以尽量用动态路由。

上一篇下一篇

猜你喜欢

热点阅读