接着上一次的讲,如果没有看过上一篇文章的小伙伴可以先看一下http://www.cnblogs.com/sakurayeah/p/5807821.html

五、React事件

可以先看一下官网讲解的内容

案例6:以点击事件为例

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var fn3 = function(){/*方法3*/
console.log(333)
} var Test = React.createClass({ fn1:function(){/*方法1*/
console.log(111)
},/*注意这里是逗号哦*/ render:function(){
var fn2 = function(){/*方法2*/
console.log(222)
}; return (
<div>
<button onClick={this.fn1}>方法1</button>
<button onClick={fn2}>方法2</button>
<button onClick={fn3}>方法3</button>
<button onClick={this.fns.fn4}>方法4</button>
</div>
)
}
}); Test.prototype.fns = {/*方法4,原型链*/
fn4:function(){
console.log(444)
},
} ReactDOM.render(
<Test />,
document.getElementById('example')
)
</script>
</body>
</html>

上面列举了四种方法,效果图如下

react本身定义了一套事件机制遵守W3C标准,规范规定事件名称前面小写,后面关键字首字母大写。

例如(箭头前为js写法,箭头后为react的写法)

onclick --> onClick。

onchange --> onChange

onfocus --> onFocus

onblur --> onBlur

onmousemove --> onMouseMove

...... (有很多,可以参考官网看一下)

六、this.props.children

this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。它表示组件的所有子节点。

案例7:

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Test = React.createClass({
render:function(){
return (
<div>
{this.props.children}
</div>
)
}
});
var Box = React.createClass({
render:function(){
return(
<Test>
<span>序号1,</span>
<span>序号2,</span>
<span>序号3,</span>
</Test>
)
}
});
ReactDOM.render(
<Box />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

上图所示,红框勾起来的部分,div里面包含的所有标签都是 Test 这个组件里面的。

如果把Test这个组件删除掉,如下图所示,如果你将下面红框框起来的代码删除

就会发现报错,如下图所示

分析如下

Box组件里<Test>标签里的内容,通过this.props.children,相当于放到了Test组件里去了,然后再将Test组件放在Box组件里,最后将Box组件渲染在页面上,也就相当于如下

var Test = React.createClass({
render:function(){
return (
<div>
<span>序号1,</span>
<span>序号2,</span>
<span>序号3,</span>
</div>
)
}
});
var Box = React.createClass({
render:function(){
return(
<Test />
)
}
});
ReactDOM.render(
<Box />,
document.getElementById('example')
)

效果如下

案例8:

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Test = React.createClass({
render:function(){
return (
<div>
{
React.Children.map(this.props.children, function(child,index) {
return <p>序号{index}:{child}</p>;
})
}
</div>
)
}
}); var Box = React.createClass({
render:function(){
return(
<Test>
<span>电影</span>
<span>电视剧</span>
<span>综艺</span>
</Test>
)
}
});
ReactDOM.render(
<Box />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

先来说一下上面这个例子中涉及到的map循环

React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 或者是 object 还是 array。

把map循环:和for循环对比一下来解释

先写一个for循环

var arr = [1,2,3,4];
for(var i=0;i<arr.length;i++){
console.log(arr[i])
}

这里有一个点要注意一下,Test组件里面的子节点的个数(上面的例子中Text组件的有三个span子节点)会影响this.props.children的值:

  • 如果Test组件没有子节点,this.props.children为undefined
  • 如果Test组件有一个子节点,this.props.children为object
  • 如果Test组件有多个子节点,this.props.children为array

上面一个例子也就相当于,将Box组件里Test标签里的三个子节点,通过this.props.children放到了Test组件里去,这时候也就相当于Test组件里有一个数组了,数组里面是对应的三个span节点,通过map遍历,将span标签放入到p标签中去,然后再将Test组件放到Box组件里,最终将Box组件渲染到页面上。如下所示

<body>
<div id="example"></div>
<script type="text/babel">
var Test = React.createClass({
render:function(){
var arr = [<span>电影</span>,
<span>电视剧</span>,
<span>综艺</span>];
var temp = [];
for(var i=0;i<arr.length;i++){
temp.push(<p>序号{i}:{arr[i]}</p>);
}
return (
<div>
{temp}
</div>
)
}
}); var Box = React.createClass({
render:function(){
return(
<Test />
)
}
});
ReactDOM.render(
<Box />,
document.getElementById('example')
)
</script>
</body>

效果如下

除了React.Children.map,关于React.Children的更多的方法,可以看官网

七、传递props

React 里有一个非常常用的模式就是对组件做一层抽象。组件对外公开一个简单的属性(Props)来实现功能,但内部细节可能有非常复杂的实现。

案例9:父-子组件的通信

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
clicks:function(){
alert('您好')
},
render:function(){
return (
<div>
<Child user="tom" age="11" fn={this.clicks} />
<Child user="sam" age="13" fn={this.clicks} />
</div>
)
}
}); var Child = React.createClass({
render:function(){
return (
<div>
年纪:{this.props.user},年龄: {this.props.age},
<button onClick={this.props.fn}>点击</button><br />
</div>
)
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

分析如下

这样其实也就是相当于实现了组件之间的通信

案例10:

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
clicks:function(){
alert('您好')
},
render:function(){
return (
<div>
<Child user="tom" age="11" fn={this.clicks} />
</div>
)
}
}); var Child = React.createClass({
render:function(){
var { user, age, fn } = this.props;
return (
<div>
年纪:{user},年龄: {age},
<button onClick={fn}>点击</button><br />
</div>
)
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

这个例子和上面一个例子相同,只是在子组件Child里面的写法有一点不同(如下图红色框框勾出来的),这里我就不讲解,大家看一下知道还可以这么写就行了

八、关于{...other}

有时把所有属性都传下去是不安全或啰嗦的。这时可以使用解构赋值中的剩余属性特性来把未知属性批量提取出来。

列出所有要当前使用的属性,后面跟着 ...other

案例11:

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
clicks:function(){
alert('click')
},
enters:function(){
console.log('enter')
},
render:function(){
return (
<div>
<Child user="tom" age="11" onClick={this.clicks} onMouseEnter={this.enters} />
</div>
)
}
}); var Child = React.createClass({
render:function(){
var { user, age, ...other } = this.props;
return (
<div>
年纪:{user},年龄: {age},
<button {...other}>移动</button><br />
</div>
)
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下(当鼠标移到按钮上的时候,打印enter,当点击按钮的时候,弹框显示click)

分析如下

我们现在要传递的有user、age、onClick、onMouseEnter(如下图所示)

当前我们列出来的属性有user、age(如下图所示),剩下两个onClick和onMouseEnter通过 ...other 来传递,这样写起来也比较简洁

使用 ...other 能确保把所有 props 传下去,除了那些已经被使用了的。

九、关于{...this.props}

案例12:

其实也就是 案例11 的另一种写法(大家知道这么写就行了,我就不详细解释了)

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
clicks:function(){
alert('click')
},
enters:function(){
console.log('enter')
},
render:function(){
return (
<div>
<Child user="tom" age="11" onClick={this.clicks} onMouseEnter={this.enters} />
</div>
)
}
}); var Child = React.createClass({
render:function(){
return (
<div>
年纪:{this.props.user},年龄: {this.props.age},
<button {...this.props}>移动</button><br />
</div>
)
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

案例13:

<!DOCTYPE html>
<html>
<head>
<title>react入门</title>
<meta charset="utf-8">
<script src="https://npmcdn.com/react@15.3.1/dist/react.min.js"></script>
<script src="https://npmcdn.com/react-dom@15.3.1/dist/react-dom.min.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<style type="text/css">
.tab{background:yellow;}
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var Parent = React.createClass({
render:function(){
return (
<div>
<Child checked={true} />
<Child checked={false} />
</div>
)
}
}); var Child = React.createClass({
render:function(){
var bgOne = {
border:'1px solid red'
};
var bgTwo = {
border:'1px solid blue'
};
var { checked } = this.props;
var res = checked?'选中':'不选中';
var bg = checked?bgOne:bgTwo;
return (
<div style={bg}>
<input type="checkbox" checked={checked} />
{res}
</div>
)
}
}); ReactDOM.render(
<Parent />,
document.getElementById('example')
)
</script>
</body>
</html>

效果如下

父组件中传递的信息只有checked是true或者false

在子组件里,我们可以通过这个值来完成多个效果(input是否选中、文字、边框颜色)

在上面的例子中还有一个问题,父组件中我们传递的信息是checked={true},子组件里面input上的属性checked={checked}。这里希望大家不要混淆了,如下图所示

checked={checked}还可以写成checked={this.props.checked}

另外值得一提的是 案例13 里面,我们不可以改变复选框的状态,这里就涉及到了受阻组件和不受阻组件,这里贴一个教程。

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

  1. react入门(3)

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

  2. react入门(1)

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

  3. react入门(4)

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

  4. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  5. React 入门实例教程

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

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

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

  7. React入门简单实践

    参考文献: 1.React入门示例教程——阮一峰 2.React仅仅只是你的界限 React主要的优点就是增量更新(虚拟DOM)和组件化(状态机). <!DOCTYPE html> < ...

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

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

  9. React入门资源整理

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

随机推荐

  1. Unity学习疑问记录之协程

    http://blog.csdn.net/huang9012/article/details/38492937 总结:1.协程相当于多线程但不是,(尽管它们看上去是这样的),它们运行在同一线程中,跟普 ...

  2. C#_技巧:字符串分组排序

    思想//GroupBy+ToDictionary实现Dictionary<> List<string> list = new List<string>(); //l ...

  3. 业务安全通用解决方案——WAF数据风控

    业务安全通用解决方案——WAF数据风控 作者:南浔@阿里云安全 “你们安全不要阻碍业务发展”.“这个安全策略降低用户体验,影响转化率”——这是甲方企业安全部门经常听到合作团队抱怨.但安全从业者加入公司 ...

  4. 剑指Offer面试题:2.二维数组中的查找

    一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  5. 人生苦短,我用python——当我在玩python的时候我玩些什么

    文章背景 家里的第一台电脑是在2006年夏天买的,10年上大学之后基本上就没人用,过没两年就当二手卖给一个熟人. 弟弟小我10岁,今年刚上初一.他在我毕业前半年就整天用妈妈的手机发短信给我,问我什么时 ...

  6. 掀起你的盖头来:Unit Of Work-工作单元

    写在前面 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红又圆呀,好像那苹果到秋天. ...

  7. Azure PowerShell (3) 上传证书

    <Windows Azure Platform 系列文章目录> 本文介绍的是国外的Azure Global Update 2015-09-01 发现一个新的命令,在Azure PowerS ...

  8. 解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题

    1.使用文本编辑器(如Visual Studio Code 或 notepad)打开 MVC 4 项目的 .csproj 文件 2.找到代码(可能会有不同)<ProjectTypeGuids&g ...

  9. windows命令——taskmgr 1

    taskmgr.exe用于任务管理器.它显示系统中正在运行的进程. 该程序使用Ctrl+Alt+Del(一般是弹出Windows安全再点击“任务管理器”)或者Ctrl+Shift+Esc 有时候需要, ...

  10. JSP的基本语法

    JSP的基本语法 一.JSP页面中的JAVA代码 二.JSP页面中的指令 三.JSP页面中的隐含对象(九大内置对象) 目录 一.JSP页面中的JAVA代码 JSP表达式(方便输出) JSP小脚本(完成 ...