React - 学习笔记
1. 环境准备
1. 1 NodeJS
1.1.1 安装NodeJS
- 下载安装包:nodejs;
- 检查安装:
node -v
,npm -v
; - 配置国内源: 淘宝镜像
http://npm.taobao.org/
;使用cnpm
进安装;可以修改npmrc
改变耐默认地址;
1.1.2 初始化React环境
1)初始化npm
2)初始化依赖包
3)安装es2015依赖
1.2 webpack
1)增加webpack.config.js
文件
2)下载安装webpack
3)在项目路径下安装webpack
4)打包项目
5)热部署
|
|
6)启动调试服务器
|
|
1.3 Atom
atom-ternjs
:ES5/ES6支持,NodeJS,Angular等支持;atom-beautify
:格式化支持;open-in-browser
:在浏览器中打开;emmet
:zencoding;file-icons
:文件图标;highlight-selected
Highlight Line
2. React 基础组件
2.1 虚拟DOM
- 架构:在
DOM
及APP
之间,增加一层Virtual DOM
; - 快速:虚拟DOM可以将页面变更损耗的代价从
O(n^3)
降低到O(n)
; - 实现:可以快速对变化的子树做
Patch
,只针对变更的节点处理,减少损耗;
2.2 React 组件
知识点
- 组件的
return
函数里返回的HTML
节点必须是一个; - 可以给外部使用的组件需要加上
export default
; - 入口定义使用
ReactDOM.render([JSX], [DOM])
; - 可以使用
{变量名}
引用一个组件,可以通过参数的形式 ;
基础依赖
定义React
组件时,一般都需要依赖两个模块:
定义一个基本组件
定义一个复合组件
2.3 JSX内置表达式
三元表达式
动态绑定
- 使用单花括号进行绑定;
- 绑定HTML属性时不需要引号;1<p><input type="button" value={userName} disabled={boolInput}/></p>
注释
- 注释的语法比较特殊;1{/* 这是一些注释 */}
绑定HTML代码
- 如果绑定的变量中含有转义符,需要使用
dangerouslySetInnerHTML
参数绑定; - 危险绑定可能造成
XSS
攻击; - 也可以进行
unicode
转码;1<p dangerouslySetInnerHTML={{__html : html}}></p>
2.4 生命周期
生命周期流程图
componentWillMount
:组件将要加载;componentDidMount
:组件加载完成;
生命周期步骤
3. React 属性与事件
3.1 state 属性
state
属性作为组件自身的信息承载体;- 初始化可以放在构造函数
constructor
中; - 修改
state
需要使用函数this.setState(obj);
; - 可以使用
this.state.xxx
引用state
中的值; state
的作用域只在当前类中,不污染其他模块;
3.2 props 属性
- 和
state
不同,可以从外来传入属性参数; - 可以通过JSX标签的属性传入
props
;
-可以通过this.props.xxx
引用props
中的值;
|
|
3.3 事件与数据的双向绑定
子组件向父组件传递参数
- 父组件向子页面传递处理函数;
- 子组件将值传递到处理函数中;
- 父组件在处理函数中获得值的变化,对自身属性进行修改;
- 需要注意对
this
进行绑定; - 通过
event.target.value
可以引用事件中的参数;
|
|
3.4 可复用组件
Prop 验证
- 可以对字段类型及必填校验进定义;
|
|
Prop 默认值
- 可以给
props
属性定义默认值,若没有传递参数,则使用默认值;123456//定义const defaultProps = {username: '这是一个默认的用户名'};//应用BodyIndex.defaultProps = defaultProps;
传递所有参数
- 使用
{...this.props}
可以一次性传递所有参数;
|
|
3.5 组件的Refs
原生方式获取DOM节点
- 不推荐,可能导致性能或安全问题; 12var mySubmitBotton = document.getElementById('submitBotton');ReactDOM.findDOMNode(mySubmitBotton).style.color = 'red';
Ref 方式获取DOM节点
- 访问到组件内部DOM节点的唯一可靠方法;
- 不要在
render
之前对Refs
进行调用; - 不要滥用;12345//定义<input type='button' ref="submitBotton" />//引用this.refs.submitBotton.style.color = 'red';
3.6 独立组件间共享Mixins
- 在不同的组件之间共享代码;
- 和页面具有类似的生命周期;
- 在
ES6
环境下需要安装插件;
|
|
4. React 样式
4.1 内联样式
JS样式
- 会解析成页面的内联样式,不推荐使用;
- 样式要在
render
函数中定义; - 可能在
ReactNative
中使用到; - 有一些局限,比如
hover
、动画不能使用;
|
|
引用样式
- 使用
className
关键字进行应用;
|
|
表达式
- 在内联样式中可以使用表达式的形式,动态控制样式对象;1paddingTop: (this.state.miniHeader) ? '3px' : '15px'
4.2 CSS模块化
模块化的原因
- 全局污染;
- 命名混乱;
- 依赖管理不彻底;
- 无法共享变量;
- 代码压缩不彻底;
模块化的优点
- 所有样式都是local的,解决了命名冲突和全局污染;
class
名称生成规则灵活,可以压缩;- 只需引用组件的JS就可以搞定所有的JS和CSS;
CSS Module 模块化
4.3 JSX与CSS样式互转
4.5 Ant Design 样式框架
常见的React样式框架
Material-UI
Ant Design
React-Bootstrap
Amaze UI React
基础使用