首页 > web前端 > js教程 > 正文

React中有哪些类定义组件

php中世界最好的语言
发布: 2018-05-26 13:58:46
原创
1938人浏览过

这次给大家带来React中有哪些类定义组件,使用React中类定义组件的注意事项有哪些,下面就是实战案例,一起来看一下。

刚开始学习React没多久,在老师的教程里看到了类组件的使用示例,但是和资料上有些冲突,而引发了一些疑问:

  • 类组件中到底要不要定义构造函数constructor()?

  • super()里边到底要不要传入props参数?

  • 绑定事件到底要不要在构造函数constructor()中进行?

查找资料,总结如下:

类组件:

定义组件可以使用函数定义组件和类定义组件()  

简单说一下  函数定义组件和类定义组件的区别:

  • 函数组件中无法使用state,也无法使用组件的生命周期方法;

  • 函数组件都是展示性组件,接受props,渲染DOM;

  • 函数组件中没有this,但在类组件中仍要绑定this这个琐碎的事,如:在render()方法中要使用this.props来替换props;

  • 类组件中可以使用局部状态state和生命周期方法。

类定义组件实例:

<span style="color: #000000">class GreetingInput extends React.Component{<br/>//构造函数<br/>    constructor(props){<br/>        super(props);//将props传入到<a href="http://www.php.cn/code/12195.html" target="_blank">构造方法</a>中<br/>        this.state={name:"Tom"};//初始化state的值<br/>        this.switchName=this.switchName.bind(this);<br/>    }<br/>//自定义的switchName方法,用作事件处理<br/>    switchName(){<br/>       if(this.state.name==="Tom"){<br/>          this.setState({name:"Jerry"});//修改state的值<br/>        }else{<br/>          this.setState({name:"Tom"});<br/>        }<br/>   } <br/>//render方法  渲染在UI上的内容<br/>   render(){<br/>      return(<br/>        <p><br/>          <h1>hello,{this.state.name}</h1><br/>          <button onclick={this.switchname}>{this.state.name==="tom"? "jerry":"tom"}</button><br/>        </p><br/>      );<br/>   }<br/>}   <br/>ReactDOM.render(<br/>  <GreetingInput/>,document.getElementById("root")<br/>);</span>
登录后复制

问题一:类组件中到底要不要定义构造函数constructor()?

ES6中新增了类的概念,一个类必须要有constructor方法,如果在类中没有显示定义,则一个空的constructor方法会被默认添加;

一般需要在构造函数中初始化state和绑定事件,因此当需要初始化state或绑定事件时,需要显示定义constructor方法,并在constructor方法中初始化state和绑定事件

问题二:super()里边到底要不要传入props参数?

首先说明一点,若显示声明了constructor方法,则必须要调用super,即仅当存在constructor方法时,必须调用super

又是遇到一些示例中super()中没有传入参数props,super()和super(props)到底该怎么使用?

React会自行将props设置在组件中的 除了constructor方法 的任何地方  因此在组件的 非constructor方法中  使用props时,可不用传入,直接使用,

当想要在constructor内使用props,则必须要将props传入super中,这样才能在constructor中访问到props,否则可以不用传入。

问题三:绑定事件到底要不要在构造函数constructor()中进行?

前面说了一般需要在构造函数中绑定事件,但需要使用bind,如果不想调用bind,也可以使用以下方法:

1、使用箭头函数初始化方法,则上边的例子就变为:

class GreetingInput extends React.Component{//构造函数方法    
constructor(props){
        super(props);        
        this.state={name:"Tom"};
        
    }//自定义的switchName方法,用作事件处理   下边用的是属性初始化语法
    switchName=()=>{       
    if(this.state.name==="Tom"){          
    this.setState({name:"Jerry"});
        }else{          
        this.setState({name:"Tom"});
        }
   } 
//render方法  渲染在UI上的内容   
render(){      
return(        
<p>
          <h1>hello,{this.state.name}</h1>
          <button onClick={this.switchName}>{this.state.name==="Tom"? "Jerry":"Tom"}</button>
        </p>      );
   }
}   
ReactDOM.render(  <GreetingInput/>,document.getElementById("root")
);
登录后复制

函数中this指针指向函数本身,因此,在class的构造函数中,需要将事件函数绑定到本类的实例

但箭头函数里的this指针,指向其拥有者,也就是class ,因此一个简易的方式是,在类中尽可能使用箭头函数定义函数

2、在回调函数中使用箭头函数

class GreetingInput extends React.Component{//构造函数方法    
constructor(props){
        super(props);        
        this.state={name:"Tom"};
        
    }//自定义的switchName方法,用作事件处理    
    switchName(){       
    if(this.state.name==="Tom"){          
    this.setState({name:"Jerry"});
        }else{          
        this.setState({name:"Tom"});
        }
   } 
//render方法  渲染在UI上的内容   使用下边这个语法  有个问题就是每次switchName 渲染的时候都会创建一个不同的回调函数   
render(){      
return(        
<p>
          <h1>hello,{this.state.name}</h1>
          <button onClick={(e) => this.switchName(e)}>{this.state.name==="Tom"? "Jerry":"Tom"}</button>
        </p>      );
   }
}   
ReactDOM.render(  <GreetingInput/>,document.getElementById("root")
);
登录后复制

注意:当回调函数作为一个属性值传入低阶组件,上述这种方法可能会进行额外的重新渲染。

我们通常建议在构造函数中绑定或使用属性初始化器语法来避免这类性能问题。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

正则表达式怎么在字符串中提取数字

Vue.js的表单输入绑定
Reactive Form的自定义验证器

以上就是React中有哪些类定义组件的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号