React是Facebook用来开发insgram的
MVC:Model,View,Control,称之为模型,视图,控制,react属于视图部分
ES5和ES6之间的转换工具叫做Babel,是Nodejs的一个包
npm与nodejs及react的安装
安装好Nodejs和npm环境,查看是否安装成功
1 | node -v |
配置国内镜像
淘宝镜像提供了一个cnpm的工具,可以用cnpm
命令来安装所有的包
1 | $ npm install -g cnpm --registry=https://registry.npm.taobao.org |
也可以直接配置全局文件改变下载地址,mac和Linux的配置文件在~/.npm/.npmrc
,windows的在node安装目录下/node_modules/npm/npmrc
。在其中添加:
1 | registry=https://registry.npm.taobao.org |
旧版react的配置方式
mooc教程中用到的方法比较旧,具体是首先执行npm init
,生成一个package.json
文件,这个文件记录了项目的所有信息,然后通过npm install --sava xxxx
各种包,--save
的意思是将这个包的安装同步到package.json
文件中
新版react的配置方式
现在react官网已经提供了一个专门用于管理react项目的npm包——create-react-app
,用npm install -g
安装,-g
的意思是global,全局安装
1 | npm install -g create-react-app |
再加入以下几行到index.js最上面,用于引用React的相关包
1 | import React from 'react'; |
然后在项目文件夹下运行npm star
,打开浏览器http://localhost:3000,就可以看到一个九宫格页面
运行时如果发现端口占用,在windows下就执行
1 | netstat -ano | findstr 3000 |
在Linux下执行
1 | netstat -aux | grep 3000 |
webpack热加载配置
通过npm install webpack --save
和npm install webpack-dev-server --sava
之后,新建一个webpack.config.js
,输入以下内容用于打包整个文件,然后在命令行执行webpack
,就生成了一个名为bundle.js
的文件,你在html当中应该包含的就是这个bundle.js
文件。
可以使用webpack --watch
命令进入debug模式,这样在你保存文件之后就可以自动打包,不然每次都需要自己去执行webpack
命令。
但是这样还需要自己刷新页面,如果需要自动刷新网页,运行webpack-dev-server --contentbase src --inline --hot
,这样在你更改js之后网页会自动刷新
1 | var debug = process.env.NODE_ENV !== "production"; |
不过新的react的安装方式已经可以自动打包了,就不用手动安装webpack
了
React基本概念
React Virtual DOM
在页面和DOM之间加了一层virtual DOM,dom本身是document object model,有了虚拟DOM之后就可以利用virtual DOM对页面进行更改,virtual DOM由于在数据结构上面的优化,使得原本对不同的DOM的比较的复杂度由$O(n^3)$变成了$O(n)$,
React组件
组件就是一个个小模块,小模块在不同的页面之间都需要用,那么就可以复用,这样开发起来就很快。
我们先开发一个页面头部文件,在src
目录中新建components
文件夹,在其中新建header.js
:
1 | import React, {Component} from 'react' |
这段代码的逻辑是首先从React
这个包里面引入React
和React.Component
两个内容,{}
的作用就是引入包当中的某个变量,然后定义一个外部可访问(export
)的类叫做ComponentHeader
,继承自引入的Component
,类名一定要大写,在其中调用render方法,return一段html内容,注意:返回的一定是一个闭合的HTML标签,也就是最终是一个大的HTML节点,不能有多个,有多个的时候你可以尝试用一个大的节点把他们包裹起来
然后在index.js
当中引用定义的ComponentHeader
组件,render到html文件的header这个id之下,其中定义的ComponentHeader要用tag标记扩起来
1 | import React from 'react'; |
用同样的方法我们可以建立footer.js
和body.js
1 | // footer.js |
1 | //indexBody.js |
然后在index.js
里面再定义一个class用于包含已有的三个header
,indexbody
,footer
三个类
1 | // index.js |
注意:所有的class的name一定要是大写开头的,不然无法识别
JSX内置表达式
1 | import React, {Component} from 'react' |
三元表达式
三元表达式主要是用来进行条件判断的,比如我们在上面的代码汇总,需要判断username
是否为空,用三元表达式a==b?c:d
,判断ab是否相等,如果相等执行c,如果不相等执行d,这个判断语句要包含在大括号中
1 | <p>{userName=='' ? '用户还没有登陆':'用户名:'+userName}</p> |
绑定参数
如果要对一个input的button绑定是否disable的属性,只需要用一个大括号带参数就可以直接绑定成功
注意:绑定js参数的时候,没有引号,有引号会被解析为字符串
解析HTML
如果我们现在有一串HTML代码,需要让render之后可以正确被解析,有两种方法:
使用在线的转码工具,将html代码转成unicode编码的内容,然后传给内容html,比如下面的空格被转换成
\u0020
再传给render1
2var html = "this\u0020is"
<p>{html}</p>使用不推荐的
dangerouslySetInnerHTML
,因为这种方法可能造成xss攻击,因此不推荐1
2var html = "this\u0020is"
<p dangerouslySetInnerHTML=={{__html : html}}></p>
生命周期
react本身定义了一系列的关于页面加载状态的函数,你可以用这些函数来判断页面加载的状态,并在不同状态的时候定义不同的命令
常用的生命周期函数有如下几种,示意图如下
1 | componentWillMount() {} //将要加载成功 |
React事件与属性
state属性
state用于存放react组件的状态,一般赋值为一个json类型,放在constructor
里面
1 | import React, {Component} from 'react' |
通过setState
函数可以改变组件的状态值
props属性
想要把外来的属性传给某个组件,就需要用到props属性,在render的内容中加入参数名={参数值}
就可以直接传回参数,在对应的js文件中直接用{this.props.参数名}
就可以调用
1 | //index.js |
事件与数据的双向绑定
父页面向子页面传递参数是在父页面直接定义变量,在子页面使用props属性来获取。
那么子页面如何向父页面传递参数呢,就需要由父页面向子页面传递一个处理函数,处理函数的event参数可以取到子页面中的值,比如在子页面的输入框中输入内容,改变父页面的某个参数值:
1 | //父页面 indexbody.js |
bind方法
bind方法和call方法以及apply方法差不多,主要是用于解决this的指向问题的,
call方法参数第一个是需要执行的对象,后面依次表示不同的参数
1 | var a={ |
apply方法与call方法基本类似,只是apply后面第一个参数是object,第二个参数是一个打包好的array对象,用于存放所有的后面的参数
1 | var a={ |
bind方法与apply和call略有不同,但是三者都是用来改变this指向的
1 | var a={ |
prop验证
用propTypes
来约束类中的props的类型,isRequired
表示必须给定这个值
用defaultProps
来给定props的默认值
1 | const defaultProps={ |
还有一个技巧:如果有多个参数从父页面传递到子页面,子页面需要再传给自身的子页面的时候,可以用...this.props
,三个点的前两个表示上级页面,第三个点表示上级页面自身的this
1 | <Bodychild {...this.props}/> |
组件refs
refs可以用来找到某个组件,类似于js当中的getElementById
的作用,在某个组建中定义一个ref,在改变的时候只需要用this.refs.xxx
1 | changeUserInfo(age) { |
独立组件间共享Mixins
官方完全不推荐这个方法,因为ES6本身语法不支持,并且可能造成很多问题
如果非要用可以安装一个react-mixin
的库,在需要用到这个东西的地方用React.Mixin(类名.prototypem, 用到的mixins名称)
React样式
React内联样式
直接定义在render函数里面,然后通过className引用,这样相当于在html当中直接嵌入了css代码,是比较不美观的
1 |
|
还可以单独定义css文件
1 | // style.css |
内联css当中的表达式
内联css当中可以嵌套一些简单的三元条件表达式,下面这个例子是在点击使得状态miniHeader
改变的时候,调整header的padding值
1 | export default class ComponentHeader extends Component { |
css模块化
css模块化就是在css引入的时候的第二种方法,引入css文件,给组件的ClassName赋值
1 | import '../css/style.css' |
css与React内联样式互转
如果你有一个很大的css文件,在开发React-native的时候,你只能使用内联样式,这时你可以使用在线转换工具把css转换为React内联样式,转换工具地址
Ant Design框架
Ant Design是蚂蚁金服出的一个React UI框架,其中有一部分是介绍设计审美的,是非常值得一看的
通过https://ant.design/docs/react/use-with-create-react-app-cn进行使用
引入Ant Design
现在从 yarn 或 npm 安装并引入 antd。
1 | $ yarn add antd |
修改 src/App.js
,引入 antd 的按钮组件。
1 | import React, { Component } from 'react'; |
修改 src/App.css
,在文件顶部引入 antd/dist/antd.css
。
1 | @import '~antd/dist/antd.css'; |
好了,现在你应该能看到页面上已经有了 antd 的蓝色按钮组件,接下来就可以继续选用其他组件开发应用了。其他开发流程你可以参考 create-react-app 的官方文档。
React-Router
React-Router用于页面之间的跳转
刷新部分页面内容
如果需要刷新部分页面内容,可以用BrowserRouter
或者是HashRouter
当中的一个,引入方法如下
1 | import {HashRouter as Router, Route, Link} from "react-router-dom"; |
然后在index
类当中加入链接地址和Route
1 | export default class Index extends Component { |
Route是专门用来改变内容的,Route那一部分在哪,就改变哪一部分的内容,比如现在Route在<APP />
后面,那么就改变<App />
后面的内容
重新定向到新页面
如果需要定向到新页面,需要用到Switch
参数,导入方法是:
1 | import {HashRouter as Router, Switch, Route, Link} from "react-router-dom"; |
此时需要将Index当成一个普通的类,嵌套到另一个export的类当中(因为一个js页面只能有1个export的类),比如我们现在定义一个Root
类,在Root
类当中定义一个Router
,在Router
中嵌套Switch
方法(因为官方规定Switch只能在Router当中使用),再在Switch当中嵌套一堆Route
,用于定于需要路由的地址(第一个地址默认解析,后面的在你点的时候解析),代码如下:
1 | class Index extends Component { |
网站开发常用技巧及资源
chrome模拟手机端
直接在chrome的开发者工具中点审查元素旁边的按钮,就可以模拟手机的显示效果,还可以显示手机边框
findIcon找图标
一个非常好的网站图标资源网站,地址:https://www.iconfinder.com/
项目实战开发
pc端页头的开发
用到ant design的menu组件,还有ant desing的flex布局,flex布局将整个页面一共分为24列,我们这里左右各空2列,4列用于放logo,16列用于放menu
1 | //pc_header.js |
1 | /*pc.css*/ |
注意**:引入图片的时候要用import的方法来引入,不然会找不到图片
menu菜单有两个属性,mode
用于控制菜单的水平或者是竖直,selectedKeys
用于设置一开始选中的标签
mode="horizontal" selectedKeys={[this.state.current]}
移动端header的开发
要判断是pc端还是移动端用到一个react-responsive
这个库,通过npm install --save react-responsive
进行安装
在index.js
中进行判断是pc则返回fc端index,是手机则返回手机端index
1 | class Root extends Component { |
在mobile header中先放入图标和名称,别的先不动
1 | // mobile_header.js |
1 | html{ |
mobile及pc的footer开发
两者内容基本相同,这里贴出一个mobile_footer.js
1 | import React,{Component} from 'react'; |