この記事では、React でコンポーネントを作成する 3 つの方法とその違いを主に紹介します。参考になります。
React のリリース後、さまざまなコンポーネントを定義する方法が 3 つあります。異なる方法でも同じ目標につながります:
関数的に定義されたステートレスコンポーネント
es5 ネイティブの方法 React.createClass で定義されたコンポーネント
ステートレス関数コンポーネントの作成は、React バージョン 0.14 から登場し始めました。これは純粋な表示コンポーネントを作成するために使用されます。純粋な表示コンポーネントは、受信したプロパティに基づいて表示のみを担当し、状態操作は関与しません。特定のステートレス機能コンポーネントについて、公式は次のように述べています:
ほとんどの React コードでは、ほとんどのコンポーネントはステートレス コンポーネントとして記述されており、単純な組み合わせを通じて他のコンポーネントに組み込むことができます。これは、複数の単純なコンポーネントとマージされたコンポーネントを通じて行われます。大規模なアプリケーションが推奨されています。
ステートレス関数コンポーネントは、正式には 1 つの render メソッドを持つコンポーネント クラスとして表され、関数または ES6 アロー関数の形式で作成され、コンポーネントはステートレスです。具体的な作成形式は次のとおりです。
function HelloComponent(props, /* context */) { return <p>Hello {props.name}</p> } ReactDOM.render(<HelloComponent name="Sebastian" />, mountNode)
ステートレス コンポーネントの作成形式により、コードが読みやすくなり、多くの冗長なコードが削減されて 1 つのレンダリング メソッドのみに簡素化され、記述能力が大幅に向上します。 a コンポーネントの利便性に加えて、ステートレス コンポーネントには次の重要な機能もあります:
1. コンポーネントはインスタンス化されず、コンポーネントが関数に合理化されるため、全体的なレンダリング パフォーマンスが向上しますrenderメソッドを実現するには、ステートレスコンポーネントであるため、コンポーネントのインスタンス化処理にステートレスコンポーネントが存在せず、非インスタンス化処理で余分なメモリを割り当てる必要がなくなるため、ある程度のパフォーマンスが向上します。
2. コンポーネントはこのオブジェクトにアクセスできませんステートレスコンポーネントにはインスタンス化プロセスがないため、コンポーネント this.ref や this.state などにアクセスできません。アクセスしたい場合、このフォームを使用してコンポーネントを作成することはできません
3. コンポーネントはライフサイクルメソッドにアクセスできませんステートレスコンポーネントはコンポーネントのライフサイクル管理と状態管理を必要としないため、このフォームのコンポーネントの基礎となる実装はコンポーネントのライフサイクル メソッドは実装されていません。したがって、ステートレス コンポーネントは、コンポーネントのさまざまなライフサイクル管理に参加できません。
4. ステートレス コンポーネントは入力プロパティにのみアクセスでき、副作用なしで同じレンダリング結果が得られます。大規模なプロジェクトでは、ステートレス コンポーネントはできるだけ簡単な方法で元のプロパティを分割することが推奨されます。巨大なコンポーネントの場合、React は将来、無意味なチェックやメモリ割り当てなど、ステートレス コンポーネントに対する一連の最適化も実行するため、可能な限りステートレス コンポーネントを使用するようにしてください。
React.createClass`React.createClass`は、Reactの最初に推奨されるコンポーネントの作成方法です。これは、ES5のネイティブJavaScriptによって実装されるReactコンポーネントです。その形式は次のとおりです。
with ステートレスコンポーネントと比較して、後述する React.createClass および React.Component はステートフルコンポーネントを作成する必要があり、これらのコンポーネントはインスタンス化する必要があり、コンポーネントのライフサイクルメソッドにアクセスできます。しかし、React の開発により、React.createClass フォーム自体の問題が明らかになりました。
React.createClass は関数メソッドを自己バインドします (関係する必要がある関数のみをバインドする React.Component とは異なります)。不必要なパフォーマンスのオーバーヘッドが発生し、コードが陳腐化する可能性が高くなります。
React.createClass のミックスインは十分に自然で直感的ではありません。React.Component フォームは、より直感的な形式でミックスインよりも強力な機能を示す高次コンポーネント (高次コンポーネント - HOC) に非常に適しています。 、HOC は純粋な JavaScript であるため、非推奨になることを心配する必要はありません。
var InputControlES5 = React.createClass({ propTypes: {//定义传入props中的属性各种类型 initialValue: React.PropTypes.string }, defaultProps: { //组件默认的props对象 initialValue: '' }, // 设置 initial state getInitialState: function() {//组件相关的状态对象 return { text: this.props.initialValue || 'placeholder' }; }, handleChange: function(event) { this.setState({ //this represents react component instance text: event.target.value }); }, render: function() { return ( <p> Type something: <input onChange={this.handleChange} value={this.state.text} /> </p> ); } }); InputControlES6.propTypes = { initialValue: React.PropTypes.string }; InputControlES6.defaultProps = { initialValue: '' };
React.createClass と React.Component の違い
定義された 2 つのコンポーネントの異なる構文形式による上記のコードには、多くの重要な違いがあります。この 2 つの主な違いを以下に説明します。
Function this self-binding
React.createClassで作成されたコンポーネント、各メンバー関数のthisはいつでも関数内で直接this.methodを使用するだけで自動的にバインドされます。正しく設定してください。
const Contacts = React.createClass({ handleClick() { console.log(this); // React Component instance }, render() { return ( <p onClick={this.handleClick}></p> ); } });
React.Component创建的组件,其成员函数不会自动绑定this,需要开发者手动绑定,否则this不能获取当前组件实例对象。
class Contacts extends React.Component { constructor(props) { super(props); } handleClick() { console.log(this); // null } render() { return ( <p onClick={this.handleClick}></p> ); }
当然,React.Component有三种手动绑定方法:可以在构造函数中完成绑定,也可以在调用时使用method.bind(this)来完成绑定,还可以使用arrow function来绑定。拿上例的handleClick函数来说,其绑定可以有:
constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); //构造函数中绑定 }
<p onClick={this.handleClick.bind(this)}></p> //使用bind来绑定 <p onClick={()=>this.handleClick()}></p> //使用arrow function来绑定
组件属性类型propTypes及其默认props属性defaultProps配置不同
React.createClass在创建组件时,有关组件props的属性类型及组件默认的属性会作为组件实例的属性来配置,其中defaultProps是使用getDefaultProps的方法来获取默认组件属性的
const TodoItem = React.createClass({ propTypes: { // as an object name: React.PropTypes.string }, getDefaultProps(){ // return a object return { name: '' } } render(){ return <p></p> } })
React.Component在创建组件时配置这两个对应信息时,他们是作为组件类的属性,不是组件实例的属性,也就是所谓的类的静态属性来配置的。对应上面配置如下:
class TodoItem extends React.Component { static propTypes = {//类的静态属性 name: React.PropTypes.string }; static defaultProps = {//类的静态属性 name: '' }; ... }
组件初始状态state的配置不同
React.createClass创建的组件,其状态state是通过getInitialState方法来配置组件相关的状态;
React.Component创建的组件,其状态state是在constructor中像初始化组件属性一样声明的。
const TodoItem = React.createClass({ // return an object getInitialState(){ return { isEditing: false } } render(){ return <p></p> } })
class TodoItem extends React.Component{ constructor(props){ super(props); this.state = { // define this.state in constructor isEditing: false } } render(){ return <p></p> } }
Mixins的支持不同
Mixins(混入)是面向对象编程OOP的一种实现,其作用是为了复用共有的代码,将共有的代码通过抽取为一个对象,然后通过Mixins进该对象来达到代码复用。
React.createClass在创建组件时可以使用mixins属性,以数组的形式来混合类的集合。
var SomeMixin = { doSomething() { } }; const Contacts = React.createClass({ mixins: [SomeMixin], handleClick() { this.doSomething(); // use mixin }, render() { return ( <p onClick={this.handleClick}></p> ); } });
但是遗憾的是React.Component这种形式并不支持Mixins,至今React团队还没有给出一个该形式下的官方解决方案;但是React开发者社区提供一个全新的方式来取代Mixins,那就是Higher-Order Components。
如何选择哪种方式创建组件
由于React团队已经声明React.createClass最终会被React.Component的类形式所取代。但是在找到Mixins替代方案之前是不会废弃掉React.createClass形式。所以:
能用React.Component创建的组件的就尽量不用React.createClass形式创建组件。
除此之外,创建组件的形式选择还应该根据下面来决定:
1、只要有可能,尽量使用无状态组件创建形式。
2、否则(如需要state、生命周期方法、ref等),使用`React.Component`这种es6形式创建组件
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がReact でコンポーネントを作成する 3 つの方法とその違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。