zoukankan      html  css  js  c++  java
  • React事件 状态组件、非状态组件传值以及this指向

     
    1.点击事件
    <script type="text/babel">
      function fn() {
            alert(12);
        }
        // 事件的值要是一个函数
        ReactDOM.render((
            <div>
                <input type="button" onClick={fn} value="你来点我呀!"/>
            </div>
        ),document.querySelector("#myApp"));
    </script>
     
    2.点击事件传值
    <script type="text/babel">
        function fn(num) {
            return function () {
                alert(num);
            }
        }
        ReactDOM.render((
            <div>
                {/*点击事件绑定的值是fn函数的运行结果,*/}
                <input type="button" onClick={fn(23)} value="你来点我呀!"/>
            </div>
        ),document.querySelector("#myApp"));
    </script>
     
    3.事件    4.事件
    例1:
    <script type="text/babel">
        ReactDOM.render((
            <div>
                <input type="button" onClick={function () {
                    alert(78)
                }} value="你来点我呀!"/>
            </div>
        ),document.querySelector("#myApp"));
    </script>
     
    例2:
    <script type="text/babel">
        ReactDOM.render((
            <div>
                <input type="button" onClick={()=>{
                    alert(87)
                }} value="你来点我呀!"/>
            </div>
        ),document.querySelector("#myApp"));
    </script>
     
    5.事件bind
    function fn(a,b,e) {
        console.log(a,b,e.target.value,this)
            //1  2 "你快来打我呀!" undefined
    }
    const obj = {
        userName:"laoLi",
        age:12
    };
      ReactDOM.render((
          <div>
              <input type="button" onClick={fn.bind(obj,1,2)}  value="你快来打我呀!" />
          </div>
      ),document.querySelector("#myApp"))
     
    6.事件  显示与隐藏      7.显示隐藏优化
    let isShow = true;
        render();
        function changeIsShow(){
            isShow = !isShow
            render();
        }
        function render() {
            ReactDOM.render((
                <div>
            <input type="button" onClick={changeIsShow} value="显示与隐藏"/>
                    <div style={{
                        "100px",
                        height:"100px",
                        background:"red",
                        display:isShow?"block":"none"
                    }}></div>
                </div>
            ),document.querySelector("#myApp"));
        }
     
    8.非状态组件
        定义:通过函数来定义,该函数必须要有返回值。返回的内容即是组件的内容。
                  //函数名即是组件名
                  //函数必须要有返回值,如果不想返回数据   Return null
        使用:将你的函数作为标签来使用  
    例1:
    function Fn() {
            return null;
            // return (
            //     <div>lala</div>
            // )
        }
        ReactDOM.render((
            <div>
                一起来学习组件吧
                <Fn></Fn>
            </div>
        ),document.querySelector("#myApp"));
     
    例2:
    语法:建议返回值用括号包裹
         有且只能有一个根元素。
        function MyCom() {
            return (
                <div>
                    大家好,我叫MYCOM
                </div>
            )
        }
        ReactDOM.render((
            <div>
                <MyCom></MyCom>
            </div>
        ),document.querySelector("#myApp"));
     
    9.无状态组件传值
    // 组件的属性,即是放在定义组件函数接收的参数对象当中
        // 子组件接收的属性是不允许直接被修改的。
        function MyCom(props) {
            console.log(props);
            function changeAge(){
                 props.age = 1234;
            }
            return (
                <div>
                    大家好,我叫MYCOM
                    <input type="button" value="修改属性" onClick={changeAge}/>
                </div>
            )
        }
        let num = 9;
        ReactDOM.render((
            <div>
                <MyCom userName = "xixi"  age="12" num={num}></MyCom>
            </div>
        ),document.querySelector("#myApp"));
     
    10.非状态组件   修改父元素属性
        // 接收属性
        function MyCom(props) {
            return (
                <div>
                    <input type="button" value="修改userName" onClick={()=>{changeUserName("three");}} />
                    我是无状态组件{props.userName}
                </div>
            )
        }
        // 使用组件MyCom,并传递了一个属性名字叫userName 值为one
        let userName = "one";
        function changeUserName(str) {
            userName = str;
            ReactDOM.render(<MyCom userName={userName}/>,document.querySelector("#myApp"));
        }
        ReactDOM.render(<MyCom userName={userName}/>,document.querySelector("#myApp"));
     
    11.组件嵌套
    function Two() {
            return (
                <div>two</div>
            )
        }
        function One() {
            return (
                <div>
                    one
                    <Two></Two>
                </div>
            )
        }
        ReactDOM.render((
            <div>
                <One></One>
            </div>
        ),document.querySelector("#myApp"));
     
    12.状态组件
    // 状态组件:通过class来定义的组件。React.Component.
    // class的名字即是组件名  
     class My extends React.Component{
            // 呈现,它必须要有一个返回值,返回的内容好是组件的内容
            render(){
                return (
                    <div>
                        我是一个状态组件
                    </div>
                )
            }
        }
        ReactDOM.render((
            <div>
                <My></My>
            </div>
        ),document.querySelector("#myApp"));
    13.状态组件的传值1
        组件传值:
                传递的属性,其实是放到你的父级React.Component的props对象下
       
        传递属性: <My userName="nihao" age="12"></My>
        接收 :this.props.userName  this.props.age
    class My extends React.Component{
            constructor(props){
                super(props);
                console.log(this.props);
            }
            render(){
                console.log("render",this.props);
                return (
                    <div>
                        lala{this.props.userName}
                    </div>
                )
            }
        }
        ReactDOM.render((
            <div>
                <My userName="nihao" age="12"></My>
            </div>
        ),document.querySelector("#myApp"))
    14.状态组件的传值2
    class Tag extends  React.Component{
            render(){
                return (
                    <div>
                        <input type="button" onClick={this.props.changeNum} value={this.props.num}/>
                    </div>
                )
            }
        }
        class MyCom extends React.Component{
            constructor(){
                super();
                this.num = 1;
                console.log("constructor")
            }
            changeNum(){
                console.log(11111,this);
                this.num += 1;
                ReactDOM.render((
                    <div>
                        <MyCom></MyCom>
                    </div>
                ),document.querySelector("#myApp"));
            }
            render(){
                console.log("render")
                return (
                    <div>
                        Mycom
                        <Tag num={this.num} changeNum = {this.changeNum.bind(this)}></Tag>
                    </div>
                )
            }
        }
        ReactDOM.render((
            <div>
                <MyCom></MyCom>
            </div>
        ),document.querySelector("#myApp"));
    15.状态组件的传值3
    class Wrap extends  React.Component{
            constructor(){
                super();
                this.isShow = true;
                console.log("costructor");
            }
            changeIsShow(){
                this.isShow = !this.isShow;
                ReactDOM.render(<Wrap></Wrap>,document.querySelector("#myApp"));
            }
            render(){
                console.log("render");
                return (
                    <div>
                        <input type="button" onClick={this.changeIsShow.bind(this)} value="显示隐藏"/>
                        <div style={{
                            "200px",
                            height:"200px",
                            background:"red",
                            display:this.isShow?"block":"none"
                        }}>
                        </div>
                    </div>
                )
            }
        }
        ReactDOM.render(<Wrap></Wrap>,document.querySelector("#myApp"));
     
    16.状态组件的状态 (state   setState)
    示例1:
    class Wrap extends  React.Component{
            constructor(){
                super();
                this.state = {
                    isShow:true
                }
            }
            changeIsShow(){
                // this.state.isShow = !this.state.isShow;
                // 更新你的数据,将你的ReactDOM.render重新执行。
                this.setState({
                    isShow:!this.state.isShow
                })
            }
            render(){
                console.log("render");
                return (
                    <div>
                        <input type="button" onClick={this.changeIsShow.bind(this)} value="显示隐藏"/>
                        <div style={{
                            "200px",
                            height:"200px",
                            background:"red",
                            display:this.state.isShow?"block":"none"
                        }}>
                        </div>
                    </div>
                )
            }
        }
        ReactDOM.render(<Wrap></Wrap>,document.querySelector("#myApp"));
     
    示例2:
    class Wrap extends React.Component{
            constructor(){
                super();
                this.state = {
                    num:9
                }
            }
            changeNum(){
                // this.state.num = this.state.num+1;
                // ReactDOM.render((
                //     <div>
                //         <Wrap></Wrap>
                //     </div>
                // ),document.querySelector("#myApp"));
     
     
                // 异步执行
                this.setState({
                    num:this.state.num+1
                },()=>{// 当你的数据更新完毕以后会执行该函数
                    console.log(this.state.num)
                })
                // console.log(this.state.num)
            }
            render(){
                return (
                    <div>
                        <input type="button"  onClick={this.changeNum.bind(this)}  value={this.state.num} />
                    </div>
                )
            }
        }
        ReactDOM.render((
            <div>
                <Wrap></Wrap>
            </div>
        ),document.querySelector("#myApp"));
     
     
     
    关于事件this绑定问题(undefined):
    1.直接使用bind,  当前函数的使用频率不高;
    class Wrap extends React.Component{
            constructor(){
                super();
                this.state = {
                    num:9
                }
            }
            changeNum(){
                this.setState({
                    num:this.state.num+1
                },()=>{// 当你的数据更新完毕以后会执行该函数
                    console.log(this.state.num)
                })
            }
            render(){
                return (
                    <div>
             <input type="button"  onClick{this.changeNum.bind(this)}  
              value={this.state.num}/>
                    </div>
                )
            }
        }
     
    2.直接写函数,   该函数没有重用,并且逻辑代码较少
    class Wrap extends React.Component{
            constructor(){
                super();
                this.state = {
                    num:9
                }
            }
            render(){
                return (
                    <div>
                        <input type="button"  onClick={()=>{
                             this.setState({
                                 num:this.state.num+1
                             })
                        }}  value={this.state.num}/>
                    </div>
                )
            }
        }
     
    3.在构造器当中使用bind, 当前组件函数较少,但使用的频率比较高
    class Wrap extends React.Component{
            constructor(){
                super();
                this.state = {
                    num:9
                }
                this.abc = this.changeNum.bind(this);
            }
            changeNum(){
                this.setState({
                    num:this.state.num+1
                })
            }
            render(){
                return (
                    <div>
         <input type="button"  onClick={this.abc}  value{this.state.num}/>
                    </div>
                )
            }
        }
     
    4.直接将函数定义为箭头函数,     可以重用,不可bind,但是传值麻烦
    class Wrap extends React.Component{
            constructor(){
                super();
                this.state = {
                    num:9
                }
            }
            changeNum=()=>{
                this.setState({
                    num:this.state.num+1
                })
            }
            render(){
                return (
                    <div>
                        <input type="button"  onClick={()=>{
                            this.changeNum(123);
                        }}  value={this.state.num}/>
                    </div>
                )
            }
        }
     
  • 相关阅读:
    克隆对象和对象的继承
    面向对象的目的和方式
    补充+复习
    正则的一些细节和拖拽时遇到的问题及解决方法
    js高级正则解析
    正则理解
    如何判断this指向?
    动画以及运动
    元素节点
    null和undefined的区别
  • 原文地址:https://www.cnblogs.com/wangwenxin123/p/12465245.html
Copyright © 2011-2022 走看看