React.js基础知识
一、 react.js的基本使用方法
(1)快速使用,hello world
<div id="app"></div>
<script src="bower_components/react/react.js"></script>
<script src="bower_components/react/JSXTransformer.js"></script>
<script type="text/jsx">
var Message = React.createClass({ //创建组件,首字母必须大写
clickMe: function () { //此处方法可以在组件中直接使用
alert('click again');
},
render: function () {
return (<h1 onClick={this.clickMe} class="addd">hello world!</h1>)
}});
//加载组件
React.render(
<Message/>,
document.getElementById('app'),
function () {
alert('success')
})
</script>
(2)组件的嵌套
//需要注意的是,当嵌套组件时,整个当前组件内容需要用标签包裹起来
var Message1 = React.createClass({
render: function () {
var arr = [];
for (var i = 0; i < 10; i++) { //循环生成组件数组
arr.push<Message2 key={'Meg'+i}/>); //可以添加key进行区分
}
return (
<div> //包裹标签
<h1>组件1</h1>
{arr} //嵌套组件数组
</div>
)
}
});
var Message2 = React.createClass({
render: function () {
return (
<div>
<h2>组件2</h2>
<Message3/> //嵌套其他组件
</div>
)
}
});
var Message3 = React.createClass({
render: function () {
return (
<h3>组件3</h3>
)
}
});
(3)组件的状态state
var Message1 = React.createClass({
getInitialState: function () { //react内置方法设置变量初始状态值
return {
clickCount: 0,
}
},
handleClick: function () {
this.setState({ //react内置方法改变变量状态
clickCount: this.state.clickCount + 1,
})
},
render: function () {
return (
<div>
<button onClick={this.handleClick}>点击</button>
<p>被点击了:{this.state.clickCount}次</p> //设置状态值显示
</div>
)
}
});
(4)组件的参数:组件之间传递数据props
var Message1 = React.createClass({
getInitialState: function () {
return {
message: [
'test1', 'test2', 'test3'
]
}
},
render: function () {
return (
<div>
<Message2 message={this.state.message}/> //向组件2中传递数据
<h1>{title}</h1> //此处传入的是全局变量数据,顶层数据
</div>
)
}
});
var title = '这是title';
var Message2 = React.createClass({
propTypes: { //设置数据的类型
message: React.PropTypes.array.isRequired
},
getDefaultProps: function () { //如果没有数据,显示默认消息
return {
message: ['默认消息']
}
},
render: function () {
var arr = [];
this.props.message.forEach(function (msg, i) { //加载其他组件传递的数据
arr.push(<li key={'key'+i}>{msg}</li>);
})
return (
<div>
{arr}
</div>
)
}
});
(5)组件中的事件(event)
var Message1 = React.createClass({
getInitialState: function () {
return {
selectV: '2',
inputV: 'test again'
}
},
handleSubmit: function () {
console.log('submit');
},
handleInput: function (e) {
this.setState({inputV: e.target.value}); //此处为react封装的事件对象
console.log(e.nativeEvent); //此处可以查看原生的事件对象
},
render: function () {
return (
<form onSubmit={this.handleSubmit}>
<input type="text" value={this.state.inputV} onChange={this.handleInput}/> //添加onChange内置方法
<input type="text" defaultValue='default'/> //可以修改
<select value={this.state.selectV}> //如果设置value则不可修改,必须添加onChange事件,才能修改,推荐用defaultValue
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</form>
)
}
});
(6)组件中元素的指向(ref)
var Message1 = React.createClass({
getInitialState: function () {
return {
inputV: 'test again'
}
},
handleClick: function () {
console.log(this.refs.input.getDOMNode().value); //获取ref=’input’的DOM元素value
this.refs.hello.saySomething(); //调用ref=‘hello’组件的方法
},
console: function () {
console.log('child')
},
render: function () {
return (
<form onSubmit={this.handleSubmit}>
<input ref='input' type="text" value={this.state.inputV}/>
<input ref={function(comName) { //ref可以是一个函数同时执行指向自己的方法
React.findDOMNode(comName).focus()
}} type="text" defaultValue='default'/>
<Child ref='hello' consoleF={this.console}/> //可以向子组件传递方法
<button onClick={this.handleClick} type="button">点击</button>
</form>
)
}
});
var Child = React.createClass({
saySomething: function () {
alert('hello')
},
render: function () {
return (
<div onClick={this.props.consoleF}>
这是child
</div>
)
}
});
(7)react中的双向数据绑定
<script src="bower_components/react/react-with-addons.js"></script> //需要引用带addon功能插件的react,js
<script src="bower_components/react/JSXTransformer.js"></script>
<script type="text/jsx">
var Message1 = React.createClass({
mixins: [React.addons.LinkedStateMixin], //引入mixins插件
getInitialState: function () {
return {
inputV: 'test again',
flag: true
}
},
render: function () {
return (
<div>
<h1>{this.state.inputV}</h1>
<h2>这是多少? {this.state.flag ? '是1!' : '是2 '}</h2>
<input type="checkbox" checkedLink={this.linkState('flag') }/> //设置绑定方法,并绑定数据
<input type="text" valueLink={this.linkState('inputV')}/>
<Child childLink={this.linkState('inputV')}/> //可以传递绑定的方法到子组件中
</div>
)
}
});
var Child = React.createClass({
render: function () {
return (
<input valueLink={this.props.childLink}/> //子组件接收绑定方法
)
}
});
(8)组件的生命周期
组件的周期,主要分为:装载mount、更新update、卸载unmount三个过程
① 装载mount、卸载unmount
var MessageBox = React.createClass({
getInitialState: function () {
console.log('getInitialState') //打印排序1
return {
count: 0
}
},
componentWillMount: function () { //组件将要加载时
console.log('componentWillMount') //打印排序2
},
componentDidMount: function () { //组件已经加载完成时
console.log('componentDidMount') //打印排序4
},
componentWillUnmount: function () { //组件将要删除时
alert('did you want to kill me');
},
killComponent: function () {
React.unmountComponentAtNode(document.getElementById('app')); //react内置删除DOM元素的方法
},
render: function () {
console.log('render') //打印排序3
return (
<div>
<h1>现在计数:{this.state.count}</h1>
<button type="button" onClick={this. killComponent}>点击</button>
</div>
)
}
});
React.render(<MessageBox/>,
document.getElementById('app'),
function () {
console.log('渲染完成啦!!'); //打印排序5
}
)
② 更新update
var MessageBox = React.createClass({
getInitialState: function () {
console.log('getInitialState')
return {
count: 0
}
},
shouldComponentUpdate: function (nextProp, nextState) { //返回一个bool
//判断是否需要更新,有两个参数,如果是组件内部数据,调用nextState,如果是父组件数据,调用nextProp
if (nextState.count > 8) { //如果count大于8不更新
return false;
}
return true;
},
componentWillUpdate: function () { //组件将要更新
console.log('componentWillUpdate')
},
componentDidUpdate: function () { //组件已经更新
console.log('componentDidUpdate');
},
doUpdate: function () {
this.setState({
count: this.state.count + 1
})
},
render: function () {
console.log('render')
return (
<div>
<h1>现在计数:{this.state.count}</h1>
<button type="button" onClick={this.doUpdate}>点击</button>
<Child count={this.state.count}/>
</div>
)
}
});
var Child = React.createClass({
componentWillReceiveProps: function () { //子组件将要接受props
console.log('componentWillReceiveProps');
},
shouldComponentUpdate: function (nextProp, nextState) {
if (nextProp.count > 4) { //子组件使用nextProp中的数据判断是否更新
return false;
}
return true;
},
render: function () {
return (
<h1>现在计数:{this.props.count}</h1>
)
}
});
React.render(<MessageBox/>,
document.getElementById('app'),
function () {
console.log('渲染完成啦!!');
}
)
(9)组件公用方法可以写在mixins中
var stateRecordMixin = { //定义公用的方法内容
componentWillMount: function () {
console.log('componentWillMount')
},
componentWillUpdate: function (nextProp, nextState) {
console.log('componentWillMount')
},
selfFunction: function () {
alert('selfFunction')
}
}
var MessageBox = React.createClass({
mixins: [stateRecordMixin], //加载公用的mixin方法,数组形式
getInitialState: function () {
return {
count: 0
}
},
render: function () {
return (
<div>
<button type="button" onClick={this.selfFunction}>点击</button> //此处即可调用该公用方法中的内容
<Child count={this.state.count}/>
</div>
)
}
});
var Child = React.createClass({
mixins: [stateRecordMixin], //加载公用的mixin方法,数组形式
render: function () {
return (<div>
<button type="button" onClick={this.selfFunction}>点击</button>
</div>
)
}
});
React.render(<MessageBox/>,
document.getElementById('app'),
function () {
console.log('渲染完成啦!!');
}
)
React.js基础知识的更多相关文章
- React JS 基础知识17条
1. 基础实例 <!DOCTYPE html> <html> <head> <script src="../build/react.js" ...
- [JS复习] JS 基础知识
项目结尾,空闲时间,又把<JS 基础知识> 这本书过了一遍,温故知新后,很多知其然不知其所以然的内容 豁然开朗. [1. 用于范围的标签] display :inline or bloc ...
- HTML+CSS+JS基础知识
HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...
- Node.js基础知识
Node.js入门 Node.js Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设在POSIX环境下运行 ...
- 网站开发进阶(十五)JS基础知识充电站
JS基础知识充电站 1.javascript alert弹出对话框时确定和取消两个按钮返回值? 用的不是alert对话框,是confirm confirm(str); 参数str:你要说的话或问题: ...
- NodeJs>------->>第三章:Node.js基础知识
第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info 方法 console.log(" node app1.js 1> ...
- JS基础知识笔记
2020-04-15 JS基础知识笔记 // new Boolean()传入的值与if判断一样 var test=new Boolean(); console.log(test); // false ...
- React.js学习知识小结(一)
学习React也有半个月了吧,这里对所学的基础知识做个简单的总结.自己先是跟着官方文档学,差不多学了四五天,也跟着入门教程做了一个简单的小栗子.然后跟着阮一峰老师的教程上手了几个小Demo,后来在网上 ...
- React入门---基础知识-大纲-1
-----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...
随机推荐
- ABAP CDS ON HANA-(1)CDSビュー作成
Basic CDS View Creation Open HANA Studio. Goto ABAP perspective. Open the project, Navigate to the p ...
- Python的入坑之路(1)
(故事背景:由于涉及到机密的原因,暂时不方便透露,待后期再写.) 国庆长假过完之后,回来上班第二天下午,Boss跟龙哥把我叫了出去,问我要不要转人工智能.一脸懵逼的我,带着一脸懵逼听Boss说人工智能 ...
- 12 TCP服务器 进程 线程 非阻塞
1.单进程服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 serSocket.setsock ...
- APPium-python实例(记录)
https://github.com/appium/sample-code/tree/master/sample-code/examples/python
- 孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1
孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1 (完整学习过程屏幕记录视频地址在文末) 感觉用requests获取到网页的html源代码后,更重要的工作其实是分析得到的内 ...
- Docker安装Zabbix全记录
零.Zabbix架构设计 一.docker安装mysql 查找Docker Hub上的mysql镜像: [root@10e131e69e15 ~]# docker search mysql INDEX ...
- Win10下Pytorch的安装和使用[斗之力三段]
简介: 看到paper的代码是用Pytorch实现的,试图理解代码,但是看不懂,只能先学一些基础教程来帮助理解.笔记本电脑配置较低,所以安装一个没有CUDA的版本就可以了.安装完之后,就可以跟着教程边 ...
- Python中运算符"=="和"is"的差别分析
前言 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).python type()(数据类型)和value(值).is和==都是对对象进行比 ...
- 剑指offer:从头到尾打印链表
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...
- Name node is in safe mode.
刚才启动hadoop,然后执行rm -r命令,出现这个问题,标记为红色的部分意思是namenode是安全节点, [master@hadoop file]$ hadoop fs -rm -r /inp ...