簡單單頁應用,使用react-router v4.1.1,styled-components來實現。應用功能:三個導航標籤(Home,Stuff,Contact),點擊標籤切換頁面內容。css
react-router v4 與之前版本變化較大,作web app時應引入react-router-dom,react-router如今成了其核心庫,只包含最基本的功能;html
styled-components的合理應用,資料少,只能看着官方文檔,一點點的試驗,一點點的理解;react
增長styled目錄,自定義樣式組件,界面元素幾乎都在這個目錄中,只有index.html中還引入了一個css文件,定義基本元素的通用設定。git
-public --index.html --index.css -src --components ---Contact.js ---Home.js ---Stuff.js --containers ---App.js --styled ---Content.js ---Header.js --index.js
路由使用了react-router v4,所以引入的是react-router-dom,開始使用react-router,這如今已是其核心庫,有些組件已經被剝離出去,好比:history,開始一直報錯,說:history是必需的,卻未定義。若想只用核心庫,就要本身安裝並配置history。github
import {HashRouter as Router,Route} from 'react-router-dom'; ReactDOM.render( <Router> <App> //react-router v4容許在Router下聽任意標籤,也可象我這樣放自定義組件 <Route exact path="/" component={Home} /> //exact是指path進行精確匹配,若不加,根目錄會與任何路徑都匹配。 <Route path="/stuff" component={Stuff} /> <Route path="/contact" component={Contact} /> </App> </Router>, document.getElementById('root') );
若使用核心組件,必需配置history,以下:web
import createHistory from 'history/createBrowserHistory' const history = createHistory() ReactDOM.render( <Router history={history}> ...... </Router> );
styled-components將樣式組件化,我將基礎元素的樣式設置放在/public/index.css中,這是一個基調,styled的基本元素會繼承這些樣式。合理的使用styled-components的繼承,能讓組件設計更清晰、重用率更高。npm
樣式基礎設定(index.css)react-router
body { //頁面的基礎設定 background-color: #FFCC00; padding: 20px; margin: 0; } h1, h2, p, ul, li{ font-family: Helvetica, Arial, sans-serif; //設定通用字體 }
自定義樣式(Header.js)app
import styled from 'styled-components'; import {NavLink} from 'react-router-dom'; //第三方組件 const HeaderUl = styled.ul` //基本使用方法 background-color: #111; padding: 0; `; ...... const HeaderA = styled(NavLink)` //繼承第三方組件 color: #FFF; font-weight: bold; text-decoration: none; padding: 20px; display: inline-block; &:hover { //鼠標懸停事件定義 color: yellow; } `; export {HeaderUl, HeaderLi, HeaderA};
頁面框架組織(App.js)框架
import {HeaderUl, HeaderLi, HeaderA} from '../styled/Header'; class App extends Component { render() { const activeStyle = {backgroundColor: "#0099FF"}; //選中樣式對象使用內嵌方式,讓組件邏輯內聚 return ( <div> <h1>Simple SPA</h1> <HeaderUl className="header"> <HeaderLi><HeaderA exact to="/" activeStyle={activeStyle}>Home</HeaderA></HeaderLi> //放棄activeClassName,使用activeStyle,讓本組件的數據徹底內聚 ...... </HeaderUl> ...... </div> ); } } export default App;
頁面內容組織(Home.js)
import {ContentDivH2} from '../styled/Content'; //引入樣式組件 class Home extends Component { render() { return ( <div> <ContentDivH2>HELLO</ContentDivH2> //使用樣式組件 <p>text content row one.</p> <p>text content row tow.</p> </div> ); } } export default Home;
https://git.oschina.net/zhoutk/reactodo.git https://github.com/zhoutk/reactodo.git
git clone https://git.oschina.net/zhoutk/reactodo.git or git clone https://github.com/zhoutk/reactodo.git cd reactodo npm i git checkout spa-web-app npm start
此次實踐,使用了路由來實現一個簡單的單頁應用,並使用styled-components庫來組織咱們的樣式,讓樣式也組件化,從而達到更好的封裝效果,提升代碼的重用率。