// 创建组件

var NewDom = React.createClass({ // 类名一定要大写开头 render: function () { return ( <ol> { React.Children.map(this.props.children, function (child) { // 获得元素的子元素 console.info(child); return (<li>{child}</li>); }) } </ol> ) } }); ReactDOM.render( <NewDom> <span>123</span> <span>456</span> </NewDom>, document.getElementById('example') );

ES6的写法:

class NewDom extends React.Component {
    render() { // 开头花括号一定要和小括号隔一个空格,否则识别不出来
        // 标签开头一定要和return一行
        return <ol>
            {
                React.Children.map(this.props.children, function (child) {
                    return <li>{child}</li>
                })
            }
        </ol>;
    }
}

ReactDOM.render(
    <NewDom>
        <span>123</span>
        <span>456</span>
    </NewDom>,
    document.getElementById('example')
);

React组件的属性props

var NewDom = React.createClass({ // 类名一定要大写
    getDefaultProps: function () { // 设置默认属性
        return {title: '123'};
    },
    propTypes: {
        title: React.PropTypes.string
    },
    render: function () {
        return (<div>{this.props.title}</div>); // 变量用花括号标识
    }
});

ReactDOM.render(
    <NewDom />,
    document.getElementById('example')
);

ES6

class NewDom extends React.Component {
    // 不能在组件定义的时候定义一个属性
    render() {
        return (<div>1 {this.props.title}</div>)
    }
}

NewDom.propTypes = {
    title: React.PropTypes.bool
};

NewDom.defaultProps = {title: '123'}; // 设置默认属性

ReactDOM.render(
    <NewDom/>,
    document.getElementById('example')
);

一般区分两个的原则是,可变的放在state中,不可变的放在props中。

事件

ES5

var NewDom = React.createClass({ // 类名一定要大写开头
    btnClick: function (ele) {
        console.info(ele);
        console.info(this.refs.tex);
    },
    render: function () {
        return (
            <div>
                <input type="text" ref="tex" />
                <input type="button" onClick={this.btnClick} value='click me' />
            </div>
        );
    }
});

ReactDOM.render(
    <NewDom/>,
    document.getElementById('example')
);

ES6

class NewDom extends React.Component {
    btnClick() {
        console.info(this); // this为该组件类
        console.info(this.refs.tex); //this.refs.tex为组件里面索引为tex的
    }
    render() {
        // 注意bind后面的this
        return (
            <div>
                <input type="text" ref="tex" />
                <input type="button" onClick={this.btnClick.bind(this)} value='click me' />
            </div>
        )
    }
}

ReactDOM.render(
    <NewDom/>,
    document.getElementById('example')
);

ES6的坑

  • 类名(组件名)一定要用大写开头,否则自定义的组件无法编译,识别不出来。
  • 类中定义render函数要注意两点,见代码注释。
render() {//开头花括号一定要和小括号隔一个空格,否则识别不出来
   return <ol>//标签前一半一定要和return一行
     {
        React.Children.map(this.props.children, function (child) {
           return <li>{child}</li>;
        })
      }
   </ol>;
}
    • 在class中使用class的变量或者方法,一定要加个this。如this.handlerclick。
    • es6 绑定事件需要onClick={this.func1.bind(this)}
      这样func1和bind里面的参数‘this’的作用域才绑定到了一起(注意es5是不需要这个bind(this)的),func1中如果有this.name这类语句,相当于是使用参数‘this’里面的变量值;或者使用箭头函数func1= (e)=> {函数体}

react代码逻辑很清晰,好维护也好使用。重要的是,需要使用者把从前直接对dom操作的思维方式转换过来,相信会爱上它的。

React访问组件元素的子元素(ES5与ES6的对比)的更多相关文章

  1. JQuery 获取父级元素、同级元素、子元素等

    例: <div> <div id="div_1">这是内容1</div> <div id="div_2">这是内 ...

  2. 当display=none时,元素和子元素高度为0的解决办法

    在前端中为了某种需要,我们需要获取display=none的元素或者子元素的实际高度来进行某些处理,然而html对display=none的元素和子元素是不进行渲染的,如果我们没有规定这些元素的高度那 ...

  3. jquery选择器 之 获取父级元素、同级元素、子元素

    jquery选择器 之 获取父级元素.同级元素.子元素 一.获取父级元素 1. parent([expr]): 获取指定元素的所有父级元素 <div id="par_div" ...

  4. jquery选择器如何获取父级元素、同级元素、子元素

    一.新建页面 <ul> <li>list item 1</li> <li>list item 2</li> <li class=&qu ...

  5. 父元素与子元素之间的margin-top问题

    父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. html代码: <div c ...

  6. jQuery学习笔记---兄弟元素、子元素和父元素的获取

    我们这里主要总结jQuery中对某元素的兄弟元素.子元素和父元素的获取,原声的Javascript代码对这些元素的获取比较麻烦一些,而jQuery正好对这些方法进行封装,让我们更加方便的对这些元素进行 ...

  7. HTML 父元素与子元素之间的margin-top问题

    问题: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. 代码如下: <div ...

  8. 父元素与子元素之间的margin-top问题(css hack)(转载)

    情况: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. 解决方法: 1.修改父元素 ...

  9. CSS 实现:父元素包含子元素,子元素垂直居中布局

    ☊[实现要求]:父元素包含子元素,子元素垂直居中布局 <div class="demo5"> <div class="child">A& ...

随机推荐

  1. HTML5和CSS3基础教程(第8版)-读书笔记(4)

    第16章 表单 表单有两个基本组成部分:访问者在页面上可以看见并填写的控件.标签和按钮的集合:以及用于获取信息并将其转化为可以读取或计算的格式的处理脚本. 基本的表单字段类型包括文本框.单选按钮.复选 ...

  2. 03-JAVA方法

    答:我发现这两个方法的返回类型以及参数类型不一样. package 汉诺塔问题; /**汉诺塔问题*作者:徐浩军 日期:16.10.16 天气:晴*/ public class TowersOfHan ...

  3. 【golang】go语言,进行并发请求的wrap变参封装

    package main import ( "fmt" "sync" "time" ) type WaitGroupWrapper stru ...

  4. canvas像素操作

    像素操作 相关方法:getImageData(x,y,w,h);  putImageData(oImg,x,y);  createImageData(w,h); 1.getImageData(x,y, ...

  5. JS倒计时网页自动跳转代码

    <title>JS倒计时网页自动跳转代码</title> <script language="JavaScript" type="text/ ...

  6. 苹果会在明后年推出13寸屏iPad吗?

    摘要:苹果推大屏iPad的传闻由来已久,近日有国外媒体再次撰文称,这种大屏iPad不仅是苹果Mac继任者,同时也是Surface的有利竞争者……这真的可能吗?这只是分析师的捕风捉影,还是真有这种可能? ...

  7. 【JAVA】通过HttpClient发送HTTP请求的方法

    HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 ...

  8. centos(Linux)系统阿里云ECS搭建 jdk,tomcat和MySQL环境,并部署web程序

    之前我对这个东西一无所知,攻击力为0,谢谢各个论坛上面的兄弟们的帮助. 过程: 首先ssh远程登陆: ssh root@你的公网ip ,输入密码 1,jdk我用的版本是jdk-7u80-linux-x ...

  9. WordPaster.exe安装教程

      安装教程: Firefox控件安装教程 Chrome控件安装教程 Chrome 45+控件安装教程 相关问题: 提示Runtime Error错误 360拦截 Chrome启用npapi Fire ...

  10. IOS, xib和storyboard的混用

    1. 从xib的viewcontroll中启动storyboard 或者 从一个storyboard切换到另一个storyboard: [objc]– (IBAction)openStoryboard ...