React从入门到放弃之前奏(2):React简介
本系列将尽可能使用ES6(ES2015)语法。所以均在上节webpack的基础上做开发。
React是Facebook开发的一款JS库,因为基于Virtual DOM,所以响应速度快,以及支持跨平台。
(实际上,Virtual DOM在某些情况都会损耗一些性能在diff上,但相比其他MVVM框架比起来性能影响很少,同时大幅提升开发效率也是目前推荐的方式)
安装
安装React: npm i -S react react-dom
安装Babel:npm i babel-loader babel-preset-react babel-plugin-import -S
HelloWorld
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
JSX
JavaScript 的一种扩展语法。我们推荐在 React 中使用这种语法来描述 UI 信息。
- JSX支持嵌入表达式:花括号 把任意的 JavaScript 表达式 嵌入到 JSX 中
- JSX是Javascript:比起 HTML, JSX 更接近于 JavaScript, React DOM 使用驼峰(camelCase)属性命名约定。(html为全小写)
- JSX防注入攻击:在渲染之前, React DOM 会格式化(escapes) JSX中的所有值。防止 XSS(跨站脚本) 攻击。
- JSX编译后为: React.createElement()。
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{ className: 'greeting' },
'Hello, world!'
);
// 注意: 以下示例是简化过的(不代表在 React 源码中是这样)
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
};
组件
React框架的一大特色就是它通过组件化的方式来构建和渲染前端页面。
定义组件有很多方式,最主流的为:函数 和 类(类允许我们在其中添加本地状态(state)和生命周期钩子。)
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Props
- 属性是只读的:无论你用函数或类的方法来声明组件, 它都无法修改其自身 props。
- 属性是外部控制的:属性是由外部设置,组件内部是不确定属性从哪设置的。
- 稳定性:对于同样的输入,始终可以得到相同的结果。
State
- state是内部控制的:state是私有的,并且由组件本身完全控制。
- 使用setState修改:
- 内部调用render
- 支持异步
- 支持更新合并state
生命周期事件
React组件的生命周期事件很多,常用的有:
- componentDidMount:在组件第一次初始化render方法后调用,此时组件(DOM及诶点)已创建完成。通常在此方法中ajax、使用第三方js框架。
- shouldComponentUpdate:在组件接收到新的state或props后被调用。(第一次初始化和forceUpdate时不被调用。 )默认返回true,返回false的时候则不调用render方法。
- componentWillUnmount:在组件从DOM中移除的时候被调用。通常用来移除组件相关事件。
生命周期事件又分为3条流程:
- 组件初始化(Mounting):getDefaultProps、getInitialState、componentWillMount、render、componentDidMount(getInitialState在ES6 class的构造函数中可直接对state初始化)
- 组件props更新(Updating):componentWillReceiveProps(nextProps)、shouldComponentUpdate、componentWillUpdate、render componentDidUpdate
- 组件卸载(Unmounting):componentWillUnmount
表单
受控组件
React负责渲染表单的组件仍然控制用户后续输入时所发生的变化。相应的,其值由React控制的输入表单元素称为“受控组件”。
class ShowInput extends Component {
constructor(props) {
super(props);
this.state = {
val: 'hello'
}
}
onChange(e) {
this.setState({
val: e.target.value
})
}
render() {
return (
<div>
<input type="text" onChange={e => this.onChange(e)} />
<div>{this.state.val}</div>
</div>
)
}
}
DivInput组件中的input元素就是受控组件。value 和 onChnage都会由React控制。
非受控组件
render() {
return (
<div>
<input type="text" ref={e => this.input = e} />
<button onClick={() => console.log(this.input.value)}>Click</button>
</div>
);
}
挂到组件(这里组件指的是有状态组件)上的ref表示对组件实例的引用,而挂载到dom元素上时表示具体的dom元素节点。(stateless构造的组件是不会实例化,所以ref引用的为null)
ref属性可以设置为一个回调函数,这也是官方强烈推荐的用法;这个函数执行的时机为:
- 组件被挂载后:回调函数被立即执行,回调函数的参数为该组件的具体实例。
- 组件被卸载或者原有的ref属性本身发生变化时:回调也会被立即执行,此时回调函数参数为null,以确保内存泄露。
ReactDOM.findDOMNode(ref)来获取组件挂载后真正的dom节点。
组件通信
组件之间通信的解决方案通常有2种:
- 状态提升:将state提升到互相通信组件的最近的一个父组件上
- Redux:下节将介绍
React从入门到放弃之前奏(2):React简介的更多相关文章
- React从入门到放弃之前奏(5):ReactRouter4
概念 安装:npm i -S react-router react-router-dom GitHub:ReactTraining/react-router React Router中有三种类型的组件 ...
- React从入门到放弃之前奏(1):webpack4简介
接触webpack是好久之前的事情了,最近看了下webpack没想到都到4了. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 会创建1个 ...
- React从入门到放弃之前奏(3):Redux简介
安装 npm i -S redux react-redux redux-devtools 概念 在redux中分为3个对象:Action.Reducer.Store Action 对行为(如用户行为) ...
- React从入门到放弃之前奏(4):Redux中间件
redux 提供了类似后端 Express 的中间件概念. 最适合扩展的是redux中的 store.dispatch 方法,中间件实际就是通过 override redux的store.dispat ...
- 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
jquery 年代 vs 前端模块化 http://blog.csdn.net/offbye/article/details/52793921 ++ 嘿,我最近接到一个 Web 项目,不过老实说,我这 ...
- ubuntu-docker入门到放弃(七)Dockerfile简介
一.dockerfile基本结构 最简单的理解就是dockerfile实际上是一些命令的堆叠,有点像最基础的shell脚本,没有if 没有for,就是串行的一堆命令. 一般而言,dockerfile分 ...
- React + Redux 入门(一):抛开 React 学 Redux
http://www.hacke2.cn/think-in-react-redux-1/
- D3.js从入门到“放弃”指南
前言 近期略有点诸事不顺,趁略有闲余之时,玩起D3.js.之前实际项目中主要是用各种chart如hightchart.echarts等,这些图形库玩起来貌都是完美的,一切皆可配置,但几年前接触了D3之 ...
- 一天带你入门到放弃vue.js(一)
写在前面的话! 每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧! Vue.js是目前三大框架(angular,vue,react)之一,是渐进式js框架,据说是摒弃了 ...
随机推荐
- Struts2技术内幕 读书笔记二 web开发的基本模式
最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的 ...
- Linux文件系统的简单操作 - df, du, ln
现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的. 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个命令: df:列出 ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- linux信号量与完成量
信号量: 是用于保护临界区的一种常用方法,它的使用和自旋锁类似.与自旋锁相同,只有得到信号量的进程才能执行 临界区的代码.但是与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等 ...
- javascript中通过元素id和name直接取得元素
我们知道一些第三方的js库对如何快速选取html中的元素做了一些简化,貌似十分高深莫测,其实也不然.而且js本身自带了对于特殊元素的简便选取的方法,下面就为大家简单介绍下. 在html中,一般最直接的 ...
- 排序算法入门之堆排序(Java实现)
堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...
- Collections.sort自定义排序的使用方法
Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...
- 动态规划:给出两个字符串s1和s2,返回其中最大的公共子串
求公共子字符串问题(连续的) 这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!现在想,当时 ...
- Sina微博爬取@pyspider
这是一篇不应该写的文章,都写了,针对特定“方式”的爬虫也就没法爬了. 1.模拟登录的一些文章: 解析新浪微博的登录过程(2013-12-23): http://www.cnblogs.com/houk ...
- windows10不能修改hosts解决方案(亲测)
hosts文本解释: 有时候我们要破解一些软件与服务器通讯,所以通常都需要更改Hosts文件来达到目的,XP系统可以直接修改保存,但是Win10系统却提示没有权限去修改,那么我们要怎样办呢,我们修改的 ...