react基礎(2)

分類:IT技術 時間:2017-09-26

 

react基礎(1):介紹了如何創建項目,總結了JSX、組件、樣式、事件、state、props、refs、map循環,另外還講了mock數據和ajax

還是用 react基礎1 裏創建的項目繼續寫案例。

 

react-router

在做單頁面應用的時候就需要用到路由了。

 

首先來看一下我們的項目目錄,如下所示:

package.json和webpack.config.js的內容和 react基礎(1)一樣的。

下面貼一下entries裏的文件內容

react2/src/entries/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Demo</title>
</head>
<body>

<div id="root"></div>

<script src="common.js"></script>
<script src="index.js"></script>

</body>
</html>

react2/src/entries/index.js

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class App extends Component {
  render(){
    return(
      <div>123</div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)

 安裝依賴 npm i

啟動本地服務 npm start

瀏覽器打開瀏覽效果 http://localhost:8989/

效果如下

 

案例1

react2/src/entries/index.js(其他幾個文件不修改)

import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, hashHistory, Link } from 'react-router';

class App extends Component {
  render(){
    return(
      <div>
          <ul>
              <li><Link to="/movie">電影</Link></li>
              <li><Link to="/tv">電視劇</Link></li>
          </ul>
          {this.props.children}
      </div>
    )
  }
}

class Tv extends Component {
  render(){
    return(
      <div>
          <ul>
              <li>還珠格格</li>
              <li>來自星星的你</li>
          </ul>
      </div>
    )
  }
}

class Movie extends Component {
  render(){
    return(
      <div>
          <ul>
              <li>暮光之城</li>
              <li>喜劇之王</li>
          </ul>
      </div>
    )
  }
}

const Routes = ({ history }) =>
  <Router history={history}>
    <Route path="/" component={App}>
       <Route path="/tv" component={Tv} />
       <Route path="/movie" component={Movie} />
    </Route>
  </Router>;

Routes.propTypes = {
  history: PropTypes.any,
};

ReactDOM.render(
    <Routes history={hashHistory} />, 
    document.getElementById('root')
);

Router、Route、Link這三個大家可以看一下教程了解一下定義,這裏不詳細講解:教程戳這裏

關於history的教程戳這裏。常用的History有三種:browserHistory、hashHistory、createMemoryHistory(從react-router引出)。在聲明路由的時候需要指定所選的方式,沒有默認選項。

使用hashHistory,瀏覽器的url是這樣的:/#/user/liuna?_k=adseis

使用browserHistory,瀏覽器的url是這樣的:/user/liuna (大家可以自己試試這種,這裏就不寫案例了)

這個案例寫出來的效果類似tab切換

 

案例2:

react2/src/entries/index.js(其他幾個文件不修改)

import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, hashHistory, Link } from 'react-router';

class App extends Component {
  render(){
    return(
      <div>
          <ul>
              <li><Link to="/movie">電影</Link></li>
              <li><Link to="/tv">電視劇</Link></li>
          </ul>
          {this.props.children}
      </div>
    )
  }
}

class Tv extends Component {
  render(){
    return(
      <div>
        <Link to="/">返回</Link> 
          <ul>
              <li>還珠格格</li>
              <li>來自星星的你</li>
          </ul>
      </div>
    )
  }
}

class Movie extends Component {
  render(){
    return(
      <div>
        <Link to="/">返回</Link>
          <ul>
              <li>暮光之城</li>
              <li>喜劇之王</li>
          </ul>
      </div>
    )
  }
}


const Routes = ({ history }) =>
  <Router history={history}>
    <Route path="/" component={App} />
    <Route path="/tv" component={Tv} />
    <Route path="/movie" component={Movie} />
  </Router>;

Routes.propTypes = {
  history: PropTypes.any,
};

ReactDOM.render(
    <Routes history={hashHistory} />, 
    document.getElementById('root')
);

這個效果就相當於是直接跳轉了頁面,和案例1的tab切換效果不一樣的主要代碼,如下所示

案例1裏面component為Tv和Movie的Route標簽是寫在component為App的Route標簽裏的,而案例2裏相當於是同級的。

 

案例3

react2/src/entries/index.js(其他幾個文件不修改)

import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, hashHistory, Link, IndexRoute } from 'react-router';

class App extends Component {
  render(){
    return(
      <div>
          <p>
              <span><Link to="/movie">電影</Link></span>&nbsp;&nbsp;
              <span><Link to="/tv">電視劇</Link></span>
          </p>
          {this.props.children}
      </div>
    )
  }
}

class Home extends Component {
  render(){
    return(
      <div>歡迎你!</div>
    )
  }
}

class Tv extends Component {
  render(){
    return(
      <div>
        <Link to="/">返回</Link> 
          <ul>
              <li>還珠格格</li>
              <li>來自星星的你</li>
          </ul>
      </div>
    )
  }
}

class Movie extends Component {
  render(){
    return(
      <div>
        <Link to="/">返回</Link> 
          <ul>
              <li>暮光之城</li>
              <li>喜劇之王</li>
          </ul>
      </div>
    )
  }
}

const Routes = ({ history }) =>
  <Router history={history}>
    <Route path="/" component={App}>
      <IndexRoute component={Home}/>
      <Route path="/tv" component={Tv} />
      <Route path="/movie" component={Movie} />
    </Route>
  </Router>;

Routes.propTypes = {
  history: PropTypes.any,
};

ReactDOM.render(
    <Routes history={hashHistory} />, 
    document.getElementById('root')
);

從上面的效果圖中,可以看到,有“歡迎你!”這個類似首頁的東西。

IndexRoute默認路由,當path=“/”時,默認顯示Home組件。IndexRoute也是從react-router裏引出的。

 

 

 

ps

這篇還是react基礎(1)寫完以後的存貨,好久沒有更新了,先把這篇存貨發了


Tags: gt lt quot 039 react import

文章來源:


ads
ads

相關文章
ads

相關文章

ad