React框架的基本使用和了解
React:
React详解:
安装react 脚手架工具:
npm install -g create-react-app
create-react-app 项目名称
cnpm react-dom -install -S 安装专门进行DOM操作的最主要的应用场景,即ReactDOM.render()
<script type=”text/babel”>
react相关的模板写在其中。
</script>
2:
允许直接在模板中插入javascript变量,如果变量是一个数组,则会展开这个数组的所有成员。
例如:
var arr = [
<h1>Hello world!</h1>,
<h2>React is awesome</h2>,];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example'));
3 :组件:
React 允许将代码封装成一个组件,最后在网页中插入这个组件。使用React.createClass():
var HelloMessage = React.createClass({
render: function() {
return <h1>Hello {this.props.name}</h1>;
}});
ReactDOM.render(
<HelloMessage name="John" />,
document.getElementById('example'));
所有的组件类都必须有自己的render方法,用于输出组件。
注意:1 组件类的第一个字母必须大写. 2 组件类必须只能包含一个顶层标签。
组件在使用时可以加上任何属性, 同时组件的属性可以通过this.props 对象上获取。
添加组件属性需要注意的地方: 1 class属性需要写成className。For属性需要写成htmlFor 主要是因为class和for属性是JavaScript的保留字。
二:this.props.children 属性:表示组件的所有子节点。通过this.props.children属性可以访问到组件的所有子组件的相关属性。
如果当前组件没有子节点:this.props.children 的值为undefined
如果当前组件只有一个子节点: this.props.children的数据类型为object
如果当前组件有多个子节点 那么this.props.children数据类型就是Array.
PropTypes属性 :该属性用于验证当别人使用组件时,提供的参数是否符合要求。
示例: 该组件要求title属性必须是string类型的,且是必须要填写的。
var MyTitle = React.createClass({
propTypes: {
title: React.PropTypes.string.isRequired,
},
render: function() {
return <h1> {this.props.title} </h1>;
}});
getDefaultProps方法可以用来设置组件属性的默认值。
示例:
var MyTitle = React.createClass({
getDefaultProps : function () {
return {
title : 'Hello World'
};
},
render: function() {
return <h1> {this.props.title} </h1>;
}});
ReactDOM.render(
<MyTitle />,
document.body);
上述渲染出来的结果是默认设置的Hello World
三 获取真实的DOM节点:
通过ref属性来获取。
示例:
var MyComponent = React.createClass({
handleClick: function() {
this.refs.myTextInput.focus();
},
render: function() {
return (
<div>
<input type="text" ref="myTextInput" />
<input type="button" value="Focus the text input" onClick={this.handleClick} />
</div>
);
}});
ReactDOM.render(
<MyComponent />,
document.getElementById('example'));
通过this.refs.[refName] 属性 来读取到真正的DOM节点。
React组件支持除了click事件之外的许多其他组件, 例如 KeyDown Copy Scroll 等 详细的React事件 可访问:
https://reactjs.org/docs/events.html#supported-events
四:this.state:
组件开始有一个初始的状态,然后用户互动,导致状态的变化,从而触发重新渲染UI。
示例:
var LikeButton = React.createClass({
getInitialState: function() {
return {liked: false};
},
handleClick: function(event) {
this.setState({liked: !this.state.liked});
},
render: function() {
var text = this.state.liked ? 'like' : 'haven\'t liked';
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle.
</p>
);
}});
ReactDOM.render(
<LikeButton />,
document.getElementById('example'));
首先通过getInitialState方法用于定义初始状态。通过this.state属性读取值。通过this.setState方法就可以修改状态的值。 每次修改以后通过this.render()方法重新渲染组件。
This.props 和this.state的主要区别在于:this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。
五:表单:
用户在表单填入的内容属于用户跟组件的互动。所以不能够使用this.props读取。
示例:
var Input = React.createClass({
getInitialState: function() {
return {value: 'Hello!'};
},
handleChange: function(event) {
this.setState({value: event.target.value});
},
render: function () {
var value = this.state.value;
return (
<div>
<input type="text" value={value} onChange={this.handleChange} />
<p>{value}</p>
</div>
);
}});
ReactDOM.render(<Input/>, document.body);
上述表单中,定义一个onChange事件的回调函数,通过event.target.value读取用户输入的值。textarea,select,radio 元素都属于这种情况。
六:组件的生命周期:
首先组件的生命周期分成三个状态:
- Mounting:已插入真实 DOM
- Updating:正在被重新渲染
- Unmounting:已移出真实 DOM
同时React 为每个状态都提供了两种处理函数: will 函数在进入状态之前调用。did函数在进入状态之后调用。
componentWillMount()
componentDidMount()
componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
componentWillUnmount()
此外 React 还提供了两种特殊状态的处理函数。
- componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
- shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
示例:
var Hello = React.createClass({
getInitialState: function () {
return {
opacity: 1.0
};
},
componentDidMount: function () {
this.timer = setInterval(function () {
var opacity = this.state.opacity;
opacity -= .05;
if (opacity < 0.1) {
opacity = 1.0;
}
this.setState({
opacity: opacity
});
}.bind(this), 100);
},
render: function () {
return (
<div style={{opacity: this.state.opacity}}>
Hello {this.props.name}
</div>
);
}});
ReactDOM.render(
<Hello name="world"/>,
document.body);
注意:style属性的设置方式为:
style={{opacity: this.state.opacity}}
七 Ajax请求的数据来源:
组件的数据来源,通常是通过 Ajax 请求从服务器获取,可以使用 componentDidMount 方法设置 Ajax 请求,等到请求成功,再用 this.setState 方法重新渲染 UI 。
请求数据时,在componentDidMount函数中进行。
示例:
var UserGist = React.createClass({
getInitialState: function() {
return {
username: '',
lastGistUrl: ''
};
},
componentDidMount: function() {
$.get(this.props.source, function(result) {
var lastGist = result[0];
if (this.isMounted()) {
this.setState({
username: lastGist.owner.login,
lastGistUrl: lastGist.html_url
});
}
}.bind(this));
},
render: function() {
return (
<div>
{this.state.username}'s last gist is
<a href={this.state.lastGistUrl}>here</a>.
</div>
);
}});
ReactDOM.render(
<UserGist source="https://api.github.com/users/octocat/gists" />,
document.body);
将一个promise对象传入组件:
ReactDOM.render(
<RepoList
promise={$.getJSON('https://api.github.com/search/repositories?q=javascript&sort=stars')}
/>,
document.body);
如果Promise对象正在抓取数据(pending状态),组件显示"正在加载";如果Promise对象报错(rejected状态),组件显示报错信息;如果Promise对象抓取数据成功(fulfilled状态),组件显示获取的数据。
var RepoList = React.createClass({
getInitialState: function() {
return { loading: true, error: null, data: null};
},
componentDidMount() {
this.props.promise.then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error}));
},
render: function() {
if (this.state.loading) {
return <span>Loading...</span>;
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>;
}
else {
var repos = this.state.data.items;
var repoList = repos.map(function (repo) {
return (
<li>
<a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}
</li>
);
});
return (
<main>
<h1>Most Popular JavaScript Projects in Github</h1>
<ol>{repoList}</ol>
</main>
);
}
}});
React框架的基本使用和了解的更多相关文章
- 当react框架遇上百度地图
百度地图官方文档的使用指导是这样说的:在页面中引入<script type="text/javascript" src="http://api.map.baid ...
- 谈谈出入React框架踩过的坑
1 在JSX的元素中写入内联样式,例如<div style={"color:blue"}></div> 报错:warning:Style prop valu ...
- 【react】当react框架遇上百度地图
百度地图官方文档的使用指导是这样说的:在页面中引入<script type="text/javascript" src="http://api.map.baid ...
- D3.js(v3)+react框架 基础部分之数据绑定及其工作过程与绑定顺序
数据绑定: 将数据绑定到Dom上,是D3最大的特色.d3.select和d3.selectAll返回的元素的选择集.选择集上是没有数据的. 数据绑定就是使被选择元素里“含有”数据. 相关函数有两个: ...
- 认识React框架
在大厂面试的时候被问会不会React框架几乎是必须的,可见React框架在现在前端市场的份额.所以说学习React框架的必要性. react框架起源于Facebook的内部项目,因为对市场上的Java ...
- 搭建 webpack + react 框架爬坑之路
由于工程实践需要搭一个 webpack + react 框架,本人刚开始学,就照b站上的react黑马视频做,爬过无数个坑...希望读者能引以为戒.我的是macos系统 https://www.bil ...
- 【案例分享】在 React 框架中使用 SpreadJS 纯前端表格控件
[案例分享]在 React 框架中使用 SpreadJS 纯前端表格控件 本期葡萄城公开课,将由国电联合动力技术有限公司,资深前端开发工程师——李林慧女士,与大家在线分享“在 React 框架中使用 ...
- react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项
react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项 之前做了一个需求,在注册账号的时候,让用户同意服务条款, 服务条款是一个PDF文件, 这就需要在react内加 ...
- React框架随笔
React框架随笔 现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了 ...
- React框架概述
一.React框架概述 官网:https://reactjs.org/ 最新版V16.10 中文网:https://zh-hans.reactjs.org/ 中文社区网:https://r ...
随机推荐
- Postman API 接口测试、Jenkin 持续集成测试
Postman 是一个创建和使用API的应用,Postman 对于Web开发者来说非常有用,Postman 带来的便利有很多,诸如: RESTFul接口测试不依赖其他端,进度不受影响 测试脚本即文档, ...
- MySQL-19-分布式架构MyCat
MyCAT基础架构图(实验环境) MyCAT实验环境准备 1 环境准备 两台虚拟机: db01(10.0.0.51) db02(10.0.0.52) 每台创建四个mysql实例:3307 3308 3 ...
- 页面模型 PageModel
Razor页面中的程序处理方法 OnGet 和 OnGetAsync是同样的处理程序,因此不能共存,否则会报错. 视图数据 ViewData 视图数据是从页面模型向内容页面传递数据的容器.视图数据是以 ...
- 004 Ethernet(以太网)详解
一.以太网 以太网是一种计算机局域网技术.IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线.电子信号和介质访问层协议的内容. 以太网有两类:第一类是经典以太网,第 ...
- S3C2440—1.熟悉裸机开发板
文章目录 一.板载资源介绍 二.安装驱动及上位机 1.USB的驱动及上位机 2.eop驱动安装 3.安装烧录软件oflash 三.烧写开发板 1.预备知识 2.烧写裸板 3.使用u-boot烧写程序 ...
- 题解 [JXOI2012]奇怪的道路
考场上我坚持认为这是个组合数题... 看到\(k\leq8\)我想状压来着,但是不知道怎么压 实际上,对于点i和点j的连边(\(j\in[i-k, i-1]\))只有连或不连两种状态 而如果i与比j编 ...
- Docker创建seafile搭建私有云
docker-compose.yml version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql en ...
- spring4整合hibernate5以及出现的问题解决办法
每一次的学习,都是一小步一小步的进行的,学习语言,重要的是能把hello world写出来 以及在学习过程中出现的问题能够及时的记录并总结 spring目前最新的版本是4.3,而hibernate是5 ...
- C#基础知识---扩展方法
一.简介 扩展方法为现有的类型(.Net类型或者自定义类型)扩展应该附加到该类型中的方法. 二.基本原则 定义一个非嵌套.非泛型的静态类 扩展方法是静态的 扩展方法至少要有一个参数,该参数类型是要扩展 ...
- 关于RandomAccess
package special; import java.io.IOException; import java.io.RandomAccessFile; /** * 随机访问流: * * 此类不属于 ...