您身边的网站建设专家
成功案例

【建站服务】专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-青海上往建站-域名申请

日期: 2022-09-21 06:03:38 浏览数:4


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-青海上往建站

网站建设.png

  1.    参考地址

    4年前 (2018-07-26)
  2.    YuCun Zhong

      www***26613280@qq.com

       参考地址

    34

    理解 React 中 es6 创建组件 this 的方法

    在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的。

    从 react 中的 demo 说起

    Facebook最近一次更新react时,将es6中的class加入了组件的创建方式当中。Facebook也推荐组件创建使用通过定义一个继承自 React.Component 的class来定义一个组件类。官方的demo:

    class LikeButton extends React.Component {
      constructor() {
        super();
        this.state = {
          liked: false
        };
        this.handleClick = this.handleClick.bind(this);
      }
      handleClick() {
        this.setState({liked: !this.state.liked});
      }
      render() {
        const text = this.state.liked ? 'liked' : 'haven't liked';
        return (
          <div onClick={this.handleClick}>
            You {text} this. Click to toggle.
          </div>
        );
      }}ReactDOM.render(
      <LikeButton />,
      document.getElementById('example'));

    上面的demo中有大量this的使用,在 class LikeButton extends React.Component 中我们是声明该class,因为this具体是由其上下文决定的,因此在类定义中我们无法得知this用法。 相当于是new了上面定义的类,首先调用 constructor() 函数, this.state 的this上下文就是该实例对象;同理,render() 函数中 this.state.liked 的this上下文也是该对象。问题在于 onClick={this.handleClick} ,获取该函数引用是没有问题,这里的this上下文就是该对象。

    这时问题来了,在原来 React.createClass 中, handleClick() 在onClick事件触发的时候,会自动绑定到LikeButton实例上,这时候该函数的this的上下文就是该实例。不过在ES6的class的写法中,Facebook取消了自动绑定,实例化LikeButton后,handleClick()的上下文是div的支撑实例( backing instance ),而 handleClick() 原本要绑定的上下文是LikeButton的实例。对于该问题,我们有多种解决方案。

    使用 bind() 函数改变 this 的上下文

    可以在class声明中的constructor()函数中,使用:

    this.handleClick = this.handleClick.bind(this);

    该方法是一个bind()绑定,多次使用。在该方法中,我们在声明该实例后,可以在该实例任何地方使用 handleClick() 函数,并且该 handleClick() 函数的this的上下文都是LikeButton实例对象。

    除此我们也可以在具体使用该函数的地方绑定this的上下文到LikeButton实例对象,代码如下:

    <div onClick={this.handleClick.bind(this)}>
      You {text} this. Click to toggle.</div>

    这种方法需要我们每次使用bind()函数绑定到组件对象上。

    es6的箭头函数

    es6中新加入了箭头函数=>,箭头函数除了方便之外还有而一个特征就是将函数的this绑定到其定义时所在的上下文。这个特征也可以帮助我们解决这个问题。使用如下代码:

    <div onClick={() => this.handleClick()}>
      You {text} this. Click to toggle.</div>

    这样该 this.handleClick() 的上下文就会被绑定到 LikeButton 的实例对象上。个人认为,使用箭头函数使得 JavaScript 更加接近面向对象的编程风格。

    this 的总结

    this 的本质就是:this跟作用域无关的,只跟执行上下文有关。

    YuCun Zhong

       YuCun Zhong

      www***26613280@qq.com

       参考地址

    4年前 (2018-10-20)
  3.    阿星

      192***540@qq.com

    34

    React 事件中 this 的三种使用方式

    1.bind绑定的方法

    不传参

    class Hello extends React.Component{
        constructor(){
            super()
            this.state = {
                content:true
            }
            this.change = this.change.bind(this)
        }
        
        change(){
            this.setState({
                content:!this.state.content        })
        }
    
        render(){
            return (
                <div>
                    <h1>{this.state.content ? '1':'2'}</h1>
                    <h2>{this.props.name}</h2>
                    <button onClick={this.change}>
                        点击
                    </button>
                </div>
            )
        }}ReactDOM.render(
        <Hello name="Hello"/>,
        document.getElementById('example'))

    传参

    class Hello extends React.Component{
        constructor(){
            super()
            this.state = {
                content:true
            }
            this.change = this.change.bind(this,this.state.content)
        }
        
        change(obj){
            this.setState({
                content:!this.state.content        })
            console.log(obj)
            console.log(this.state.content)
        }
    
        render(){
            return (
                <div>
                    <h1>{this.state.content ? '1':'2'}</h1>
                    <h2>{this.props.name}</h2>
                    <button onClick={this.change}>


  change(obj){

        this.setState({

            content:!this.state.content

        })

        console.log(obj)

        console.log(this.state.content)

    }


    render(){

        return (

            <div>

                <h1>{this.state.content ? '1':'2'}</h1>

                <h2>{this.props.name}</h2>

                <button onClick={this.change}>

                    点击

                </button>

            </div>

        )

    }

}


ReactDOM.render(

    <Hello name="Hello"/>,

    document.getElementById('example')

)

2.属性初始化器的方式


不传参


class Hello extends React.Component{

    constructor(){

        super()

        this.state = {

            content:true

        }

    }

    

    change=()=>{

        this.setState({

            content:!this.state.content

        })

    }


    render(){

        return (

            <div>

                <h1>{this.state.content ? '1':'2'}</h1>

                <h2>{this.props.name}</h2>

                <button onClick={this.change}>

                    点击

                </button>

            </div>

        )

    }

}


ReactDOM.render(

    <Hello name="Hello"/>,

    document.getElementById('example')

)

传参


class Hello extends React.Component{

    constructor(){

        super()

        this.state = {

            content:true

        }

    }

    

    change=obj=>{

        this.setState({

            content:!this.state.content

        })

        console.log(obj)

    }


    render(){

        return (

            <div>

                <h1>{this.state.content ? '1':'2'}</h1>

                <h2>{this.props.name}</h2>

                <button onClick={this.change(this.state.content)}>

                    点击

                </button>

            </div>

        )

    }

}


ReactDOM.render(

    <Hello name="Hello"/>,

    document.getElementById('example')

)

3.回调函数的方式


不传参


class Hello extends React.Component{

    constructor(){

        super()

        this.state = {

            content:true

        }

    }

    

    change(){

        this.setState({

            content:!this.state.content

        })

    }


    render(){

        return (

            <div>

                <h1>{this.state.content ? '1':'2'}</h1>

                <h2>{this.props.name}</h2>

                <button onClick={()=>{this.change()}}>

                    点击

                </button>

            </div>

        )

    }

}


ReactDOM.render(

    <Hello name="Hello"/>,

    document.getElementById('example')

)

传参


class Hello extends React.Component{

    constructor(){

        super()

        this.state = {

            content:true

        }

    }

    

    change(obj){

        this.setState({

            content:!this.state.content

        })

        console.log(obj)

    }


    render(){

        return (

            <div>

                <h1>{this.state.content ? '1':'2'}</h1>

                <h2>{this.props.name}</h2>

                <button onClick={()=>{this.change(this.state.content)}}>

                    点击

                </button>

            </div>

        )

    }

}


ReactDOM.render(

    <Hello name="Hello"/>,

    document.getElementById('example')

)

阿星

   阿星


  192***540@qq.com


3年前 (2019-06-05)



专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-青海上往建站


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站