react入门(1)之阮一峰react教程
阮一峰老师的github地址:React Demos
React 入门实例教程
1、HTML模板
<!DOCTYPE html> <html><head>// react 核心库<script src="../build/react.js"></script>// react 操作 DOM 库<script src="../build/react-dom.js"></script>// 将 JSX 语法转化为 js 语法<script src="../build/browser.min.js"></script></head><body><div id="example"></div>// 使用 balel 解析jsx 语法<script type="text/babel">// ** Our code goes here! **</script></body> </html>
2、ReactDOM.render()
- ReactDOM.render(参数一, 参数二)
- 参数一:被渲染的标签
- 参数而:被插入的父元素
// ReactDOM.render() 将模板转化为 HTML 语言 ReactDOM.render(<h1>Hello, world!</h1>,document.getElementById('example') );
3、JSX 语法
var names = ['Alice', 'Emily', 'Kate'];ReactDOM.render(<div>{names.map(function (name) {return <div>Hello, {name}!</div>})}</div>,document.getElementById('example') );
在参数一中,{}
中可以键入javascript
代码,可以用来遍历数组,对象等;在其中可以使用return
来返回标签。
JSX 的基本语法规则:遇到 HTML 标签(以 <
开头),就用 HTML 规则解析;遇到代码块(以 {
开头),就用 JavaScript 规则解析。
数组直接写在{}
中就能遍历,如下:数组直接就遍历了,展开这个数组的所有成员。
var arr = [<h1 key="1">Hello world!</h1>,<h2 key="2">React is awesome</h2>, ]; ReactDOM.render(<div>{arr}</div>,document.getElementById('example') );
4、组件
<div id="example"></div> <script type="text/babel">class HelloMessage extends React.Component {render() {return <h1>Hello {this.props.name}</h1>; }}// 使用 this.props 接收组件标签的属性 是一个对象 ReactDOM.render(<HelloMessage name="John" />, document.getElementById('example') ); </script>
组件类的第一个字母必须大写
组件类只能包含一个顶层标签
组件类必须有 / 结尾
所有组件类都必须有自己的 render 方法,用于输出组件
5、this.props.children
this.props.children
:表示组件的所有子节点。
把NotesList
下的所有子节点渲染到 ol li
中
<div id="example"></div><script type="text/babel">class NotesList extends React.Component {render() {return (<ol>{React.Children.map(this.props.children, function (child) {return <li>{child}</li>; })}</ol> );}}// this.props.children 表示组件上的子节点 ReactDOM.render(<NotesList><span>45645</span><span>hello</span><span>world</span></NotesList>, document.getElementById('example'));</script>
6、PropTypes
组件类的PropTypes
属性,就是用来验证组件实例的属性是否符合要求
指定组件中的属性类型
<div id="example"></div><script type="text/babel">var data = 123;class MyTitle extends React.Component {static propTypes = {title: PropTypes.string.isRequired,}render() {return <h1> {this.props.title} </h1>; }}ReactDOM.render(<MyTitle title={data} />, document.getElementById('example'));</script>
7、获取真实的DOM
1、组件并不是真实的DOM节点,而是存在于内存之中的一种数据结构,叫做虚拟DOM,只有插入到文档中才会变成真实的DOM。
2、组件 MyComponent
的子节点有一个文本输入框,用于用户输入,这时就必须获取真实的DOM节点,虚拟DOM是拿不到用户输入的数据的
为了做到这一点,文本输入框必须有一个ref
属性,然后this.ref.[refName]
就会返回这个真实的DOM节点。
需要注意的是,由于 this.refs.[refName]
属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。
代码中,通过为组件指定 Click
事件的回调函数,确保了只有等到真实 DOM 发生 Click
事件之后,才会读取 this.refs.[refName]
属性。
<div id="example"></div><script type="text/babel">class MyComponent extends React.Component {constructor(props) {super(props);this.myTextInput = React.createRef();this.handleClick = this.handleClick.bind(this)}handleClick() {console.log('object');this.myTextInput.current.focus();}render() {return (<div><input type="text" ref={this.myTextInput} /><input type="button" value="Focus the text input" onClick={this.handleClick} /></div> );}}ReactDOM.render(<MyComponent />, document.getElementById('example'));</script>
8、this.state
<div id="example"></div><script type="text/babel">class LikeButton extends React.Component {// 构造器创建 state constructor(props) {super(props)this.state = {liked: false}// p标签上的 方法this.handleClick = this.handleClick.bind(this)}handleClick(event) {// state 下的 liked 状态改变this.setState({ liked: !this.state.liked });}render() {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'));</script>
状态改变渲染页面
上面代码是一个
LikeButton
组件,构造器函数定义 state 状态,这是一个对象,可以通过this.state属性读取,当用户点击组件时,状态改变,this.setState() 方法就修改状态值,每次修改以后,自动调用this.render方法,再次渲染组件。
由于 this.props
和 this.state
都用于描述组件的特性,可能会产生混淆。
一个简单的区分方法是,this.props
表示那些一旦定义,就不再改变的特性,而 this.state
是会随着用户互动而产生变化的特性。
9、表单
类似 vue 的双向绑定...
<div id="example"></div> <script type="text/babel">class Input extends React.Component {constructor(props) {super(props)this.state = {value: 'Hello!'}this.handleChange = this.handleChange.bind(this)}handleChange(event) {// 设置 input 的值this.setState({ value: event.target.value });}render() {var value = this.state.value;return (<div><input type="text" value={value} onChange={this.handleChange} /><p>{value}</p></div> );}}ReactDOM.render(<Input/>, document.getElementById('example')); </script>
10、组件的生命周期
组件的生命周期分为三个状态:
Mounting: 一插入真实的DOM Updating: 正在被重新渲染 Unmounting: 以移除真实 DOM
React为每一个状态都提供了两种处理函数,will
函数在进入状态之前调用,did
函数在进入状态之后调用,三种状态共计五种处理函数。
componentWillMount() 组件挂载之前调用,render()之前调用 componentDidMount() DOM渲染完成后调用,可以用于加载后台数据 componentWillUpdate(object nextProps, object nextState) componentDidUpdate(object prevProps, object prevState) 组件更新时触发该方法,初始渲染不调用 componentWillUnmount() 组件被销毁之前一般用于清理工作(定时器timer、网络请求、订阅事件)
此外,React 还提供两种特殊状态的处理函数。
componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用 shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
例子
<div id="example"></div> <script type="text/babel">class Hello extends React.Component {constructor(props) {super(props)this.state = {opacity: 1.0};}// 已插入真实 DOM 函数在进入状态之后调用 componentDidMount() {this.timer = setInterval(function () {// 将状态机的变量赋值给 opacityvar opacity = this.state.opacity;// 定时 -0.05 opacity -= .05;if (opacity < 0.1) {opacity = 1.0;}// 重新赋值给 statethis.setState({opacity: opacity});}.bind(this), 100);}render() {return (<div style={{opacity: this.state.opacity}}>Hello {this.props.name}</div> );}}// 添加到 DOM 中 ReactDOM.render(<Hello name="world"/>, document.getElementById('example') ); </script>
11、Ajax
使用
componentDidMount
方法设置 Ajax 请求,等到请求成功,再用this.setState
方法重新渲染 UI
使用 jQuery 完成 Ajax 请求
<div id="example"></div><script type="text/babel">class UserGist extends React.Component {constructor(props) {super(props)this.state = {username: '',lastGistUrl: ''}}componentDidMount() {$.get(this.props.source, function(result) {var lastGist = result[0];this.setState({username: lastGist.owner.login,lastGistUrl: lastGist.html_url});}.bind(this));}render() {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.getElementById('example'));</script>
转载于:https://www.cnblogs.com/houfee/p/10772301.html
react入门(1)之阮一峰react教程相关推荐
- React 入门实例 参考阮一峰博客
React 入门实例 参考阮一峰博客 http://www.ruanyifeng.com/blog/2015/03/react.html React 可以在浏览器运行,也可以在服务器运行.服务器的用法 ...
- 阮一峰react入门笔记
1.造树.type=text/babel,逗号分离 2.jsx语法(遇到HTML标签(以 < 开头),就用HTML规则解析:遇到代码块(以 { 开头),就用JavaScript规则解析). 函 ...
- 阮一峰 React Router 教程
阮一峰 React Router 教程 本文介绍 React 体系的一个重要部分:路由库 React-Router.它是官方维护的,事实上也是唯一可选的路由库.它通过管理 URL,实现组件的切换和状态 ...
- 阮一峰 react 系列教程
阮一峰 react 系列教程 阮一峰 react 系列教程 ES6 语法:教程 Babel:教程 React:教程,示例库 Webpack:教程 React 项目脚手架:代码库 Flex 布局:教程, ...
- ES6 标准入门(第二版)阮一峰学习
现在前端环境中,每一位程序员都要求熟练ES6语法,但是大部分ES6的文档都不太完整,接下来的时间,我将为童鞋们分享阮一峰老师第二版的ES6标准.让我们一起来学习一下!!! 本期先说一下学习的目录 1: ...
- 阮一峰react demo代码研究的学习笔记 - React.createElement
Created by Wang, Jerry, last modified on Feb 20, 2016 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- 阮一峰react demo代码研究的学习笔记 - ReactMount.render
Created by Wang, Jerry, last modified on Feb 20, 2016 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- 阮一峰react demo代码研究的学习笔记 - how to debug converted source code
Created by Wang, Jerry, last modified on Feb 20, 2016 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- 阮一峰react demo代码研究的学习笔记 - demo4 debug - create element and Render
Created by Wang, Jerry, last modified on Feb 23, 2016 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
最新文章
- 在XMPP的JAVA开源实现Openfire中,增加LBS 附近的人功能
- 人脸识别加VR技术 港媒:中国高科技加入“垃圾战”
- Oracle数据库LOGGINGNOLOGGING模式概述
- electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信
- thymeleaf动态选中select_一些LowPoly动态渐变效果实现
- 【Java】网络编程
- Nmap个人实战总结
- 分析maven依赖导入失败原因
- 批量获得oracle存储过程等
- JS与OC交互--简单使用
- Windows API函数大全(Windows编程参考手册)
- 简单实用的web打印方案-网页精准打印
- 【洛谷 2888】牛栏
- 你不知道的HelloGitHub!
- 算法创作|龟兔赛跑问题解决方法
- Nginx (一) --------- Nginx 简介
- 分享:DFC开发平台的设计理念
- 简单描述一下redux-thunk的个人理解
- storm mysql trident_Storm入门(十三)Storm Trident 教程
- 电子样本管理系统v1 v1.1.3
热门文章
- 字符串匹配算法之KMP
- realme x2 深度测试打不开_realme 的产品到底是不是贴牌的?
- Windows Mobile 系列文章索引---不断整理中(2009-07-08)
- GoldenGate应用拓扑结构(三)
- redisLock redis分布式锁
- Lync2010服务器的高可用性部署测试
- 让你的微信私人账号也具备公众账号的 关键字回复功能
- ControlStyles(枚举)
- 解决xx is not in the sudoers file. This incident will be reported.问题
- 图片区域帧差法识别物体_matlab