<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
react-router可以解決路由問題,只需要新增[基於react-router4.x]
yarn add react-router-dom
然後在index.js中引入它,使用:
import {Link,BrowserRouter,Switch, Route} from 'react-router-dom'; ReactDOM.render(( <BrowserRouter> <Switch> <Route path="/list" component={ListDemo}/> <Route path="/a" component={A}/> <Route path="/b" component={B}/> </Switch> </BrowserRouter> ),mountdom)
這樣就完成了路由的設定,而超連結則可以使用提供的Link元件
<Link to="/a">a</Link>
等價於直接寫<a href="/a">a</a>。
在每個menu中傳一個url屬性,然後url代表那個地方被高亮,每個路由都重新建立一個menu即如下:
<BrowserRouter> <Switch> <Route exact path="/" render={props=><Menu {...props} url="list"><ListDemo/></SiderDemo>}/> <Route path="/list" render={props=><Menu {...props} url="list"><ListDemo/></SiderDemo>}/> <Route path="/a" render={props=><Menu {...props} url="a"><A/></SiderDemo>}/> <Route path="/b" render={props=><Menu {...props} url="b"><B/></SiderDemo>}/> </Switch> </BrowserRouter>
但是每個頁面的初次載入都會閃一下,重新載入了js。要想不閃則需要路由巢狀:
//上來路由只匹配到Menu中 <BrowserRouter> <Switch> <Route path="/" component={Menu}/> </Switch> </BrowserRouter> //上面的route就一個元件menu,在menu中再次定義route,可以實現路由巢狀 <Menu> <頂部></頂部> <側欄 selectedurl={this.props.location.pathname}> </側欄> <內容部分> <Route exact path="/list" component={List}/> <Route exact path="/a" component={At}/> <Route exact path="/b" component={Bt}/> </內容部分> <Menu>
這裡主要是利用了每個頁面都有的一個屬性即props.location.pathname是路由屬性
1 多入口檔案的形式,但是不易於按需載入,只能是實現了分開輸出,沒啥用。一般寫的都是單入口應用。
2 非同步import,或者require.ensure,然後在webpack中設定
output:{ filename:"[name]-bundle.js", chunkFilename: "[name]-chunk.js", path: __dirname+'/dist' },
這樣就生成一個bundle檔案,多個chunk檔案,name就是import的檔案的名字,注意這裡的註釋是有用的直接決定了chunk輸出的時候的[name]。
import(/* webpackChunkName: "app" */'./app').then(function(res){ let xx= res.default;//xx就是app的export default })
create-react-app建立的應用執行npm run eject進行彈射。webpack中已經有了上面3中的設定,是可以直接生成多個chunk檔案的。
建立一個函數用於生成非同步元件:
import React, { Component } from "react"; export default function asyncComponent(importComponent) { class AsyncComponent extends Component { constructor(props) { super(props); this.state = { component: null }; } async componentDidMount() { const { default: component } = await importComponent(); this.setState({ component: component }); } render() { const C = this.state.component; return C ? <C {...this.props} /> : null; } } return AsyncComponent; }
改變元件引入方式之前是直接import現在改為
const List=asyncComponent(()=>import(/* webpackChunkName: "list" */"./router/List")) const At=asyncComponent(()=>import(/* webpackChunkName: "a" */"./router/A")) const Bt=asyncComponent(()=>import(/* webpackChunkName: "b" */"./router/B"))
渲染
<HashRouter> <Switch> <Route path="/" component={SiderDemo}/> </Switch> </HashRouter> class SiderDemo extends React.Component { render() { let selected=this.props.location.pathname.substring(1) if(selected==="")selected="list" return ( <Layout> <Sider> <Menu defaultSelectedKeys={[selected]}> ......................... </Menu> </Sider> <Layout> <Header></Header> <Content > <div> <Route exact path="/list" component={List}/> <Route exact path="/a" component={At}/> <Route exact path="/b" component={Bt}/> <Route exact path="/" component={List}/> </div> </Content> <Footer></Footer> </Layout> </Layout> ); } }
react-router-dom@5.3.0 可以自己用npm yarn cnpm 進行下載,我使用的是5.3.0版本
import { HashRouter as Router , Route, Link } from 'react-router-dom' export default function App () { return ( <div> <h1>react路由基本使用</h1> <Router> <Link to="/comment">評論</Link> <Link to="/search">搜尋</Link> <Route path="/comment" component={Comment} /> <Route path="/search" component={Search} /> </Router> </div> ) } ReactDom.render(<App />, document.getElementById('root'))
這樣就實現了一個簡易的點選路由跳轉
(一個專案中只會有一個 我上面是經過as改名之後的)
兩種常用 Router:HashRouter 和 BrowserRouter
HashRouter
:使用 URL 的雜湊值實現BrowserRouter
:使用 H5 的 history.pushState() API 實現指定導航連結方式有兩種 分別是Link 和 NavLink
Link元件最終會渲染成a標籤,用於指定路由導航
Link元件無法展示哪個link處於選中的效果
NavLink元件,可以用用於指定當前導航高亮
(當前元件被點選時 會新增一個 active 類,可以通過修改這個類 可以修改被選中是的樣式)
<NavLink to="/xxx" activeClassName="active">連結</NavLink>
預設路由路徑匹配規則是: 模糊匹配規則
只有路徑完全一致才被匹配上
用Switch元件包裹多個Route元件。
在Switch元件下,不管有多少個Route的路由規則匹配成功,都只會渲染第一個匹配的元件
<Switch> <Route path="/" exact component={Home} /> <Route path="/article" component={Article} /> <Route path="/article/123" component={ArticleDetail} /> </Switch>
思路: 不設定path屬性,將404頁對應的路由放在switch內部的最後位置
<Switch> <Route path="/" exact component={Home} /> <Route path="/article" component={Article} /> <Route path="/article/123" component={ArticleDetail} /> <Route component={Page404} /> </Switch>
<Redirect from="/" exact to="/comment" /> 當精準匹配到/ 時 ,跳轉到comment路徑
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45