React菜鸟食谱
JSX
用小括号包裹代码防止分号自动插入的bug,用大括号包裹里面的表达式
- 切记你使用了大括号包裹的 JavaScript 表达式时就不要再到外面套引号了。JSX 会将引号当中的内容识别为字符串而不是表达式
使用小驼峰定义属性,例如,class变成className,tabIndex对应tabindex
渲染之前会转换为字符串,防止XSS(跨站脚本)攻击
本质上是为react.createElement(component, props, ...children)方法提供的语法糖
data-*,aria-*是例外的,不遵守小驼峰命名规则
没有子代可以使用自闭和标签,
<div className="sidebar" />
- 可以使用Bable在线编辑器看JSX如何转换为JavaScript的
- 可以使用点语法来从模块中导出组件
const MyComponents = {
DatePicker: function DatePicker(props) {
return <div>Imagine a {props.color} datepicker here.</div>;
}
}
function BlueDatePicker() {
return <MyComponents.DatePicker color="blue" />;
}
- react将小写的标签名认为是HTML的原生标签
- 大写的标签名认为是react组件
- 不能用表达式表示标签
- 标签名可以为大写开头的变量
- 如果没有给属性传值,默认为true不建议使用
- 可以使用扩展运算符
...去传递属性 - 组件可以用数组形式返回多个元素
- false,null,undefined,true都是有效的子代,但不会被渲染
- 数字0仍然会被渲染
元素
- immutable不可变的,创建后无法改变其内容与属性
- 更新页面的唯一方法是创建一个新的元素传入reactDOM.render()
- 渲染过程只会更新改变的部分
组件&Props
- 组件像是函数,接受的参数为(props),输出页面上的元素
- 当React遇到的元素是用户自定义的组件,它会将JSX属性作为单个对象传递给该组件,这个对象称之为“props”
- 组件名称必须为大写字母开头,例如
<Welcome /> - 组件必须先定义或引用才可使用
- 组件的返回值只能有一个根元素
- 建议从组件自身的角度来命名props,而不是根据使用组件的上下文命名
- 概念:纯函数在函数内不改变传入参数的值
- 所有的React组件必须像纯函数那样使用它们的props
State & 生命周期
- 状态是私有的,完全受控于当前组件
- 使用类就允许我们使用其它特性,例如局部状态、生命周期钩子,抽象组件的区别
- 类组件应该始终使用props调用基础构造函数
constructor(props){
super(props);
this.state ={date:newDate()};
}- 虽然
this.props由React本身设置以及this.state具有特殊的含义,但如果需要存储不用于视觉输出的东西,则可以手动向类中添加其他字段 - 如果你不在
render()中使用某些东西,它就不应该在状态中 - 使用setState()更新组件的局部状态,状态改变触发render()渲染应该更新的元素
- 不能直接更新状态,构造函数是唯一初始化this.state的方法
- 状态更新是异步的,不能以此为根据去计算下一个值
- 如果需要使用前一个state或者props作为依据,可以使用setState()接受一个函数,该函数接收先前的状态作为第一个参数,将此次更新被应用时的props做为第二个参数:
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));
- setState()是浅合并只合并对应的属性,没对应的不管
- 组件的内部状态其他组件不可访问,但是可以将状态做为属性传递给其子组件
- 状态向子组件传递是单向的,自顶向下的,任何状态始终由某些特定组件所有,并且从该状态导出的任何数据或UI只能影响树中下方的组件
- 组件是有状态的还是无状态的是可能随时间变化的
事件处理
- 绑定事件的命名为驼峰式写法
- JSX需要用大括号包起处理函数,DOM写成字符串
<button onclick="activateLasers()">
Activate Lasers
</button> <button onClick={activateLasers}>
Activate Lasers
</button>
- 使用preventDefault阻止默认行为不能用return false
- 通过
bind方式向监听函数传参事件对象e要排在所传参数的后面
条件渲染
- 在JSX中使用逻辑运算符&&或三目运算符,用花括号包裹
- render()返回null阻止渲染
列表&Keys
- a key should be provided for list items
- keys可以给DOM中的某些元素被增加或删除的时候帮助识别哪些元素发生变化,所以数组中应给不同的key
- JSX的大括号可以包含任意的表达式
- key不会传递给组件
- map()嵌套太多考虑提取出组件
表单
- 表单只接受一个唯一的name
- 使用受控组件表现表单这种本身具有状态的元素,react负责渲染表单的组件控制用户后续操作产生的变化
状态提升
- 如果几个组件需要公用状态数据,最好将这部分提升至他们最近的父组件当中去管理
- 任何可变数据理应只有一个单一的数据源
组合 vs 继承
- 建议使用组合而不是继承
React理念
- 划分你的组件(遵循单一功能原则)
- 创建一个静态版本
- 定义UI状态的最小表示,不要重复了
- 明确组件的状态
- 处理反向数据流
- state只在交互时使用,props是一种父级向子级传递数据的方式
- 自顶向下构建组件适于小型应用,自底向上适用于大型应用
- 底层组件的更新需要更高层级的组件状态更新
- 区分props与state
- 思考你的应用
PropTypes进行类型检查
arrayboolfuncnumberobjectstringsymbolnode(任何可被渲染的元素(包括数字、字符串、子元素或数组)elementPropTypes.instanceOf(Message)某个类的实例PropTypes.oneOf(['News', 'Photos'])限制为某个特定值之一PropTypes.oneOfType([PropTypes.string,PropTypes.number,PropTypes.instanceOf(Message)])限制为列举的类型PropTypes.arrayOf(PropTypes.number)一个指定元素类型的数组PropTypes.objectOf(PropTypes.number)一个指定类型的对象PropTypes.shape({color: PropTypes.string,fontSize: PropTypes.number})一个指定属性及其类型的对象PropTypes.func.isRequired这样如果这个属性父组件没有提供时,会打印警告信息- PropTypes.any.isRequired任意类型的数据
- 自定义验证器,在'oneOfType'中不起作用
- 在arrayOf与objectOf中可以提供自定义的验证器
- 可以使用defaultProps为props定义默认值
- 对于大型的代码库建议使用Flow与TypeScript来代替PropTypes
静态类型检查
- Flow
- TypeScript
- Reason
- Kotlin
- F#/Fable
Refs&DOM
- 几个适用的情况,处理焦点、文本选择或媒体控制、触发强制动画、集成第三方DOM库
- 不要过度适用refs,组件state更为清晰
- ref接受一个回调函数,在组件被加载或卸载时会立即执行
- 回调会在componentDidMount或componentDidUpdate这些生命周期回调之前执行
- 加载时将DOM元素传入ref的回调函数,卸载时传入null
- 当ref属性用于适用class声明的自定义组件时,回调接受加载的React实例,仅对class声明的组件有效
- 不能在函数式组件上使用(function component() {}),因为他们没有实例
- 但是只要ref指向一个DOM元素或者class组件,他就能在组件内部使用
非受控组件
- 只提供初始值和获取结果,其余表单数据由DOM处理
<input />type为text,<select></select>,<textarea>支持defaultValue,type是radio和checkbox支持defaultChecked
性能优化
- 虚拟DOM,当组件的props或者state改变时,React比较新返回的元素个之前渲染的元素来决定是否有必要更新实际的DOM,不相等时会更新DOM
- 利用shouldComponentUpdate返回true时React执行更新
- 返回fasle跳过整个渲染进程,包括组件和之后的内容调用render()
- React.PureComponent不必写自己的shouldComponentUpdate,它只做一个浅比较。但是浅比较会忽略属性或状态突变的情况,此时不能使用它
- 使用不可突变的数据结构可以更轻松的追踪对象变化
小知识点
- 组件的命名的首字母要大写,这是类命名的规范
- setSate()是异步的
- reducer必须返回一个新的对象才能出发组件的更新
- 无论reducer返回的state是否改变,subscribe中注册的所有回调函数都会被触发
- 组件卸载之前,手动加载的监听事件和定时器要手动清除,因为这些不是react的控制范围内,必须手动清除。
- class变为className,for变成htmlFor,因为class和for变成了关键字
- 不得使用setState的事件
- shouldComponentUpdate(nextProps, nextState)
- componentWillUpdate(nextProps, nextState)
- render()
- 存取DOM的适当时机
- componentDidMount()
React菜鸟食谱的更多相关文章
- React 学习资源分享 菜鸟刚学5天 博客写的不多 不懂写博客的套路
http://www.ruanyifeng.com/blog/2015/03/react.html 首先个人强烈推荐 阮一峰的React基础 细细过一遍,看得出大师的用心良苦 然后就开始看书般的过ht ...
- react初始(1)
前言:react框架的出现是因为Facebook在建设Instagram交流平台的时候要处理大量的数据流,但是行业流行的MVC框架并不能适合Facebook公司的要求,他们就组织了自己的人力来开发re ...
- React 基础入门,基础知识介绍
React不管在demo渲染还是UI上,都是十分方便,本人菜鸟试试学习一下,结合阮一峰老师的文章,写下一点关于自己的学习react的学习笔记,有地方不对的地方,希望各位大牛评论指出: PS:代码包下载 ...
- spring + spring mvc + mybatis + react + reflux + webpack Web工程例子
前言 最近写了个Java Web工程demo,使用maven构建: 后端使用spring + spring mvc + mybatis: 前端使用react + react-router+ webpa ...
- React子组件与父组件传值
一 子组件向父组件传值 //子组件var Child = React.createClass({ render: function(){ return ( <div> 请输入邮箱:< ...
- React.js入门小案例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- React 初探
React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...
- 从0开始学习react(一)
本人前端小菜鸡一枚,因为公司要重构网站,打算用用react,毕竟一切为了学习(装B)嘛!!! 在学习react之前,看了许多资料,博客,官方文档之类的,可我这记吃不记打的记性,还是需要在这里记录一下, ...
- React Native Android配置部署踩坑日记
万事开头难 作为一只进入ECMAScript世界不久的菜鸟,已经被React Native的名气惊到了,开源一周数万星勾起了我浓烈的兴趣.新年新气象,来个HellWorld压压惊吧^_^(故意少打个' ...
随机推荐
- Fiddler 抓包工具使用详解
博客园 首页 新随笔 联系 订阅 管理 随笔 - 20 文章 - 0 评论 - 64 Fiddler 抓包工具总结 阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statis ...
- SOE 中调用第三方dll
一.简介 在利用soe实现server的扩展的时候,有些时候,需要调用第三方的dll库.官网中给出了明确的说明,soe中是可以添加第三方的dll文件,但是一直没有测试.按照官方的步骤应该是一个非常的简 ...
- Notice公告
把网页放大到125%食用效果更佳 考试题目的密码是ftp的密码 博猪很菜,菜得抠脚,如果写的有什么问题可以在评论区指出:-) 博猪qq:1755833514
- docker安装升级linux内核(2.6.32->3.10.81)
.内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: yum grouplist #一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具 y ...
- 003-主流区块链技术特点及Hyperledger Fabric V1.0版本特点
一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...
- 01 javaSe 01 抽象类和接口
抽象类 接口 目录(?)[-] 1 抽象类与接口是面向对象思想层面概念不是程序设计语言层面概念 2 抽象类是本体的抽象接口是行为的抽象 3 C中抽象类与接口的探讨 目录(?)[+] ...
- pandas(九)数据转换
移除重复数据 dataframe中常常会出现重复行,DataFrame对象的duplicated方法返回一个布尔型的Series对象,可以表示各行是否是重复行.还有一个drop_duplicates方 ...
- pandas(四)唯一值、值计数以及成员资格
针对Series对象,从中抽取信息 unique可以得到Series对象的唯一值数组 >>> obj = Series(['c','a','d','a','a','b','b','c ...
- CRM——插件流程回顾
1. Django项目启动 自动加载文件 制作启动文件 1. 注册strak 在apps.py 类里面增加如下 def ready(self): from django.utils.module_lo ...
- ruby项目文件上传功能实现
这里我将从视图.控制器各个层面进行讲解. rails 提供了文件上传功能,可以直接进行下面的编码 <%= form_for :document, :html =>{:multipart = ...