1. ReactJS是什么?
1). Facebook开源的一个js库
2). 一个用于动态构建用户界面的js库
2. React的特点
* Declarative(声明式编码)
* Component-Based(组件化编码)
* Learn Once, Write Anywhere(支持客户端与服务器渲染)
* 高效
* 单向数据流
3. React高效的原因
1). 虚拟(virtual)DOM, 不总是直接操作DOM
2). 高效的DOM Diff算法, 最小化页面重绘
4. 模块与组件的概念
* 模块: 向外提供特定功能的js程序, 一般就是一个js文件
作用: 简化js的编写, 阅读, 提高运行效率
* 组件: 用来实现特定功能效果的代码集合(html/css/js)
作用: 复用, 简化项目编码, 提高运行效率
5. 模块化与组件化
* 模块化:
当应用的js都以模块来编写的, 这个应用就是一个模块化的应用
* 组件化:
当应用是以多组件的方式实现功能, 这个应用就是一个组件化的应用
6.入门案例
react.js: React的核心库
react-dom.js: 提供操作DOM的扩展库
babel.min.js: 解析JSX语法代码转为纯JS语法代码的库
在页面中导入js
编码
<script type="text/babel"> //必须用babel
 <div id="demo"></div>

 <script type="text/javascript" src="../js/react.js"></script>
<script type="text/javascript" src="../js/react-dom.js"></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">
//页面中的真实容器元素
var containDiv = document.getElementById('demo');
//react的虚拟DOM对象
var vDom = <div id="demo">Hello, React!</div>; //不是字符串, 不能加引号
//将虚拟DOM对象渲染到页面元素中
ReactDOM.render(vDom, containDiv);
//页面结果: <div id="demo"><div id="demo">Hello, React!</div></div>
</script>

7.JSX语法

JSX 即JavaScript XML,它是一种在React 组件内部构建标签的类XML语法,使用JSX可以提高组件的可读性,因此推荐使用。JSX最终会被转换为JavaScript。
1⃣️React组件只能渲染一个根节点,这是由于js的特性,即return语句只能返回单个的值,解决办法是将要返回的值都包含在一个根对象中。
2⃣️JSX不能使用if语句,可使用三元表达式替代,或者将条件语句移动到JSX外部。
<script type="text/babel">
//初始化动态数据
var title = 'I Love you!';
var myName = 'bww';
//创建虚拟dom : JSX
var vDOM = <h1 id="myTitle" name={myName}>{title}</h1>;
//将虚拟dom渲染中页面元素中
ReactDOM.render(vDOM, document.getElementById('example1'));
</script>
8. 自定义组件(Component) :
1). 定义组件
//方式1: 工厂(无状态)函数(最简洁, 推荐使用)
function MyComponent1() {
return <h1>自定义组件标题11111</h1>
}
//方式2: ES6类语法(复杂组件, 推荐使用)
class MyComponent3 extends React.Component {
render () {
return <h1>自定义组件标题33333</h1>
}
}
//方式3: ES5老语法(不推荐使用了)
var MyComponent2 = React.createClass({
render () {
return <h1>自定义组件标题22222</h1>
}
})
2). 渲染组件标签
ReactDOM.render(<MyComponent/>, document.getElementById('example'));
注意:
1). 返回的组件类必须首字母大写
2). 虚拟DOM元素必须只有一个根元素
3). 虚拟DOM元素必须有结束标签
ReactDOM.render()渲染组件标签的基本流程
1). React内部会创建组件实例对象
2). 得到包含的虚拟DOM并解析为真实DOM
3). 插入到指定的页面元素内部
9.组件实例对象3大属性之一: props属性
1. 每个组件对象都会有props(properties的简写)属性
2. 组件标签的所有属性都保存在props中
3. 内部读取某个属性值: this.props.propertyName
4. 作用: 通过标签属性从组件外向组件内传递数据(只读)
5. 对props中的属性值进行类型限制和必要性限制
Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number.isRequired
}
6. 扩展属性: 将对象的所有属性通过props传递
<Person {...person}/>
7. 默认属性值
Person.defaultProps = {
name: 'Mary'
};
8. 组件类的构造函数
constructor (props) {
super(props);
console.log(props); // 查看所有属性
}

 //缺失时设置默认属性
Person.defaultProps = {
sex: '男',
age: 18
};
//初始化数据
let person = {name: 'atguigu', sex: '女', age: 3};
//根据数据动态渲染组件标签
/*ReactDOM.render(<Person name={person.name} age=
{person.age} sex={person.sex}/>,
document.getElementById('example'));*/
ReactDOM.render(<Person {...person}/>,
document.getElementById('example')); const person2 = {name: 'kobe', sex: '女'};
ReactDOM.render(<Person {...person2}/>,
document.getElementById('example2'));

 <script type="text/babel">
//定义内部标题组件
class Welcome extends React.Component {
render() {
return <h2>Welcome {this.props.name}!</h2>;
}
}
Welcome.propTypes = {
name: React.PropTypes.string.isRequired
};
//定义外部应用组件
class App extends React.Component {
render() {
return (
<div>
{
this.props.names.map(
(name, index) => <Welcome name={name} key={index}/>
)
}
</div>
);
}
}
App.propTypes = {
names: React.PropTypes.array.isRequired
}; /**********************************************************/ var names = ['Tom', 'Jack', "Bob"];
ReactDOM.render(<App names={names}/>, document.getElementById('example'));
</script>
10. 组件实例对象的3大属性之二: refs属性
1). 组件内的标签都可以定义ref属性来标识自己
2). 在组件中可以通过this.refs.refName来得到对应的真实DOM对象
3). 作用: 用于操作指定的ref属性的dom元素对象(表单标签居多)
* <input ref='username' />
* this.refs.username //返回input对象
事件处理
1). 通过onXxx属性指定组件的事件处理函数(注意大小写)
* React使用的是自定义(合成)事件, 而不是使用的DOM事件
* React中的事件是通过委托方式处理的(委托给组件最外层的元素)
2). 通过event.target得到发生事件的DOM元素对象
<input onFocus={this.handleClick}/>
handleFocus(event) {
event.target //返回input对象
}
强烈注意
1). 组件内置的方法中的this为组件对象
2). 在组件中自定义的方法中的this为null
* 强制绑定this
* 箭头函数(ES6模块化编码时才能使用)

 class RefsTest extends React.Component {
constructor (props) {
super(props); this.showMsg = this.showMsg.bind(this); // 强制给showMsg()绑定this(组件对象)
this.handleBlur = this.handleBlur.bind(this);
} showMsg() {
// console.log(this); //this默认是null, 而不组件对象
const input = this.refs.msg;
alert(input.value);
} handleBlur(event) {
const input = event.target;
alert(input.value);
} render () {
return (
<div>
<input type="text" ref="msg"/>
<button onClick={this.showMsg}>提示输入数据</button>
<input type="text" placeholder="失去焦点提示数据" onBlur={this.handleBlur}/>
</div>
);
}
}

11.组件实例对象3大属性之: state属性
1). 组件被称为"状态机", 通过更新组件的状态值来更新对应的页面显示(重新渲染)
2). 初始化状态:
constructor (props) {
super(props)
this.state = {
stateProp1 : value1,
stateProp2 : value2
}
}
3). 读取某个状态值
this.state.statePropertyName
4). 更新状态---->组件界面更新
this.setState({
stateProp1 : value1,
stateProp2 : value2
})
12.受控组件
class TwoWay extends React.Component {
constructor(props) {
super(props)
this.state = {
msg: 'atguigu'
}
this.handleChange = this.handleChange.bind(this)
} handleChange(event) {
let msg = event.target.value
this.setState({msg})
} render() {
return (
<div>
<input type="text" value={this.state.msg} onChange={this.handleChange}/>
<p>{this.state.msg}</p>
</div>
)
}
}

 

react入门(上)的更多相关文章

  1. react入门(3)

    在第一篇文章里我们介绍了jsx.组件.css写法  点击查看react入门(1) 第二篇文章里我们介绍了事件.this.props.children.props....other.map循环  点击查 ...

  2. react入门(1)

    这篇文章也不能算教程咯,就算是自己学习整理的笔记把. 关于react一些相关的简介.优势之类的,随便百度一下一大堆,我就不多说了,可以去官网(http://reactjs.cn/)看一下. 这片主要讲 ...

  3. react入门(2)

    接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html React事件 可以先看一下官网讲解的内容h ...

  4. react入门(4)

    首先还是来回顾一下前三篇讲的内容 react入门(1): jsx,组件,css写法 react入门(2):事件,this.props.children,props,...other react入门(3 ...

  5. React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  6. React入门 (1)—使用指南(包括ES5和ES6对比)

    前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...

  7. 2015年最热门前端框架React 入门实例教程

    现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Face ...

  8. React入门资源整理

    另外,附上我搜集的一些比较实用的学习资料,建议先看这些撸起来,再看什么乱七八糟的awsome系列. React入门资源整理 React项目新手指南 http://www.w3ctech.com/top ...

  9. React入门2

    React 入门实例教程 最简单开始学习 JSX 的方法就是使用浏览器端的 JSXTransformer.我们强烈建议你不要在生产环境中使用它.你可以通过我们的命令行工具 react-tools 包来 ...

  10. react入门——慕课网笔记

    一. jsx 1. 被称为语法糖:糖衣语法,计算机语言中添加的某种语法,对语言的功能没有影响,更方便程序员使用,增加程序的可读性,降低出错的可能性 类似的还有(coffeescript,typescr ...

随机推荐

  1. 第二篇 Nosql讲解之windows下memcache的安装(一)

    memcached基本概念 1.Memcached是danga的一个项目,最早是LiveJournal服务的,最初为了加速LiveJournal访问速度而开发的,后来被很多大型的网站采用. 官方网站: ...

  2. c++中初始化列表的初始化变量顺序问题

    例题来看:请问下面程序打印出的结果是什么? #include <iostream> #include <string> using namespace std; class b ...

  3. VC 中TEXT、_T、L的区别

    http://i.cnblogs.com/EditPosts.aspx?opt=1 对于从VC++6.0转到VS2005编译环境中的程序员.往往会碰到字符集之间的转换. VC6.0采用的是ANSI字符 ...

  4. win10子系统linux编译ffmpeg

    android-ndk-r14b(linux版) ffmpeg-4.0 开启win10子系统(控制面板->程序和功能->启用或关闭Windows功能 然后在 适用与 Linux 的 Win ...

  5. [題解]51nod_1515_明辨是非

    好久沒有話多了,是覺得有點浪費時間,今天考試和一中用的一樣的題,結果反而考得不好,不過Jackpei一句知恥而後勇點醒夢中人偷偷@Jackpei 就是這樣吧 還有我極度懷疑我的鍵帽打油了......我 ...

  6. laravel-admin 配置富文本编辑器流程

    laravel-admin默认去除富文本编辑器的,官方也给出了配置方法. 我配置的是wangEditor,本来配置完后就能愉快得使用了,可万万没想到还是有坑的.默认是用base64上传的,也就是数据库 ...

  7. 牛客寒假5-A.炫酷双截棍

    链接:https://ac.nowcoder.com/acm/contest/331/A 题意: 小希现在手里有一个连着的两块木条,长度分别为l1l1,l2l2,木条之间有一个无摩擦的连接点,木条之间 ...

  8. 洛谷 P4137 Rmq Problem / mex

    https://www.luogu.org/problemnew/show/P4137 只会log^2的带修主席树.. 看了题解,发现有高妙的一个log做法:权值线段树上,设数i对应的值ma[i]为数 ...

  9. [aspnetcore]asp.net core程序部署到Ubuntu中的路径问题

    先标记下正确写法 new FileInfo(Environment.CurrentDirectory + "/Config/Log4net.config") 很多同行喜欢这样写: ...

  10. getAnnotation为null的坑

    在写一个基于SpringAOP的权限控制的. 自己定义了一个注解,然后逻辑代码需要通过获取自定义注解的一个属性来进行权限控制. 下面简单上一下关键代码: 自定义注解: @Documented //有关 ...