React.createClass 和 extends Component 的区别(转载)
728 字
4 分钟
React.createClass 和 extends Component 的区别(转载)
createClass本质上是一个工厂函数,extends的方式更加接近最新的ES6规范的class写法。两种方式在语法上的差别主要体现在方法的定义和静态属性的声明上。createClass方式的方法定义使用逗号,隔开,因为creatClass本质上是一个函数,传递给它的是一个Object;而class的方式定义方法时务必谨记不要使用逗号隔开,这是ES6 class的语法规范。
React.createClass和extends Component的区别主要在于:
- 语法区别
- propType 和 getDefaultProps
- 状态的区别
- this区别
- Mixins
1.语法区别
- React.createClass
import React from 'react';const Contacts = React.createClass({ render() { return ( <div></div> ); }});export default Contacts;- React.Component
import React from 'react';
class Contacts extends React.Component { constructor(props) { super(props); } render() { return ( <div></div> ); }}
export default Contacts;- 后一种方法使用ES6的语法,用constructor构造器来构造默认的属性和状态。
2.propType和getDefaultProps
React.createClass: 通过proTypes对象和getDefaultProps()方法来设置和获取props
import React from 'react';
const Contacts = React.createClass({ propTypes: { name: React.PropTypes.string }, getDefaultProps() { return {
}; }, render() { return ( <div></div> ); }});
export default Contacts;React.Component:通过设置两个属性propTypes和defaultProps
import React form 'react';class TodoItem extends React.Component{ static propTypes = { // as static property name: React.PropTypes.string }; static defaultProps = { // as static property name: '' }; constructor(props){ super(props) } render(){ return <div></div> }}3.状态的区别
React.createClass:通过getInitialState()方法返回一个包含初始值的对象
import React from 'react'; let TodoItem = React.createClass({ // return an object getInitialState(){ return { isEditing: false } } render(){ return <div></div> } })React.Component:通过constructor设置初始状态
import React from 'react'; class TodoItem extends React.Component{ constructor(props){ super(props); this.state = { // define this.state in constructor isEditing: false } } render(){ return <div></div> } }4.this区别
React.createClass:会正确绑定this
import React from 'react';
const Contacts = React.createClass({ handleClick() { console.log(this); // React Component instance }, render() { return ( <div onClick={this.handleClick}></div>//会切换到正确的this上下文 ); }});
export default Contacts;React.Component:由于使用了ES6,这里会有些微不同,属性并不会自动绑定到React类的实例上。
import React from 'react';class TodoItem extends React.Component{ constructor(props){ super(props); } handleClick(){ console.log(this); // null } handleFocus(){ // manually bind this console.log(this); // React Component Instance } handleBlur: ()=>{ // use arrow function console.log(this); // React Component Instance } render(){ return <input onClick={this.handleClick} onFocus={this.handleFocus.bind(this)} onBlur={this.handleBlur}/> }}- 我们还可以在
constructor中来改变this.handleClick执行的上下文,这应该是相对上面一种来说更好的办法,万一我们需要改变语法结构,这种方式完全不需要去改动JSX的部分:
import React from 'react';
class Contacts extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } handleClick() { console.log(this); // React Component instance } render() { return ( <div onClick={this.handleClick}></div> ); }}
export default Contacts;5.Mixins
- 如果我们使用
ES6的方式来创建组件,那么React mixins的特性将不能被使用了。
React.createClass:使用 React.createClass 的话,我们可以在创建组件时添加一个叫做 mixins 的属性,并将可供混合的类的集合以数组的形式赋给 mixins。
import React from 'react';let MyMixin = { doSomething(){}}let TodoItem = React.createClass({ mixins: [MyMixin], // add mixin render(){ return <div></div> }})支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
React.createClass 和 extends Component 的区别(转载)
https://gaodaxiu-blog.netlify.app/posts/React.createClass 和 extends Component 的区别(转载)/相关文章智能推荐
1
使用Astro搭建个人博客1
博客指南使用Astro搭建个人博客及部署,使用Firefly主题,使用Vercel部署
2
React轮播图(下)
Reactreact轮播图项目开写
3
React轮播图(上)
ReactReact轮播图项目配置及原理概要
4
Vue 的响应式原理中 Object.defineProperty 有什么缺陷?为什么在 Vue3.0 采用了 Proxy?
VueVue 的响应式原理中 `Object.defineProperty` 有什么缺陷?为什么在 Vue3.0 采用了 `Proxy`,抛弃了 `Object.defineProperty`?
5
解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题
CSS解决chrome自动填充白色背景(input:-internal-autofill-previewed)问题
随机文章随机推荐












