React实战-简书
一、安装React
创建名为jiashu
的react-app,并且清理工程目录,仅保留index.js、index.css和App.js文件。步骤略。
二、css样式管理
2.1 react中css使用
在index.css文件中添加样式
1 | .dell { |
然后在App.js文件中,给div添加className,这时页面的div就变成了红色。
注意:并没有给App.js文件引入index.css,只有文件index.js中引用了index.css文件,但是我们在App.js中依然可以使用其中的样式文件。这是因为css文件一旦在一个文件被引入,那么就会全局生效,即全局任何一个文件都能使用这里面的样式。
但是这样容易产生混乱,不建议这么做,这时推荐使用一个第三方的css管理,名为styled-compenents
2.2 react中使用styled-compenents管理css
首先安装该包
1 | npm install --save styled-components |
然后我们给index.css
文件改名为style.js
,然后在index.js文件中修改对应的引用
1 | ~~ import './index.css'; ~~ |
然后在style.js中如何创建全局样式呢,如下
1 | import { injectGlobal } from 'styled-components'; |
这时再看页面,又能正常显示了。
那么如何数据跟组件一对一的样式呢,后面会有介绍。
由于浏览器的差异,如何做到让不同浏览器的样式统一呢?这时需要用到一个reset.css的文件
2.3 完成浏览器样式的统一
不同浏览器内核中对body等标签默认样式的设置是不同的,为了代码再所有浏览器上表现是一致的,这就可以使用reset.css,将里面的内容,拷贝到我们的全局样式里面
1 | import { injectGlobal } from 'styled-components'; |
三、头部区块的编写
一般头部区块,是很多页面都要公用的。
3.1 创建header组件
首先在src目录下创建一个文件夹common,在common文件夹中再创建一个header的文件夹,然后再header文件夹中创建index.js文件,这个就是header的组件。接下来我们来定义这个组件
1 | import React , { Component } from 'react'; |
然后再src/App.js
文件中引入Header组件,并使用
1 | import React,{Component} from 'react'; |
3.2创建header样式
在src/common/header/
文件夹下,创建一个style.js
的样式文件,在里面编写Header自己用的样式
1 | import styled from 'styled-components'; |
这样就可以在Header组件(src\common\header\index.js
)中,引入该样式并使用了
1 | import React , { Component } from 'react'; |
这时header的简易样式就出来了。
查看简书官网可以看到header有58px高,并且有个1px的边框,可以这么修改
1 | height:58px; |
3.3 展示logo
首先去简书官网,将左上角的logo下载到我们项目的src/state/
目录下,命名为logo.png
。
接下来我们在src/common/header/style.js
中定义一个Logo的组件,由于点击该组件可以进行条状,所以该组件是一个a标签
注意在属性url的不能这么写background:url('../../statics/logo.png')
因为webpack打包时会当成字符串,而因该使用引用的方式引用该图片,然后使用${}
形式进行使用;
图片有点大,还要注意给图片设置大小background-size
1 | import logoPic from '../../common/statics/logo.png'; |
然后就可以在/src/common/header/index.js
文件中使用它了,a标签是一个链接,如何让点击时回到首页呢?可以直接给Logo设置href="/"
属性
1 | import React , { Component } from 'react'; |
当然也可以在style.js中设置href属性,可以这么写style
1 | export const Logo=styled.a.attrs({ |
然后我们编写header的中间组件
3.4 编写header中间部分Nav
可以现在/src/common/header/index.js
文件中添加一个新组件Nav,再编写
1 | import React , { Component } from 'react'; |
然后在src/common/header/style.js
中定义一个Nav的组件
1 | export const Nav=styled.div` |
3.5 填充Nav
这样就能看到我们的中间了,接下来我们往Nav中添加东西,添加4个NavItem,为了给它们添加浮动,给它们添加样式
1 | import { HeaderWrapper , Logo , Nav ,NavItem} from './style.js'; |
接下来我们就能在src/common/header/style.js
中定义一个NavItem的组件了,其中&.left
表示NavItem组件有left属性的话,就执行向左浮动;
同时它们也有一些共有的属性如line-height、padding、font-size等;
1 | export const NavItem=styled.div` |
同时也可以给文字指定颜色,比如让首页为红色,其它设为黑色,右侧文字黑色浅一些:
1 | <NavItem className='left active'>首页</NavItem> |
1 | export const NavItem=styled.div` |
3.6 编写NavSearch组件
再Nav中添加NavSearch组件
1 | import { HeaderWrapper , Logo , Nav ,NavItem, NavSearch} from './style.js'; |
然后在src/common/header/style.js
中定义一个NavSearch的组件
1 | export const NavSearch=styled.input.attrs({ |
其中box-sizing:border-box;
表示input框不拉伸;&::placeholder
表示框内文字颜色;
3.7 写注册组件
首先引入Addition,仔里面添加两个Button然后编写style,通过给Button设置className来自定义属性,相应的再style中可以使用&.XXX
来编写对应的样式
1 | import { HeaderWrapper , Logo , Nav ,NavItem, NavSearch,Addition,Button} from './style.js'; |
1 | export const Addition=styled.div` |
3.8 使用iconfont
首先进入iconfont.cn下载几个iconfont图标,放在src/statics/iconfont/
文件夹下,包括下面五个文件:
- iconfont.css
- iconfont.eot
- iconfont.svg
- iconfont.ttf
- iconfont.woff
然后打开iconfont.css文件,在里面将iconfont开头内容,改为添加相对引用的,并且可以删除下面没用的内容
1 | //before |
iconfont我们倾向于将它们全局使用
首先我们将iconfont.css文件改名为iconfont.js,并且引入
1 | import { injectGlobal } from 'styled-components'; |
然后就可以将里面的内容引入全局语法,如下
1 | import { injectGlobal } from 'styled-components'; |
现在这个样式文件还没有全局生效,要生效该怎么做呢?
我们在src/index.js
文件中引入该样式
1 | import './statics/iconfont/iconfont.js'; |
这时我们看页面控制台没有报错,就说明引用成功,接下来我们就可以使用它了。
进入src/common/header/index.js
文件,用iconfont标签插入到相应的组件即可,可以通过i标签引入。
1 | render(){ |
此时我们的页面就展示出来了iconfont元素了。
接下来对搜索地方进行优化,创建一个SeachWrapper样式,将NavSearch和搜索标签包起来,并且在src/common/header/style.js
中定义该样式,如何给里面的iconfont添加样式呢?只需要使用.iconfont{}
即可
1 | export const SearchWrapper=styled.div` |
这里给iconfont搜索按钮添加了圆角框,是为了以后动画服务。