[React]1:基本语法练习

原文地址:http://www.ruanyifeng.com/blog/2015/03/react.html


/**
 * Created by liyanq on 17/2/28.
 */

import React from 'react'
var ReactROM = require("react-dom");
ReactROM.render(<h1>Hello World</h1>, window.document.getElementById("example"));

var arr = [<span style={{color: "red"}}>one</span>, "two", "three"];//这也行~~~
ReactROM.render(
    <div>
        {arr.map(function (name) {
            return <div key={name}>hello,{name}</div>
        })}
    </div>, window.document.getElementById("arr")
);

/**
 * 组件类的第一个字母必须大写,否则会报错。
 * 组件类只能包含一个顶层标签,否则也会报错。
 * */
var HelloC1 = React.createClass({
    render: function () {
        return <h3>我是HelloC1类,内容:{this.props.name}</h3>
    }
});

ReactROM.render(<HelloC1 name="HelloC1值"/>, window.document.getElementById("c1"));

/**
 * this.props.children 的值有三种可能:
 * 如果当前组件没有子节点,它就是 undefined ;
 * 如果有一个子节点,数据类型是 object ;
 * 如果有多个子节点,数据类型就是 array
 * */
var HelloC2 = React.createClass({
    render: function () {
        return (
            <ul>
                {React.Children.map(this.props.children, function (item) {
                    return <li>{item}</li>
                })}
            </ul>
        )
    }
});

ReactROM.render(
    <HelloC2>
        <span>HelloC2值1</span>
        <span>HelloC2值2</span>
    </HelloC2>, window.document.getElementById("c2"));

/**
 * 组件的属性可以接受任意值,字符串、对象、函数等等都可以。
 * */
var HelloC3 = React.createClass({
    getDefaultProps: function () {
        return {
            defTitle: "MrLi"
        }
    },
    propTypes: {
        title: React.PropTypes.string.isRequired
    },
    render: function () {
        return <h3>HelloC3:{this.props.title};默认属性:{this.props.defTitle}</h3>
    }
});

var d = 123;//EM环境可以使用toString()转换~
ReactROM.render(<HelloC3 title={d.toString()}/>, window.document.getElementById("c3"));

/**
 * 组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。
 * 只有当它插入文档以后,才会变成真实的 DOM 。
 * 根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,
 * 这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。
 * 但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性
 */

var HelloC4 = React.createClass({
    handleClick: function (event) {
        this.refs["myTextInput"].focus();
        console.log(event);
        alert(this.refs["myTextInput"].value);
        event.stopPropagation();
        event.preventDefault();
    },
    render: function () {
        return (
            <div>
                <input type="text" ref="myTextInput"/>
                <button onClick={this.handleClick}>点击弹窗</button>
            </div>)
    }
});

ReactROM.render(<HelloC4/>, window.document.getElementById("c4"));

/**
 * React 的一大创新,就是将组件看成是一个状态机,
 * 一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI.
 * this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件.
 * this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。
 * */
var HelloC5 = React.createClass({
    handleClick: function (event) {
        this.setState({liked: !this.state.liked})
    },
    getInitialState: function () {
        return {liked: false};
    },
    render: function () {
        var text = this.state.liked ? "liked" : "have\'t liked";
        return (
            <div onClick={this.handleClick}>
                You{text} this.click to toggle;
            </div>
        );
    }
});

ReactROM.render(<HelloC5/>, window.document.getElementById("c5"));

/**
 * 文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数.
 * 通过 event.target.value 读取用户输入的值。
 * textarea 元素、select元素、radio元素都属于这种情况
 * */
var HelloC6 = React.createClass({
    handleChange: function (event) {
        this.setState({inputValue: event.target.value})
    },
    getInitialState: function () {
        return {inputValue: "hello"}
    },
    render: function () {
        return (
            <div>
                <input type="text" value={this.state.inputValue} onChange={this.handleChange}/>
                <h3>{this.state.inputValue}</h3>
            </div>
        )
    }
});

ReactROM.render(<HelloC6/>, window.document.getElementById("c6"));

/**
 * Mounting:已插入真实 DOM
 * Updating:正在被重新渲染
 * Unmounting:已移出真实 DOM
 * React 组件样式是一个对象,所以第一重大括号表示这是 JavaScript 语法,第二重大括号表示样式对象。
 * */
var HelloC7 = React.createClass({
    componentWillMount: function () {
        console.log("componentWillMount");
    },
    componentDidMount: function () {
        console.log("componentDidMount");
        this.time = setInterval(function () {
            var opacity = this.state.opacity;
            var count = this.state.count;
            opacity -= 0.2;
            if (opacity < 0.1) {
                count++;
                opacity = 1.0;
            }
            this.setState({opacity: opacity, count: count});
        }.bind(this), 100)
    },
    componentWillUpdate: function () {
        console.log("componentWillUpdate");
    },
    componentDidUpdate: function () {
        console.log("componentDidUpdate");
    },
    componentWillUnmount: function () {
        console.log("componentWillUnmount");
    },
    componentWillReceiveProps: function () {
        console.log("componentWillReceiveProps");
    },
    render: function () {
        return (
            <div style={{opacity: this.state.opacity}}>
                <h3>Hello,{this.props.name}</h3>
            </div>
        )
    },
    getInitialState: function () {
        return {opacity: 1.0, count: 0}
    },
    shouldComponentUpdate: function (nextProps, nextState) {
        return nextState.count < 2;
    }
});

ReactROM.render(<HelloC7 name="World"/>, window.document.getElementById("c7"));

/**
 * 添加jquery分两步,1:添加扩展库,2:在index.html中加入jquery引用。
 * 组件的数据来源,通常是通过 Ajax 请求从服务器获取,可以使用 componentDidMount 方法设置 Ajax 请求,
 * 等到请求成功,再用 this.setState 方法重新渲染 UI
 * */
var HelloC8 = React.createClass({
    getInitialState: function () {
        return {userName: ""}
    },
    componentDidMount: function () {
        $.get(this.props.source, function (result) {
            var lastGist = result[0];
            if (this.isMounted()) {
                this.setState({
                    userName: lastGist.owner["login"],
                    lastGistUrl: lastGist["html_url"]
                })

            }
        }.bind(this))
    },
    render: function () {
        return (
            <di>
                {this.state.userName}'s last gist is
                <a href={this.state.lastGistUrl}>here</a>
            </di>
        )
    }
});

ReactROM.render(<HelloC8 source="https://api.github.com/users/octocat/gists"/>,
    window.document.getElementById("c8"));


var HelloC9 = React.createClass({
    getInitialState: function () {
        return {loading: true, error: null, data: null}
    },
    componentDidMount: function () {
        this.props.promise.then(
            value=>this.setState({loading: false, data: value}),
            function (error) {
                this.setState({loading: false, error: error})
            }
        )
    },
    render: function () {
        if (this.state.loading) {
            return (<span>loading...</span>)
        }
        else if (this.state.error != null) {
            return (<span>error message:{this.state.error}</span>)
        }
        else {
            var items = this.state.data["items"];
            var repoList = items.map(function (item) {
                return (
                    <li key={item["name"]}>
                        <a href={item["html_url"]}>{item["name"]}</a>({item["stargazers_count"]}stars)<br/>
                        {item["description"]}
                    </li>
                )
            });
            return (
                <div>
                    <h1>Most Popular JavaScript Projects in Github</h1>
                    <ol>{repoList}</ol>
                </div>)
        }
    }
});

ReactROM.render(
    <HelloC9
        promise={$.getJSON("https://api.github.com/search/repositories?q=javascript&sort=stars")}/>,
    window.document.getElementById("c9"));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值