props

创建组件

  • React.createClass;
  • 直接继承React.Component;与上面不同的是初始化propsstate的方法;
export class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: props.initialCount};
}
tick() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div onClick={this.tick.bind(this)}>
Clicks: {this.state.count}
</div>
);
}
}
Counter.propTypes = { initialCount: React.PropTypes.number };
Counter.defaultProps = { initialCount: 0 };

组件属性

  • classforJavaScript的保留字,改用className, HtmlFor;

this.props

  • this.props对象的属性与组件的属性一一对应
  • 但是有一个例外,就是this.props.children, 它表示组件的所有子节点;可以用来控制其他组件插入的位置
  • 注意,只有当子节点多余1个时,this.props.children才是一个数组,否则是不能用map方法;
  • 一次性插入多个属性: {...props};
var App = React.createClass({
render: function () {
var props = {name: 'name', age: 'age'};
return (<div {...props}></div>)
}
});
//
var BHeart = React.createClass({
render: function () {
return (<span {...this.props} >Heart</span>)
}
});
//
<Component {...this.props} more="values" />

PropTypes属性

  • 验证组件实例的属性是否符合要求,否则报Warning;
  • 检验类型,之检验存在的props;
propTypes: {
// are all optional.
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// A React element.
optionalElement: React.PropTypes.element,
//JS's instanceof operator.
optionalMessage: React.PropTypes.instanceOf(Message),
// it as an enum.
optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
// An object that could be one of many types
optionalUnion: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
React.PropTypes.instanceOf(Message)
]),
// An array of a certain type
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
// An object with property values of a certain type
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
// An object taking on a particular shape
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
})
}
  • 检验是否存在
propTypes: {
requiredFunc: React.PropTypes.func.isRequired
}
  • 特定的检验
propTypes: {
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
}

getDefaultProps方法

  • 可以用来设置组件属性的默认值;
var MyTitle = React.createClass({
getDefaultProps : function () {
return {
title : 'Hello World'
};
},
render: function() {
return <h1> {this.props.title} </h1>;
}
});
  • 验证有且只有一个子元素;
var MyComponent = React.createClass({
propTypes: {
children: React.PropTypes.element.isRequired
}, render: function() {
return (
<div>
{this.props.children} // This must be exactly one element or it will throw.
</div>
);
} });
  • 验证有且有多个元素;
 propTypes: {
children: React.PropTypes.arrayOf(React.PropTypes.element).isRequired
}

测试时输出组件

<FancyCheckbox checked={true} onClick={console.log.bind(console)} />

状态机

  • getInitialState方法初始化;

this.setState方法

  • 改变状态;每次会触发重新渲染 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>
);
}
});
  • 可以定义一个回调函数;

  • this.propsthis.state都用于描述组件的特性;前者表示那些一旦定义,就不再改变的特性,而后者是会随着用户互动而产生变化的特性。

虚拟DOM

this.refs

  • ref: 向下搜索,可以定义在当前节点上,也可以定义在当前子组件上再向下查找;
  • 使用函数定义:
componentDidMount: function() {
this._input.focus();
},
render: function() {
return <TextInput ref={(c) => this._input = c} } />;
} //
render: function() {
return (
<TextInput
ref={function(input) {
if (input != null) {
input.focus();
}
}} />
);
},

调用其他组件的方法

  • 调用下层组件方法
   var InputComponet = React.createClass({
reset: function (value) {
console.log(value);
},
render: function () {
return(
<input/>)
}
})
var Btn = React.createClass({
change: function(event){
this.refs.myInput.reset('value');
},
render: function() {
return (
<div>
<button onClick={this.click}>
<InputComponet ref='myInput'/>
</div>
);
}
});
  • 调用上层组件方法
   var Btn = React.createClass({
click: function () {
this.props.click('value');
},
render: function () {
return(
<button onClick={this.click} />)
}
})
var Div = React.createClass({
click: function(value){
console.log(value)
},
render: function() {
return (
<div>
<Btn click={this.click}>
</div>
);
}
});

React.findDOMNode方法

  • 从组件获取真实DOM的节点;
var MyComponent = React.createClass({
handleClick: function() {
React.findDOMNode(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>
);
}
});
  • getDOMNode: 与React.findDOMNode类似,但考虑到es6应该弃用;

  • 定义元素属性: data-x, aria-x;

  • 定义样式: style={{display: 'none'}};

react-基础(1)的更多相关文章

  1. react基础(1)

    在 react入门系列 里面,介绍了一些react的基础知识,在react基础部分,会结合手脚架工具进行更多的总结. 关于webpack我在这里就不讲解了,有需要的小伙伴可以自己去百度一下学习资料,我 ...

  2. react基础(2)

    react基础(1):介绍了如何创建项目,总结了JSX.组件.样式.事件.state.props.refs.map循环,另外还讲了mock数据和ajax 还是用 react基础1 里创建的项目继续写案 ...

  3. react基础语法(五) state和props区别和使用

    props的验证: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  4. react基础用法二(组件渲染)

    react基础用法二(组件渲染) 如图所示组件可以是函数 格式:function 方法名(){ return <标签>内容</标签>} 渲染格式: <方法名 />  ...

  5. react基础用法一(在标签中渲染元素)

    react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 = 赋值: 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名 ...

  6. AntDesign(React)学习-3 React基础

    前面项目已经建起来了,但是没有React基础怎么办,从头学习,这个项目使用的是基于React16.X版本的几种技术集成,那么我们就从网上找一些相关的资料进行研究,我的习惯是用到哪学到哪. 一.先看一些 ...

  7. React 基础入门,基础知识介绍

    React不管在demo渲染还是UI上,都是十分方便,本人菜鸟试试学习一下,结合阮一峰老师的文章,写下一点关于自己的学习react的学习笔记,有地方不对的地方,希望各位大牛评论指出: PS:代码包下载 ...

  8. React基础语法学习

    React主要有如下3个特点: 作为UI(Just the UI) 虚拟DOM(Virtual DOM):这是亮点 是React最重要的一个特性 放进内存 最小更新的视图,差异部分更新 diff算法 ...

  9. React 基础入门

    React 起源于 Facebook 内部项目,是一个用来构建用户界面的 Javascript 库,相当于MVC架构中的V层框架,与市面上其他框架不同的是,React 把每一个组件当成了一个状态机,组 ...

  10. react基础

    上一篇文章主要是记录了自己是如何创建react项目的,今天则主要是总结一下react中的一个基础入门知识,包括数据定义和绑定.属性绑定.数组循环等等. 组件继承和挂载 当我们使用脚手架或者命令行创建一 ...

随机推荐

  1. code vs1506传话(塔尖)+tarjan图文详解

    1506 传话  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解   题目描述 Description 一个朋友网络,如果a认识b,那么如果a第一次收到 ...

  2. ZendStudio如何汉化

    点击工具栏的help,看图 点击 Install New Sofaware...   看图 然后.... 在地址(12.0的版本):http://download.eclipse.org/techno ...

  3. Android 菜单定制使用小结

    GridView 添加 ArrayAdapter<Bean>, 在 gridView 的 Item 点击之后, 1.list.add(bean)/remove(bean) 2.adapte ...

  4. 三、jQuery--jQuery插件--jQuery插件——Validation Plugin

    简介: 客户端验证:现代网站填写表单时,几乎一定会采用的方式. 优点:1.可以减少服务器压力 2.缩短用户等待时间和提升用户体验 jQuery有很多表单验证插件:https://plugins.jqu ...

  5. Python读取xml报错解析--ExpatError: not well-formed (invalid token)

    xml文件内容如代码所示存入的名字为login.xml: <?xml version="1.0" encoding="utf-8"?> <in ...

  6. DBCC常用命令小汇

    DBCC是SQL Server提供的一组控制台命令,功能很强大,掌握一些必要的语句,对操作数据库有不少帮助,所以决定整理一下,发现已有不少类似的整理,减少了不少工作,归类如下: 一.DBCC 帮助类命 ...

  7. Java 解析XML的几种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已. 基本的解析方式 ...

  8. DHCP的若干原理解释

    转自:http://blog.chinaunix.net/uid-22287947-id-1775641.html 搜罗了几种关于dhcp的原理和过程解释 DHCP(Dynamic Host Conf ...

  9. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  10. Power BI for Office 365介绍

    微软在七月份发布了一个新产品,它建立在微软的云的第一个数据平台- Power BI for Office 365.Satya Nadella,服务器和工具业务总裁,在当天的上午在微软的年度全球合作伙伴 ...