幸福一生张军良 發表於 2020-2-23 17:00:00

React创建组件两种写法:React.createClass和extends Component的区别

<p>前言:</p>
<p>  createClass本质上是一个工厂函数,extends的方式更加接近最新的ES6规范的class写法。两种方式在语法上的差别主要体现在方法的定义和静态属性的声明上。createClass方式的方法定义使用逗号,隔开,因为creatClass本质上是一个函数,传递给它的是一个Object;而class的方式定义方法时务必谨记不要使用逗号隔开,这是ES6 class的语法规范。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">React.createClass和extends Component的区别主要在于:
    </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">、语法区别
    </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">、propType 和 getDefaultProps
    </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">、状态的区别
    </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">、this区别
    </span><span style="color: rgba(128, 0, 128, 1)">5</span>、Mixins</pre>
</div>
<p>&nbsp;</p>
<p>主体:</p>
<h2 id="item-1">语法区别</h2>
<p>React.createClass</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';

<span class="hljs-keyword">const Contacts = React.createClass({
render() {
    <span class="hljs-keyword">return (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    );
}
});

<span class="hljs-keyword">export <span class="hljs-keyword">default Contacts;</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>React.Component</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Contacts <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component {
<span class="hljs-keyword">constructor(props) {
    <span class="hljs-keyword">super(props);
}
render() {
    <span class="hljs-keyword">return (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    );
}
}

<span class="hljs-keyword">export <span class="hljs-keyword">default Contacts;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>后一种方法使用ES6的语法,用<code>constructor</code>构造器来构造默认的属性和状态。</p>
<h2 id="item-2">propType 和 getDefaultProps</h2>
<p>React.createClass:通过<code>proTypes</code>对象和<code>getDefaultProps()</code>方法来设置和获取<code>props</code>.</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';

<span class="hljs-keyword">const Contacts = React.createClass({
<span class="hljs-attr">propTypes: {
    <span class="hljs-attr">name: React.PropTypes.string
},
getDefaultProps() {
    <span class="hljs-keyword">return {

    };
},
render() {
    <span class="hljs-keyword">return (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    );
}
});

<span class="hljs-keyword">export <span class="hljs-keyword">default Contacts;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>React.Component:通过设置两个属性<code>propTypes</code>和<code>defaultProps</code></p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React form <span class="hljs-string">'react';
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">TodoItem <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component{
    <span class="hljs-keyword">static propTypes = { <span class="hljs-comment">// as static property
      name: React.PropTypes.string
    };
    <span class="hljs-keyword">static defaultProps = { <span class="hljs-comment">// as static property
      name: <span class="hljs-string">''
    };
    <span class="hljs-keyword">constructor(props){
      <span class="hljs-keyword">super(props)
    }
    render(){
      <span class="hljs-keyword">return <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    }
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2 id="item-3">状态的区别</h2>
<p>React.createClass:通过<code>getInitialState()</code>方法返回一个包含初始值的对象</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-keyword">let TodoItem = React.createClass({
    <span class="hljs-comment">// return an object
    getInitialState(){
      <span class="hljs-keyword">return {
            <span class="hljs-attr">isEditing: <span class="hljs-literal">false
      }
    }
    render(){
      <span class="hljs-keyword">return <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    }
})</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>React.Component:通过<code>constructor</code>设置初始状态</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">TodoItem <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component{
    <span class="hljs-keyword">constructor(props){
      <span class="hljs-keyword">super(props);
      <span class="hljs-keyword">this.state = { <span class="hljs-comment">// define this.state in constructor
            isEditing: <span class="hljs-literal">false
      }
    }
    render(){
      <span class="hljs-keyword">return <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    }
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2 id="item-4">this区别</h2>
<p>React.createClass:会正确绑定<code>this</code></p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';

<span class="hljs-keyword">const Contacts = React.createClass({
handleClick() {
    <span class="hljs-built_in">console.log(<span class="hljs-keyword">this); <span class="hljs-comment">// React Component instance
},
render() {
    <span class="hljs-keyword">return (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">onClick=<span class="hljs-string">{this.handleClick}&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;<span class="hljs-comment">//会切换到正确的this上下文
    );
}
});

<span class="hljs-keyword">export <span class="hljs-keyword">default Contacts;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>React.Component:由于使用了 ES6,这里会有些微不同,属性并不会自动绑定到 React 类的实例上。</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">TodoItem <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component{
    <span class="hljs-keyword">constructor(props){
      <span class="hljs-keyword">super(props);
    }
    handleClick(){
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this); <span class="hljs-comment">// null
    }
    handleFocus(){<span class="hljs-comment">// manually bind this
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this); <span class="hljs-comment">// React Component Instance
    }
    handleBlur: <span class="hljs-function"><span class="hljs-params">()=&gt;{<span class="hljs-comment">// use arrow function
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this); <span class="hljs-comment">// React Component Instance
    }
    render(){
      <span class="hljs-keyword">return <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">input <span class="hljs-attr">onClick=<span class="hljs-string">{this.handleClick}
                              <span class="hljs-attr">onFocus=<span class="hljs-string">{this.handleFocus.bind(this)}
                              <span class="hljs-attr">onBlur=<span class="hljs-string">{this.handleBlur}/&gt;
    }
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>我们还可以在 constructor 中来改变 this.handleClick 执行的上下文,这应该是相对上面一种来说更好的办法,万一我们需要改变语法结构,这种方式完全不需要去改动 JSX 的部分:</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Contacts <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component {
<span class="hljs-keyword">constructor(props) {
    <span class="hljs-keyword">super(props);
    <span class="hljs-keyword">this.handleClick = <span class="hljs-keyword">this.handleClick.bind(<span class="hljs-keyword">this);
}
handleClick() {
    <span class="hljs-built_in">console.log(<span class="hljs-keyword">this); <span class="hljs-comment">// React Component instance
}
render() {
    <span class="hljs-keyword">return (
      <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">onClick=<span class="hljs-string">{this.handleClick}&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    );
}
}

<span class="hljs-keyword">export <span class="hljs-keyword">default Contacts;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2 id="item-5">Mixins</h2>
<p>如果我们使用 ES6 的方式来创建组件,那么&nbsp;<code>React mixins</code>&nbsp;的特性将不能被使用了。</p>
<p>React.createClass:使用 React.createClass 的话,我们可以在创建组件时添加一个叫做&nbsp;<code>mixins&nbsp;</code>的属性,并将可供混合的类的集合以数组的形式赋给<code>&nbsp;mixins</code>。</p>
<pre class="javascript hljs"><code class="javascript"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-keyword">let MyMixin = {
    doSomething(){}
}
<span class="hljs-keyword">let TodoItem = React.createClass({
    <span class="hljs-attr">mixins: , <span class="hljs-comment">// add mixin
    render(){
      <span class="hljs-keyword">return <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    }
})</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>.</p><br><br>
来源:https://www.cnblogs.com/fightjianxian/p/12350499.html
頁: [1]
查看完整版本: React创建组件两种写法:React.createClass和extends Component的区别