Movatterモバイル変換


[0]ホーム

URL:


We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

React Without ES6

Normally you would define a React component as a plain JavaScript class:

classGreetingextendsReact.Component{render(){return<h1>Hello,{this.props.name}</h1>;}}

If you don’t use ES6 yet, you may use thecreate-react-class module instead:

var createReactClass=require('create-react-class');var Greeting=createReactClass({render:function(){return<h1>Hello,{this.props.name}</h1>;}});

The API of ES6 classes is similar tocreateReactClass() with a few exceptions.

Declaring Default Props

With functions and ES6 classesdefaultProps is defined as a property on the component itself:

classGreetingextendsReact.Component{// ...}Greeting.defaultProps={name:'Mary'};

WithcreateReactClass(), you need to definegetDefaultProps() as a function on the passed object:

var Greeting=createReactClass({getDefaultProps:function(){return{name:'Mary'};},// ...});

Setting the Initial State

In ES6 classes, you can define the initial state by assigningthis.state in the constructor:

classCounterextendsReact.Component{constructor(props){super(props);this.state={count: props.initialCount};}// ...}

WithcreateReactClass(), you have to provide a separategetInitialState method that returns the initial state:

var Counter=createReactClass({getInitialState:function(){return{count:this.props.initialCount};},// ...});

Autobinding

In React components declared as ES6 classes, methods follow the same semantics as regular ES6 classes. This means that they don’t automatically bindthis to the instance. You’ll have to explicitly use.bind(this) in the constructor:

classSayHelloextendsReact.Component{constructor(props){super(props);this.state={message:'Hello!'};// This line is important!this.handleClick=this.handleClick.bind(this);}handleClick(){alert(this.state.message);}render(){// Because `this.handleClick` is bound, we can use it as an event handler.return(<buttononClick={this.handleClick}>        Say hello</button>);}}

WithcreateReactClass(), this is not necessary because it binds all methods:

var SayHello=createReactClass({getInitialState:function(){return{message:'Hello!'};},handleClick:function(){alert(this.state.message);},render:function(){return(<buttononClick={this.handleClick}>        Say hello</button>);}});

This means writing ES6 classes comes with a little more boilerplate code for event handlers, but the upside is slightly better performance in large applications.

If the boilerplate code is too unattractive to you, you may useES2022 Class Properties syntax:

classSayHelloextendsReact.Component{constructor(props){super(props);this.state={message:'Hello!'};}// Using an arrow here binds the method:handleClick=()=>{alert(this.state.message);};render(){return(<buttononClick={this.handleClick}>        Say hello</button>);}}

You also have a few other options:

  • Bind methods in the constructor.
  • Use arrow functions, e.g.onClick={(e) => this.handleClick(e)}.
  • Keep usingcreateReactClass.

Mixins

Note:

ES6 launched without any mixin support. Therefore, there is no support for mixins when you use React with ES6 classes.

We also found numerous issues in codebases using mixins,and don’t recommend using them in the new code.

This section exists only for the reference.

Sometimes very different components may share some common functionality. These are sometimes calledcross-cutting concerns.createReactClass lets you use a legacymixins system for that.

One common use case is a component wanting to update itself on a time interval. It’s easy to usesetInterval(), but it’s important to cancel your interval when you don’t need it anymore to save memory. React provideslifecycle methods that let you know when a component is about to be created or destroyed. Let’s create a simple mixin that uses these methods to provide an easysetInterval() function that will automatically get cleaned up when your component is destroyed.

var SetIntervalMixin={componentWillMount:function(){this.intervals=[];},setInterval:function(){this.intervals.push(setInterval.apply(null, arguments));},componentWillUnmount:function(){this.intervals.forEach(clearInterval);}};var createReactClass=require('create-react-class');var TickTock=createReactClass({mixins:[SetIntervalMixin],// Use the mixingetInitialState:function(){return{seconds:0};},componentDidMount:function(){this.setInterval(this.tick,1000);// Call a method on the mixin},tick:function(){this.setState({seconds:this.state.seconds+1});},render:function(){return(<p>        React has been running for{this.state.seconds} seconds.</p>);}});const root= ReactDOM.createRoot(document.getElementById('example'));root.render(<TickTock/>);

If a component is using multiple mixins and several mixins define the same lifecycle method (i.e. several mixins want to do some cleanup when the component is destroyed), all of the lifecycle methods are guaranteed to be called. Methods defined on mixins run in the order mixins were listed, followed by a method call on the component.

Is this page useful?Edit this page

[8]ページ先頭

©2009-2025 Movatter.jp