zoukankan      html  css  js  c++  java
  • React语法入门中

    <div id="demo"></div><!--html元素或需要被操作的元素-->
    <script type="text/babel">
        /*创建标签名字第一个字母大写*/
        var Helloworld = React.createClass({
            render:function(){
                return (<div>hello world</div>);
            }
        });
        /*ReactDOM.render 是 React 的最基本方法,用于将模板(html,jsx,React.createElement等)转为 HTML ,并插入指定的 DOM 节点。*/
        ReactDOM.render(<Helloworld/>,document.getElementById('demo'),,function(){
            console.log('执行成功之后的回调函数');
        });
    </script>

    Demo1

        <div id="app"></div>
        <div id="demo"></div>
        <script type="text/babel">
            var Helloreact = React.createClass({
                render:function(){
                    return (<div>hello react</div>);
                }
            });
            var Helloworld = React.createClass({
                render:function(){
                    var reacts = [];
                    for(var i=0;i<10;i++){
                        reacts.push(<Helloreact key={'Helloreact'+i}/>);
                    }
                    return (
                        <div>
                            <div>hello world</div>
                            {reacts}
                        </div>);
                }
            });
            var demos = ['demo1','demo2','demo3'];
            ReactDOM.render(
                <Helloworld/>,
                document.getElementById("app"),
                function(){
                    console.log('success');
                }
            );
    
            ReactDOM.render(
                <div>
                    {demos.map(function(demo){
                        return (<div key={'demo'+demo}>Hello {demo}</div>);
                    })
                    }
                </div>,document.getElementById('demo'),function(){
                    console.log('success');
                }
            );
        </script>

    Demo2

        <div id="demo"></div>
        <script type="text/babel">
            var ClickDemo = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                getInitialState:function(){
                    return {clickCount:0};
                },
                clickFun:function(){
                    /*this.setState是更新state中的参数,执行实时更新组件的方法*/
                    return this.setState({clickCount:this.state.clickCount + 1});
                },
                render:function(){
                    return (
                        <div>
                            <div>共点击了{this.state.clickCount}</div>
                            <button onClick={this.clickFun}>点我</button>
                        </div>);
                }
            });
            ReactDOM.render(<ClickDemo/>,document.getElementById('demo'));
        </script>

    Demo3

        <div id="demo"></div>
        <script type="text/babel">
            var MessageBox = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                getInitialState:function(){
                    return {
                        isVisible:true,
                        title:'你好react',
                        subMessages:['码代码可以改变世界','码代码是上帝创造的鬼斧神工','码代码可以走向人生巅峰']
                    }
                },
                render:function(){
                    /*
                        <Helloreact messages={this.state.subMessages}/> 这是将当前组件中的state的subMessages数组传入到Helloreact组件中去,
                        messages是传入props的属性名
                    */
                    return (
                        <div>
                            <div>{this.state.title}</div>
                            <Helloreact messages={this.state.subMessages}/>
                        </div>
    
                    )
                }
            });
            var Helloreact = React.createClass({
                /*
                    这是设置当前默认的messages数组,如果前面组件未传入参数进来就取默认的
                */
                getDefaultProps:function(){
                    return {messages:['默认喜欢码代码']}
                },
                render:function(){
                    /*
                        React中的每一个组件,都包含有一个属性(props),属性主要是从父组件传递给子组件的,在组件内部,我们可以通过this.props获取属性对象
                        react官方认为,props应该是只读的,不应该被修改。因为 React 不能帮你检查属性类型(propTypes)。这样即使你的 属性类型有错误也不能得到清晰的错误提示。
                        Props 应该被当作禁止修改的。修改 props 对象可能会导致预料之外的结果,所以最好不要去修改 props 对象。
                    */
                    var msgs = [];
                    /*
                        map():返回一个新的Array,每个元素为调用func的结果
                        forEach():没有返回值,只是针对每个元素调用func
                    */
                    this.props.messages.forEach(function(msg,index){
                        msgs.push(<p key={index}>码农说:{msg}</p>);
                    });
                    return (<div>{msgs}</div>);
                }
            });
            ReactDOM.render(<MessageBox/>,document.getElementById('demo'));
        </script>

    Demo4

        <div id="demo"></div>
        <script type="text/babel">
            var FormApp = React.createClass({
                getInitialState:function(){
                    return {
                        inputValue:'this is inputValue',
                    };
                },
                changeFunc:function(e){
                    this.setState({
                        /*设置当前state中inputValue的值是该html元素对象的value值*/
                        inputValue:e.target.value
                    });
                },
                submitFunc:function(e){
                    e.preventDefault();/*阻止默认事件*/
                    console.log('form is submiting......');
                    console.log(e);
                },
                render:function(){
                    /*
                        表单属性中defaultValue属性和value的区别
                        defaultValue是默认值,第一次设置时生效,手动输入值时允许被改变
                        value是当前input的值,手动输入值不会被改变
                        如果需要改变当前value的值则需要使用onChange事件来改变其中this.state.inputValue的值
                    */
                    return (
                        <form onSubmit={this.submitFunc} action="" method="post">
                            <input type="text" defaultValue={this.state.inputValue}/><br/><br/><br/>
                            <input type="text" onChange={this.changeFunc} value={this.state.inputValue}/><br/><br/><br/>
                            <button type="submit">提交一下</button>
                        </form>
                        );
                }
            });
            ReactDOM.render(<FormApp/>,document.getElementById('demo'));
        </script>

    Demo5

        <div id="demo"></div>
        <script type="text/babel">
            var FormApp = React.createClass({
                getInitialState:function(){
                    return {
                        inputValue:'this is inputValue',
                    };
                },
                changeFunc:function(e){
                    this.setState({
                        /*设置当前state中inputValue的值是该html元素对象的value值*/
                        inputValue:e.target.value
                    });
                },
                submitFunc:function(e){
                    e.preventDefault();/*阻止默认事件*/
                    console.log('form is submiting......');
                    /*
                        ref是React中的一种属性,当render函数返回某个组件的实例时,可以给render中的某个虚拟DOM节点添加一个ref属性
                        ref 属性
                        React 支持一种非常特殊的属性,你可以用来绑定到 render() 
                        输出的任何组件上去。这个特殊的属性允许你引用 render() 返回的相应的支撑实例
                        ( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。
                        下面4种方式都可以通过ref获取真实DOM节点
                        var usernameDOM = this.refs.username.getDOMNode();
                        var usernameDOM = React.findDOMNode(this.refs.username);
                        var usernameDOM = this.refs['username'].getDOMNode();
                        var usernameDOM = React.findDOMNode(this.refs['username']);
                    */
                    console.log(this.refs['goodInput']);//返回dom节点
                    /*console.log(this.refs['goodInput'].getDOMNode());无法调用*/
                    console.log(this.refs['goodInput'].value);//返回input节点下的value值
                },
                render:function(){
                    /*
                        表单属性中defaultValue属性和value的区别
                        defaultValue是默认值,第一次设置时生效,手动输入值时允许被改变
                        value是当前input的值,手动输入值不会被改变
                        如果需要改变当前value的值则需要使用onChange事件来改变其中this.state.inputValue的值
                    */
                    return (
                        <form onSubmit={this.submitFunc} action="" method="post">
                            <input type="text" defaultValue={this.state.inputValue}/><br/><br/><br/>
                            <input type="text" ref="goodInput" defaultValue={this.state.inputValue}/><br/><br/><br/>
                            <button type="submit">提交一下</button>
                        </form>
                        );
                }
            });
            ReactDOM.render(<FormApp/>,document.getElementById('demo'));
        </script>

    Demo6

        <div id="demo"></div>
        <script type="text/babel">
            var FormApp = React.createClass({
                getInitialState:function(){
                    return {
                        inputValue:'this is inputValue',
                        radioValue:'C',
                        textareaValue:'this is textareaValue'
                    };
                },
                changeFunc:function(e){
                    this.setState({
                        /*设置当前state中inputValue的值是该html元素对象的value值*/
                        inputValue:e.target.value
                    });
                },
                submitFunc:function(e){
                    e.preventDefault();/*阻止默认事件*/
                    console.log('form is submiting......');
                    /*
                        ref是React中的一种属性,当render函数返回某个组件的实例时,可以给render中的某个虚拟DOM节点添加一个ref属性
                        ref 属性
                        React 支持一种非常特殊的属性,你可以用来绑定到 render() 
                        输出的任何组件上去。这个特殊的属性允许你引用 render() 返回的相应的支撑实例
                        ( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。
                        下面4种方式都可以通过ref获取真实DOM节点
                        var usernameDOM = this.refs.username.getDOMNode();
                        var usernameDOM = React.findDOMNode(this.refs.username);
                        var usernameDOM = this.refs['username'].getDOMNode();
                        var usernameDOM = React.findDOMNode(this.refs['username']);
                    */
                    /*console.log(this.refs['goodInput']);返回dom节点*/
                    /*console.log(this.refs['goodInput'].getDOMNode());无法调用*/
                    /*console.log(this.refs['goodInput'].value);返回input节点下的value值*/
                    var formData = {
                        textInput:this.refs['goodInput'].value,
                        radioInput:this.state.radioValue,
                        textareaEle:this.refs['goodTextarea'].value
                    }
                    console.log(formData);
                },
                changeRadio:function(e){
                    /**
                        每当radio改变时,设置其state属性值,那嵌套标签里加入一个函数,
                        子函数调用为this.props.func,标签引用func={this.func}
                    */
                    this.setState({
                        radioValue:e.target.value
                    })
                },
                render:function(){
                    /*
                        表单属性中defaultValue属性和value的区别
                        defaultValue是默认值,第一次设置时生效,手动输入值时允许被改变
                        value是当前input的值,手动输入值不会被改变
                        如果需要改变当前value的值则需要使用onChange事件来改变其中this.state.inputValue的值
                    */
                    return (
                        <form onSubmit={this.submitFunc} action="" method="post">
                            <input type="text" ref="goodInput" defaultValue={this.state.inputValue}/><br/><br/><br/>
                            <RadioBox ref="goodRadio" changeRadio={this.changeRadio}/>
                            this is textarea<br/>
                            <textarea ref="goodTextarea" name="goodTextarea" defaultValue={this.props.textareaValue}></textarea>
                            <button type="submit">提交一下</button>
                        </form>
                        );
                }
            });
            var RadioBox = React.createClass({
                render:function(){
                    return (
                        <span>
                            A:
                            <input type="radio" onChange={this.props.changeRadio} name="goodRadio" value="A" /><br/>
                            B:
                            <input type="radio" onChange={this.props.changeRadio} name="goodRadio" value="B" /><br/>
                            C:
                            <input type="radio" onChange={this.props.changeRadio} name="goodRadio" defaultChecked value="C" /><br/><br/>
                        </span>
                        );
                }
            });
            ReactDOM.render(<FormApp/>,document.getElementById('demo'));
        </script>

    Demo7

        <div id="demo"></div>
        <script type="text/babel">
            /*双向数据流*/
            var TwodTataFlow = React.createClass({
                /*
                    LinkedStateMixin给你的React组件添加一个叫做linkState()的方法。linkState()
                    返回一个ReactLink对象,包含ReactState当前的值和一个用来改变它的回调函数。
                    ReactLink对象可以在树中作为props被向上传递或者向下传递
                */
                /*
                    双向绑定的使用:
                    组件需要mixins:引用LinkedStateMixin。它提供一个linkState方法。参数是state属性
                    双向绑定用valueLink={this.linkState(XX)}
                    linkState方法返回一个对象,有一个value属性,指定state的属性。
                    还有一个requestChange回调方法,用来实现state的修改。参数是新值 
                    可以理解成onchange的绑定方法。可以自己写一个linkState对象,
                    value是state.XX requestChange里用setState()来修改值。用valueLink={obj}来实现。
                    可以理解成this.linkState()实现的就是指定绑定值value 和change方法
                    valueLink属性实现了linkstate.value绑定到value requestChange方法绑定onChange
                    可以创建一个this.linkState('XX') value={XX.value} onchange={fn}方法内
                    使用Xx.requestChange(e.target.value)
                */
                mixins:[React.addons.LinkedStateMixin],
                getInitialState:function(){
                    return {
                        messages:'react is very good',
                        isReactBool:true
                    }
                },
                render:function(){
                    return (
                        <div>
                            <h1>ME说:{this.state.messages}</h1>
                            <h2>React is very good?{this.state.isReactBool?' yes':' no'}</h2>
                            <input type='text' valueLink={this.linkState('messages')}/>
                        </div>
                    );
                }
            });
    
            /*
                不带ReactLink的LinkedStateMixin(ReactLink Without LinkedStateMixin)
                这个在处理input text文本框时使用valueLink是在其内部声明了一个
                valueLink方法,等同于是将这个方法中执行的requestChange请求执行handleChange
            */
            var WithoutMixin = React.createClass({
                getInitialState:function(){
                    return {message:'Hello!'};
                },
                handleChange:function(newValue){
                    this.setState({message:newValue});
                },
                render:function(){
                    /*valuelink
                    * 它实际上实现的是状态的绑定和change事件的修改
                    * requestChange方法接收值来实现state的修改
                    */
                    var valueLink = {
                        value:this.state.message,
                        requestChange:this.handleChange
                    };
                    return (
                        <div>
                            <h1>{this.state.message}</h1>
                            <input type="text" valueLink={valueLink} />
                        </div>
                    )
                }
            });
            ReactDOM.render(<WithoutMixin/>,document.getElementById('demo'));
        </script>

    Demo8

        <div id="demo"></div>
        <script type="text/babel">
            /*双向数据流*/
            /*
                valueLink和checkedLink可以一直往子级传递
                子级传递给子级的传递方式是
                <父级套用子级 定义的属性名messageLink={this.linkState(state的Key)}/>
                子级是
                <ChildChildTag messageLink={this.props.messageLink} />
                子子级是
                <input type="text" valueLink={this.props.messageLink}/>
            */
            var TwodTataFlow = React.createClass({
                mixins:[React.addons.LinkedStateMixin],
                getInitialState:function(){
                    return {
                        messages:'react is very good',
                        isReactBool:true
                    }
                },
                render:function(){
                    return (
                        <div>
                            <h1>ME说:{this.state.messages}</h1>
                            <h2>React is very good?{this.state.isReactBool?' yes':' no'}</h2>
                            <input type='text' valueLink={this.linkState('messages')}/><br/><br/>
                            你的选择是:{this.state.isReactBool?' yes':' no'}&nbsp;&nbsp;&nbsp;<input type='checkbox' checkedLink={this.linkState('isReactBool')}/>
                            <br/><br/><br/>
                            <ChildTag messageLink={this.linkState('messages')} checkLink={this.linkState('isReactBool')}/>
                        </div>
                    );
                }
            });
            var ChildTag = React.createClass({
                render:function(){
                    return (
                        <div>
                            <h3>这个是子组件</h3>
                            {/*
                                子级继续向下传递props时就需要以下方法,但有时候向下传递时是重复动作,因此props传递时可以{...this.props}
                                <ChildChildTag messageLink={this.props.messageLink} checkLink={this.props.checkLink}/>
                                {...this.props}类似于将对应的valueLink和checkedLink方法传递
                            */}
                            <ChildChildTag {...this.props}/>
                        </div>
                    )
                }
            });
    
            var ChildChildTag = React.createClass({
                render:function(){
                    return (
                        <div>
                            <p>你想对我说什么?</p>
                            <input type="text" valueLink={this.props.messageLink}/><br/><br/>
                            <p>React是最好的语言</p>
                            <input type="checkbox" checkedLink={this.props.checkLink}/>
                        </div>
                    )
                }
            });
            ReactDOM.render(<TwodTataFlow/>,document.getElementById('demo'));
        </script>

    Demo9

        <div id="demo"></div>
        <script type="text/babel">
            var Message = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                getInitialState:function(){
                    /*
                        在组件挂载之前调用一次。返回值将会作为 this.state 的初始值。
                    */
                    console.log('getInitialState');
                    return {titleMsg:'你好 React!',subMsg:'React是世界上最好的语言!',count:0};
                },
                getDefaultProps:function(){
                    /*
                        在组件类创建的时候调用一次,然后返回值被缓存下来。
                        如果父组件没有指定 props 中的某个键,则此处返回的对象中的
                        相应属性将会合并到 this.props (使用 in 检测属性)。
                    */
                    console.log('getDefaultProps');
                },
                componentWillMount:function(){
                    /*
                        服务器端和客户端都只调用一次,在初始化渲染执行之前立刻调用。
                        如果在这个方法内调用 setState,render() 将会感知到更新后的 state,
                        将会执行仅一次,尽管 state 改变了。
                    */
                    console.log('componentWillMount');
                    /*这是在渲染之前的setState*/
                    // this.setState({titleMsg:'Hello React!'});
                    /*初始化之前设置一个定时器*/
                    var self = this;
                    this.timer = setInterval(function(){
                        self.setState({count:self.state.count + 1});
                    },1000);
                },
                componentDidMount:function(){
                    /*
                        在初始化渲染执行之后立刻调用一次,仅客户端有效(服务器端不会调用)。
                        在生命周期中的这个时间点,组件拥有一个 DOM 展现,
                        你可以通过 this.getDOMNode() 来获取相应 DOM 节点。
                    */
                    console.log('componentDidMount');
                },
                componentWillUnmount:function(){
                    console.log('组件被你删掉了!');
                    /*组件删除之后必须要停止对应的事件*/
                    clearInterval(this.timer);
                },
                unmountFunc:function(){
                    /*ReactDOM.unmountComponentAtNode(Dom element)删除节点操作*/
                    ReactDOM.unmountComponentAtNode(document.getElementById('demo'));
                },
                render:function(){
                    if(this.state.count < 2){
                        console.log('渲染结束');
                    }
                    return (
                        <div>
                            <h1>{this.state.titleMsg}</h1>
                            <h2>计时器:{this.state.count}</h2>
                            <SubMessage {...this.state}/>
                            <button onClick={this.unmountFunc}>点击卸载整个组件</button>
                        </div>);
                }
            });
            var SubMessage = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                render:function(){
                    return (
                        <div>
                            <h3>{this.props.subMsg}</h3>
                        </div>);
                }
            });
            ReactDOM.render(<Message/>,document.getElementById('demo'));
        </script>

    Demo10

        <div id="demo"></div>
        <script type="text/babel">
            var Message = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                getInitialState:function(){
                    /*
                        在组件挂载之前调用一次。返回值将会作为 this.state 的初始值。
                    */
                    // console.log('getInitialState');
                    return {titleMsg:'你好 React!',subMsg:'React是世界上最好的语言!',count:0};
                },
                getDefaultProps:function(){
                },
                /*componentWillMount:function(){
                },
                componentDidMount:function(){
                },
                componentWillUnmount:function(){
                },*/
                shouldComponentUpdate:function(nextProp,nextState){
                    // console.log('shouldComponentUpdate');
                    // 假如下次更新时数值大于3时返回false,不让更新                
                    if(nextState.count > 10) return false;
                    return true;
                },
                componentWillUpdate:function(nextProp,nextState){
                    // console.log('componentWillUpdate');
                },
                componentDidUpdate:function(){
                    // console.log('componentDidUpdate');
                },
                unmountFunc:function(){
                    /*ReactDOM.unmountComponentAtNode(Dom element)删除节点操作*/
                    ReactDOM.unmountComponentAtNode(document.getElementById('demo'));
                },
                doUpdate:function(){
                    this.setState({count:this.state.count + 1});
                },
                render:function(){
                    return (
                        <div>
                            <h1>{this.state.titleMsg}</h1>
                            <h2>计时器:{this.state.count}</h2>
                            <SubMessage {...this.state}/>
                            <button onClick={this.doUpdate}>点一次+一次</button>
                            {/*<button onClick={this.unmountFunc}>点击卸载整个组件</button>*/}
                        </div>);
                }
            });
            var SubMessage = React.createClass({
                /*
                    作用于组件的实例,在实例创建时调用一次,用于初始化每个实例的state,此时可以访问this.props
                    组件之中的this.state可以调用了,
                */
                /*
                    在组件接收到新的 props 的时候调用。在初始化渲染的时候,该方法不会调用。
                    用此函数可以作为 react 在 prop 传入之后, render() 渲染之前更新 state 的机会。
                    老的 props 可以通过 this.props 获取到。
                    在该函数中调用 this.setState() 将不会引起第二次渲染。
                */
                componentWillReceiveProps:function(nextProp){
                    // console.log('子组件将要获取prop');
                },
                shouldComponentUpdate:function(nextProp,nextState){
                    /*子组件在被更新时控制其更新方式*/
                    if(nextProp.count > 5) return false;
                    return true;
                },
                render:function(){
                    return (
                        <div>
                            <h3>{this.props.count}</h3>
                        </div>);
                }
            });
            ReactDOM.render(<Message/>,document.getElementById('demo'));
        </script>
  • 相关阅读:
    CSS盒子模型
    getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
    MYSQL中的CASE WHEN END AS
    单点登录的精华总结
    git&github
    June 21st 2017 Week 25th Wednesday
    June 20th 2017 Week 25th Tuesday
    June 19th 2017 Week 25th Monday
    June 18th 2017 Week 25th Sunday
    June 17th 2017 Week 24th Saturday
  • 原文地址:https://www.cnblogs.com/wangji817/p/6027119.html
Copyright © 2011-2022 走看看