本系列将尽可能使用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 信息。

  1. JSX支持嵌入表达式:花括号 把任意的 JavaScript 表达式 嵌入到 JSX 中
  2. JSX是Javascript:比起 HTML, JSX 更接近于 JavaScript, React DOM 使用驼峰(camelCase)属性命名约定。(html为全小写)
  3. JSX防注入攻击:在渲染之前, React DOM 会格式化(escapes) JSX中的所有值。防止 XSS(跨站脚本) 攻击。
  4. 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

  1. 属性是只读的:无论你用函数或类的方法来声明组件, 它都无法修改其自身 props。
  2. 属性是外部控制的:属性是由外部设置,组件内部是不确定属性从哪设置的。
  3. 稳定性:对于同样的输入,始终可以得到相同的结果。

State

  1. state是内部控制的:state是私有的,并且由组件本身完全控制。
  2. 使用setState修改:
    1. 内部调用render
    2. 支持异步
    3. 支持更新合并state

生命周期事件

React组件的生命周期事件很多,常用的有:

  • componentDidMount:在组件第一次初始化render方法后调用,此时组件(DOM及诶点)已创建完成。通常在此方法中ajax、使用第三方js框架。
  • shouldComponentUpdate:在组件接收到新的state或props后被调用。(第一次初始化和forceUpdate时不被调用。 )默认返回true,返回false的时候则不调用render方法。
  • componentWillUnmount:在组件从DOM中移除的时候被调用。通常用来移除组件相关事件。

生命周期事件又分为3条流程:

  1. 组件初始化(Mounting):getDefaultProps、getInitialState、componentWillMount、render、componentDidMount(getInitialState在ES6 class的构造函数中可直接对state初始化)
  2. 组件props更新(Updating):componentWillReceiveProps(nextProps)、shouldComponentUpdate、componentWillUpdate、render componentDidUpdate
  3. 组件卸载(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属性可以设置为一个回调函数,这也是官方强烈推荐的用法;这个函数执行的时机为:

  1. 组件被挂载后:回调函数被立即执行,回调函数的参数为该组件的具体实例。
  2. 组件被卸载或者原有的ref属性本身发生变化时:回调也会被立即执行,此时回调函数参数为null,以确保内存泄露。

ReactDOM.findDOMNode(ref)来获取组件挂载后真正的dom节点。

组件通信

组件之间通信的解决方案通常有2种:

  1. 状态提升:将state提升到互相通信组件的最近的一个父组件上
  2. Redux:下节将介绍

React从入门到放弃之前奏(2):React简介的更多相关文章

  1. React从入门到放弃之前奏(5):ReactRouter4

    概念 安装:npm i -S react-router react-router-dom GitHub:ReactTraining/react-router React Router中有三种类型的组件 ...

  2. React从入门到放弃之前奏(1):webpack4简介

    接触webpack是好久之前的事情了,最近看了下webpack没想到都到4了. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 会创建1个 ...

  3. React从入门到放弃之前奏(3):Redux简介

    安装 npm i -S redux react-redux redux-devtools 概念 在redux中分为3个对象:Action.Reducer.Store Action 对行为(如用户行为) ...

  4. React从入门到放弃之前奏(4):Redux中间件

    redux 提供了类似后端 Express 的中间件概念. 最适合扩展的是redux中的 store.dispatch 方法,中间件实际就是通过 override redux的store.dispat ...

  5. 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)

    jquery 年代 vs 前端模块化 http://blog.csdn.net/offbye/article/details/52793921 ++ 嘿,我最近接到一个 Web 项目,不过老实说,我这 ...

  6. ubuntu-docker入门到放弃(七)Dockerfile简介

    一.dockerfile基本结构 最简单的理解就是dockerfile实际上是一些命令的堆叠,有点像最基础的shell脚本,没有if 没有for,就是串行的一堆命令. 一般而言,dockerfile分 ...

  7. React + Redux 入门(一):抛开 React 学 Redux

    http://www.hacke2.cn/think-in-react-redux-1/

  8. D3.js从入门到“放弃”指南

    前言 近期略有点诸事不顺,趁略有闲余之时,玩起D3.js.之前实际项目中主要是用各种chart如hightchart.echarts等,这些图形库玩起来貌都是完美的,一切皆可配置,但几年前接触了D3之 ...

  9. 一天带你入门到放弃vue.js(一)

    写在前面的话! 每个新的框架入手都会进行一些列的扯犊子!这里不多说那么多!简简单单说一下vue吧! Vue.js是目前三大框架(angular,vue,react)之一,是渐进式js框架,据说是摒弃了 ...

随机推荐

  1. CMake命令行添加编译参数

    CMake命令行添加编译参数 学习自 coroserver 例程: https://github.com/windoze/coroserver coroserver 是一个应用 Boost.Asio ...

  2. Volley网络框架完全解析(缓存篇)

    在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...

  3. DB Query Analyzer 6.02 is released, 71 articles concerned have been published

    DB Query Analyzer is presented by Master Genfeng, Ma from Chinese Mainland. It has English version n ...

  4. C语言之linux内核可变参实现printf,sprintf

    昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃s ...

  5. ZeroC Ice IceBox使用

    IceBox介绍 IceBox就像一个Tomcat,我们只要写N个Ice服务代码,用一个装配文件定义需要加载的服务列表.服务器的启动参数.启动次序等必要信息,然后启动IceBox,我们的应用系统就能够 ...

  6. 安卓笔记-可以滚动的TextView

    本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...

  7. 恶补web之六:javascript知识(2)

    若要向html添加新元素,必须首先创建该元素,然后向一个已存在的元素追加该元素 <div id="div1"> <p id="p1">这 ...

  8. Mongodb3.6 基操命令(二)——如何使用help

    前言 在上一篇文章Mongodb3.6 快速入门(一)中,我们主要使用两个命令: 1.mongod #启动服务 2.mongo #连接mongodb 对于刚接触mongo的人来说,该怎么给命令传递参数 ...

  9. Java自学编程学习之路资源合集

    Java Web学习 STEP.1---Java基础最重要 工欲善其事,必先利其器.想要学好Java Web,或者说想要开始学Java Web,Java的基础是必不可少. 基本语法(★★★★★) 数组 ...

  10. Windows下对拍

    What is 对拍 Tool: 你的程序 可以输出正解的暴力程序 数据生成器 输出对比器 RP 用来干什么? 用来造数据,检验你的程序的正确性,以方便修改和出现未考虑到的情况 如何工作? 数据生成器 ...