react_新手入门教程02-导航栏和面包屑

主题: 导航栏和一级菜单面包屑

导航栏和面包屑.gif

导航栏

导航栏作为通用组件,把它放在conponets文件夹下
并新起一个文件夹main,添加 header.js作为导航栏组件

//app/public/src/conponents

$ mkdir main
$ touch header.js style.css

编辑header及样式

//app/public/src/conponents/main/header.js

/**
 * Created by ocean on 18/3/1.
 */
import React from 'react';
import { Icon } from 'antd';
import { Link } from 'react-router-dom';
import './style.css';

export default () => {
  return (
    <div className="navbar">
      <ul mode="horizontal" className="barstyle">
        <li className="logostyle" key="logo">
          <Icon className="Iconstyle" type="api" />
          <a rel="noopener noreferrer" target="_blank">react · 学习平台</a>
        </li>
        <li key="全部">
          <Link to="/datasource?pageNum=1&pageSize=10">全部</Link>
        </li>
        <li key="精华">
          <Link to="/datasource?pageNum=1&pageSize=10">精华</Link>
        </li>
        <li key="分享">
          <Link to="/datasource?pageNum=1&pageSize=10">分享</Link>
        </li>
        <li key="问答">
          <Link to="/datasource?pageNum=1&pageSize=10">问答</Link>
        </li>
      </ul>
    </div>
  );
};


//app/public/src/conponents/main/style.css

/*header*/

.navbar {
  font-size: 14px;
  width: 100%; // height: 66px;
  background: #0f0f0f url(https://p1.pstatp.com/large/66be00066eb639694007) no-repeat center top;
}

.navbar li {
    display: inline-block;
    line-height: 48px;
}

.navbar ul li{
  margin: 0 20px;
}

.navbar ul li a{
    color: rgba(255, 255, 255, 0.7);
    position: relative;
    letter-spacing: .1rem;
}


.navbar ul li a:hover {
  color: rgba(255, 255, 255, 1);
}

.navbar ul li a:focus {
  text-decoration: none;
}

.navbar ul li:nth-child(2) img{
  vertical-align: middle;
}

.navbar ul li:nth-child(2) img a{
  font-size: 16px;
}

.barstyle {
  max-width: 1200px;
  margin: 0 auto;
  height: 100%;
  background: transparent;
}
.logostyle {
  line-height: 66px;
  font-size: 18px;
}
.logostyle .Iconstyle {
  color: white;
  font-size: 32px!important;
  font-weight: 100;
  opacity: 0.7;
  vertical-align: middle;
  margin-right: 10px;
  transform: rotate(180deg);
}


.header-active{
  color:#fff;
}

在路由配置文件router.js中,引入常驻组件header
并修改布局及全局样式

//app/public/src/router.js

import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

+ // 常驻组件
+ import Header from './components/main/header';
+ 
// 子组件
import Welcome from './pages/welcome';



 export default () => (
   <Router>
     <div>
-        <Switch>
-          {/* welcome */}
-          <Route exact path="/" component={Welcome} />
-        </Switch>
+      <Header/>
+      <div
+        className='main-contains'
+        style={{
+          minHeight: document.body.clientHeight,
+        }}
+      >
+          <Switch>
+            {/* welcome */}
+            <Route exact path="/" component={Welcome} />
+          </Switch>
+      </div>
     </div>
   </Router>
 );

全局样式

//app/public/src/index.css


@import '~antd/dist/antd.css';

/**
 * 全局样式
 */

 *{
   margin: 0;padding: 0;
   font-family: "Hiragino Sans GB","Microsoft YaHei","\9ED1\4F53",Helvetica,Arial,Tahoma,sans-serif;
 }

.main-contains{
  min-height:600px;
  margin:0 auto;
}

.main-contains .content-inner{
  margin: 10px 25px 25px 25px;
  min-height: 600px;
}


.breadcrumb-content .ant-breadcrumb {
  padding: 10px 0 10px 0;
  border-bottom: 1px solid #eee;
  margin: 15px 25px 15px 25px;
  font-size:13px;
}

.ant-table-pagination.ant-pagination {
  margin: 16px 15px;
}

把全局样式统一放在style文件下,便于管理

//app/public/src/index.css

$ mv index.css style

修改index.js引入全局样式的路径

 import React from 'react';
 import ReactDOM from 'react-dom';
-import './index.css';
+import './style/index.css';
 import Router from './router';
 import registerServiceWorker from './registerServiceWorker';

导航栏组件完成

面包屑

注:这里暂时只介绍一级菜单面包屑

面包板作为通用组件,还是放在conponents文件夹中

//app/public/src/conponents

$ mkdir breadcrumb
$ cd breadcrumb
$ touch breadcrumbNameMap.js index.js

breadcrumbNameMap.js用于定义面包屑, 将路由的名称一一对应

//app/public/src/conponents/breadcrumb/breadcrumbNameMap.js

/**
 * 用于定义面包屑
 * 将路由的名称一一对应
 */

const breadcrumbNameMap = {
  '/all': '全部',
  '/good': '精华',
  '/share': '分享',
  '/ask': '问答',
};

module.exports = breadcrumbNameMap;

编辑面包屑组件

//app/public/src/conponents/breadcrumb/index.js

/**
 * 一级菜单面包屑
 */

import React from 'react';
import { Link, withRouter } from 'react-router-dom';
import { Breadcrumb, Icon} from 'antd';

import BreadcrumbNameMap from './breadcrumbNameMap';

const Bread = withRouter((props) => {
  //location 为浏览器默认的api
  const { location } = props;
  const breadcrumbNameMap = BreadcrumbNameMap;

  const url = location.pathname

  let isIndex = false;
  if ( url === '/') {
    isIndex = true;
  }

  const nameItem = breadcrumbNameMap[url]

  const breadcrumbItems = [(
    <Breadcrumb.Item key="home">
            <Link to=""><Icon type="home" /></Link>
        </Breadcrumb.Item>
    ),(<Breadcrumb.Item key={url}>
    <Link to={url}>
      {nameItem}
    </Link>
  </Breadcrumb.Item>)]

  return (
        isIndex ? null :
            <div className="breadcrumb-content">
                <Breadcrumb>
                    {breadcrumbItems}
                </Breadcrumb>
            </div>
  );
});

export default Bread;

注:这里的前端路由主要通过,浏览器默认的api location获取到的
在浏览器控制台输入下location就能👀到

最后在路由配置文件router.js引入breadcrumb组件
点击导航栏即可看到效果
最后在router.js引入面包屑组件即可

// 常驻组件
import Header from './components/main/header';
+import Breadcrumb from './components/breadcrumb';


// 子组件
import Welcome from './pages/welcome';

          minHeight: document.body.clientHeight,
        }}
      >
+         <Breadcrumb/>
          <Switch>
            {/* welcome */}
            <Route exact path="/" component={Welcome} />

资料参考:
https://ant.design/components/breadcrumb-cn/
http://www.ruanyifeng.com/blog/2015/03/react.html (demo3)

(完 待续...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容