這是一個小小的有關
react
的小例子,但願經過一個小例子,可讓新手更好的瞭解到react、react-router4.0、redux
的集中使用方法。css
這是基於create-react-app來開發的,一種簡單的快速建立
React web
項目的方式是使用Create React App
工具,至關於一個react
手腳架,此工具由create-react-app
,你須要先安裝。而後就能夠經過它建立一個新項目。htmlReact Router4.0 號稱一次學習,隨處路由。經過聲明式編程模型定義組件,是
React
最強大的核心功能。React Router
能夠爲您的應用已聲明式的方式定義導航組件最強大的核心功能。 不管是Web App
的瀏覽器書籤URLs
,仍是React Native
的導航功能, 只要是可使用React
的地方,就可使用React Router
。reactRedux 是一個用來管理JavaScript應用中 data-state(數據狀態)和UI-state(UI狀態)的工具,對於那些隨着時間推移狀態管理變得愈來愈複雜的單頁面應用(SPAs)它是比較理想。阮老師redux的教程git
create-react-app
建立咱們的 app首先 安裝好create-react-app
,已經安裝好了就不用重複安裝啦。github
npm install -g create-react-app
web
mac不成功記得用 sudonpm
安裝完畢以後:編程
create-react-app react-plan cd react-plan/ npm start
安裝會有點慢,耐心等待一下redux
安裝完畢以後,在瀏覽器地址欄輸入localhost:3000
,就能夠瀏覽到剛纔建立的 app 啦,這個手腳架很簡單。以下圖segmentfault
建立好應用以後,咱們就開始寫咱們的代碼了,在 src
文件夾下面建立一個components
文件夾,而且在這個文件夾下面建立一個home.js
的文件,而後寫上咱們首頁的內容。
首頁介紹組件
src/components/home.js
import React, { Component } from 'react' class Home extends Component { constructor(props) { super(props); } render () { return ( <div> <h2>首頁</h2> <p>這是一個 react 學習的基本操做的小栗子</p> <p>經過本次學習能夠清楚的掌握, react-router、redux的基本使用方法</p> <br/> <br/> <br/> </div> ) } } export default Home
寫好了 home.js 以後咱們先引入咱們的 app 看看
而後在src/App.js
引入咱們的 home.js
,App.js就變成了
src/App.js
import React, { Component } from 'react'; import logo from './logo.svg'; // 引入 homejs import Home from './components/home.js' import './App.css'; class App extends Component { render() { return ( <div className="App"> <div className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h2>Welcome to React</h2> </div> <p className="App-intro"> To get started, edit <code>src/App.js</code> and save to reload. </p> // 使用 home 組件 <Home /> </div> ); } } export default App;
寫好以後咱們就能夠成功的寫完了home.js
組件啦,是否是很簡單,是否是很happy?
繼續在components
文件夾建立一個plan.js
(計劃表)、detail.js
(計劃詳情)、pupop.js
(添加計劃)、的js文件和comment.css
(組件的樣式),咱們這時候不涉路由的跳轉,只要把全部靜態的組件先一氣呵成寫好來。
tips:這個例子小,爲了方便,我把全部的組件樣式文件都寫到comment.css
裏面了,這時候寫好的了 css 記得在App.js
裏面引入
src/App.js增長一句
import './components/comment.css'
src/components/comment.css
.main { padding: 10px; flex-direction: row; display: flex; } .NavBox { width: 250px; margin-right: 20px; } .listNav{ text-align: center; } .listNav li { line-height: 40px; } .listNav li a { text-decoration: none; } .listNav li.active{ background: #00a6f7; } .listNav li.active a{ color: #fff; } .side{ width: 100%; } .slist{ font-size: 14px; } .addBtn { font-size: 14px; font-weight: normal; background: skyblue; display: inline-block; padding: 10px; margin-left: 10px; color: #ffffff; border-radius: 4px; cursor: pointer; } .slist li{ padding: 10px; display: flex; flex-direction: row; justify-content: space-between; border-bottom: solid 1px cornflowerblue; } .slist li h3{ font-weight: normal; } .slist li div span{ text-decoration: underline; padding: 0 10px; } .popup{ position: absolute; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0, 0, 0, 0.6); display: flex !important; justify-content: center; align-items: center; } .popup .pbox { width: 50%; height: 320px; background: #ffffff; box-sizing: border-box; padding: 10px; position: relative; } .popup .pbox h4{ font-size: 14px; } .popup .pbox input { margin: 10px 0 20px 0; } .popup .pbox input, .popup .pbox textarea{ display: block; width: 100%; height: 32px; border: 1px solid skyblue; text-indent: 10px; } .popup .pbox textarea { resize: none; height: 100px; margin: 10px 0; } .popup .pbox .close { position: absolute; width: 30px; height: 30px; background: red; text-align: center; line-height: 30px; border-radius: 50%; color: #ffffff; right: -15px; top: -15px; transition: 0.5s; cursor: pointer; } .popup .pbox .close:hover{ transform: rotate(180deg); } .popup .pbox .pBtn { display: flex; justify-content: center; padding-top: 20px; } .popup .pbox .pBtn span{ padding: 10px 20px; background: skyblue; margin: 0 10px; font-size: 14px; color: #ffffff; border-radius: 4px; cursor: pointer; } .plant{ line-height: 50px; position: relative; } .plant p{ position: absolute; right: 0; top: 0; font-size: 14px; background: blue; height: 30px; line-height: 30px; padding: 0 10px; color: #fff; } .planlist{ width: 100%; padding: 10px; border-collapse: collapse; } .planlist td, th{ border: 1px solid blue; line-height: 32px; font-size: 14px; } .plan-delect{ color: red; cursor: pointer; } .plan-delect:hover{ color: blue; text-decoration: underline; } .plan-title{ width: 80%; }
計劃組件
src/components/plan.js
import React, { Component } from 'react' class Plan extends Component { constructor(props) { super(props); } render () { return ( <div> <div className="plant"> <h3>計劃表</h3> <p>添加計劃</p> </div> <table className="planlist"> <thead> <tr> <th>標題</th> <th>操做</th> </tr> </thead> <tbody> <tr> <td className="plan-title">計劃1</td> <td className="plan-delect">刪除</td> </tr> </tbody> </table> </div> ) } } export default Plan;
測試的時候直接把App.js
剛纔寫的import Home from './components/home.js'
改爲 import Home from './components/plan.js'
,就能夠測試plan 組件啦。是否是很簡單?下面的同理。
計劃詳情組件
src/components/detail.js
import React, { Component } from 'react' class Detail extends Component { constructor(props) { super(props); } render() { return ( <div style={{padding: '20px'}}> <h3>計劃詳情</h3> <p>id: 123</p> <p>標題: 測試標題</p> <p>內容: 測試內容</p> </div> ) } } export default Detail
添加計劃組件
src/components/popup.js
import React, { Component } from 'react' class Pupop extends Component{ constructor (props) { super(props) this.state = { id: '', title: '1', content: '1' } } render() { let self = this; return ( <section className="popup" style={{display: 'block'}}> <div className="pbox"> <span className="close">X</span> <div> <h4>計劃標題</h4> <input value={this.state.title} placeholder="請輸入計劃標題"/> </div> <div> <h4>計劃內容</h4> <textarea value={this.state.content} placeholder="請輸入計劃內容" rows="3"></textarea> </div> <div className="pBtn"> <span>取消</span> <span>確認</span> </div> </div> </section> ) } } export default Pupop
呼~~~終於把全部組件都寫好了。下面咱們就用路由把他們全都串聯起來吧。實現點擊跳轉咯
首先記得安裝路由 npm install react-router-dom history --save
history這個模塊是用來作 js 的跳轉,後面咱們會介紹到。
安裝完成路由模塊以後,在src/components/
下面咱們在增長一個測試二級路由的文件testrouter.js
,裏面的內容很簡單,直接把官網的拿進來。
src/components/testrouter.js
import React, { Component } from 'react' import { BrowserRouter as Router, Route, Link } from 'react-router-dom' const Topic = ({ match }) => ( <div> <h3>{match.params.topicId}</h3> </div> ) class TestRouter extends Component { constructor(props) { super(props); console.log(this.props) } render () { return ( <div> <h2>二級路由</h2> <ul> <li> <Link to={`${this.props.match.url}/rendering`}> 使用 React 渲染 </Link> </li> <li> <Link to={`${this.props.match.url}/components`}> 組件 </Link> </li> <li> <Link to={`${this.props.match.url}/props-v-state`}> 屬性 v. 狀態 </Link> </li> </ul> <Route path={`${this.props.match.url}/:topicId`} component={Topic}/> <Route exact path={this.props.match.url} render={() => ( <h3>請選擇一個主題。</h3> )}/> </div> ) } } export default TestRouter
而後在App.js作一點改動,引入全部須要的模塊,看註釋
src/App.js
import React, { Component } from 'react' import { BrowserRouter as Router, Route, Link } from 'react-router-dom' import logo from './logo.svg' // 引入4個模塊組件 import Plan from './components/plan.js' import Home from './components/home.js' import Popup from './components/popup.js' import TestRouter from './components/testrouter.js' import Detail from './components/detail.js' // 引入樣式文件 import './App.css' import './components/comment.css' // 引入路由 import createHistory from 'history/createBrowserHistory' const history = createHistory() // 開始代碼 class App extends Component { constructor(props) { super(props); } render() { return ( <div className="App"> <div className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h2 className='App-title'>Welcome to React Plan</h2> </div> <div> // 路由配置 <Router history = {history}> <div className="contentBox"> // 編寫導航 <ul className="nav"> <li><Link to="/">首頁</Link></li> <li><Link to="/plan">計劃表</Link></li> <li><Link to="/test">二級路由</Link></li> </ul> // 路由匹配 <div className="content"> <Route exact path="/" component={Home}/> <Route path="/plan" component={Plan}/> <Route path="/test" component={TestRouter}/> <Route path="/detail/:id" component={Detail}/> </div> </div> </Router> </div> <Popup/> </div> ); } } export default App
不是結束的結束:好啦~~~路由也配置好,打開瀏覽器,在代碼正確的狀況下,能夠愉快的實現跳轉咯。以後咱們再把 redux 加入進來,這樣子就能夠,每一個組件就能夠操做全局的數據了。稍後奉上。react、react-router、redux 也許是最佳小實踐2
github地址,以爲有幫助的話,請點擊一下 start,嘿嘿