React/React Native의 ES5/ES6 비교 표
모듈
인용하다
ES5에서 CommonJS 표준을 사용하는 경우 React 패키지 도입은 기본적으로 Require를 통해 이루어지며 코드는 다음과 같습니다.
//ES5
var React = require("react");
var {
Component,
PropTypes
} = React; // React
var ReactNative = require("react-native");
var {
Image,
Text,
} = ReactNative; // React Native
ES6에서는 import Write가 더 표준화됨
//ES6
import React, {
Component,
PropTypes,
} from 'react';
import {
Image,
Text
} from 'react-native'
단일 클래스 내보내기
ES5에서 하나의 클래스를 다른 모듈에 내보내려면 일반적으로 모듈을 통과해야 한다.내보내기
//ES5
var MyComponent = React.createClass({
...
});
module.exports = MyComponent;
ES6에서는 일반적으로 export default를 사용하여 동일한 기능을 수행합니다.
//ES6
export default class MyComponent extends Component{
...
}
참조할 때도 비슷합니다.
//ES5
var MyComponent = require('./MyComponent');
//ES6
import MyComponent from './MyComponent';
가져오는 것과 내보내는 쓰기 방법은 반드시 조립되어야 하며 혼용해서는 안 된다.
어셈블리 정의
ES5에서는 통상적으로 React를 통과한다.createClass는 다음과 같이 구성 요소 클래스를 정의합니다.
//ES5
var Photo = React.createClass({
render: function() {
return (
);
},
});
ES6에서, 우리는 React로부터 계승되는 것을 정의한다.Component의 class는 다음과 같이 구성 요소 클래스를 정의합니다.
//ES6
class Photo extends Component {
render() {
return (
);
}
}
어셈블리에 메서드 정의하기
위의 예에서 볼 수 있듯이 구성 요소에 대한 정의 방법은 더 이상 이름을 사용하지 않습니다:function () 의 쓰기가 아니라 직접 이름 () 을 사용합니다. 방법의 마지막에 쉼표가 있을 수 없습니다.
//ES5
var Photo = React.createClass({
componentWillMount: function(){
},
render: function() {
return (
);
},
});
//ES6
class Photo extends Component {
componentWillMount() {
}
render() {
return (
);
}
}
구성 요소의 속성 유형 및 기본 속성 정의
ES5에서 속성 유형과 기본 속성은 각각propTypes 구성원과 getDefaultProps 방법을 통해 실현된다
//ES5
var Video = React.createClass({
getDefaultProps: function() {
return {
autoPlay: false,
maxLoops: 10,
};
},
propTypes: {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
},
render: function() {
return (
);
},
});
ES6에서는 static 구성원을 통일적으로 사용하여 실현할 수 있다
//ES6
class Video extends Component {
static defaultProps = {
autoPlay: false,
maxLoops: 10,
}; //
static propTypes = {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
}; //
render() {
return (
);
} //
}
이렇게 쓰는 사람도 있다. 추천하지는 않지만 코드를 읽을 때 그 뜻을 알 수 있어야 한다.
//ES6
class Video extends Component {
render() {
return (
);
}
}
Video.defaultProps = {
autoPlay: false,
maxLoops: 10,
};
Video.propTypes = {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
};
주의:React 개발자에게 static 구성원은 IE10 및 이전 버전에서 계승될 수 없으며, IE11과 다른 브라우저에서는 가능합니다. 이것은 때때로 문제를 가져올 수 있습니다.React Native 개발자는 이 문제를 걱정하지 않아도 됩니다.
STATE 초기화
ES5는 이와 유사합니다.
//ES5
var Video = React.createClass({
getInitialState: function() {
return {
loopsRemaining: this.props.maxLoops,
};
},
})
ES6 에서는
//ES6
class Video extends Component {
state = {
loopsRemaining: this.props.maxLoops,
}
}
그러나 우리는 더욱 이해하기 쉬운 구조 함수에서 초기화하는 것을 추천한다. (이렇게 하면 필요에 따라 계산을 할 수 있다.)
//ES6
class Video extends Component {
constructor(props){
super(props);
this.state = {
loopsRemaining: this.props.maxLoops,
};
}
}
방법을 리콜로 제공하다
ES6에 익숙한 많은 사용자들은 오히려 ES5에서 이렇게 할 수 있다는 것을 이해하지 못한다.
//ES5
var PostInfo = React.createClass({
handleOptionsButtonClick: function(e) {
// Here, 'this' refers to the component instance.
this.setState({showOptionsModal: true});
},
render: function(){
return (
{this.props.label}
)
},
});
ES5에서, React.createClass는 모든 방법을 한 번씩 bind합니다. 이렇게 하면 임의의 곳에 리셋 함수로 제출할 수 있고this는 변하지 않습니다.그러나 정부는 오히려 표준적이지 않고 이해하기 어렵다고 주장하고 있다.ES6에서,bind를 통해this 인용을 연결하거나, 화살표 함수를 사용해야 합니다. (현재 scope의this 인용을 연결합니다.)
//ES6
class PostInfo extends Component
{
handleOptionsButtonClick(e){
this.setState({showOptionsModal: true});
}
render(){
return (
this.handleOptionsButtonClick(e)}
>
{this.props.label}
)
},
}
화살표 함수는 실제적으로 여기에 임시 함수를 정의했다. 화살표 함수의 화살표=> 이전에는 빈 괄호, 한 개의 매개 변수 이름, 또는 괄호로 묶은 여러 개의 매개 변수 이름이 있었고, 화살표 다음에는 표현식 (함수의 반환값으로) 이나 괄호로 묶은 함수체 (리턴을 통해 값을 되돌려야 하며, 그렇지 않으면 undefined로 되돌려야 한다) 가 될 수 있었다.
//
()=>1
v=>v+1
(a,b)=>a+b
()=>{
alert("foo");
}
e=>{
if (e == 0){
return 0;
}
return 1000/e;
}
주의해야 할 것은bind든 화살표 함수든 매번 실행될 때마다 새로운 함수 인용으로 되돌아온다는 것이다. 따라서 함수 인용이 다른 일을 하려면 (예를 들어 감청기 마운트 해제) 이 인용을 저장해야 한다.
//
class PauseMenu extends Component{
componentWillMount(){
AppStateIOS.addEventListener('change', this.onAppPaused.bind(this));
}
componentDidUnmount(){
AppStateIOS.removeEventListener('change', this.onAppPaused.bind(this));
}
onAppPaused(event){
}
}
//
class PauseMenu extends Component{
constructor(props){
super(props);
this._onAppPaused = this.onAppPaused.bind(this);
}
componentWillMount(){
AppStateIOS.addEventListener('change', this._onAppPaused);
}
componentDidUnmount(){
AppStateIOS.removeEventListener('change', this._onAppPaused);
}
onAppPaused(event){
}
}
//
class PauseMenu extends Component{
componentWillMount(){
AppStateIOS.addEventListener('change', this.onAppPaused);
}
componentDidUnmount(){
AppStateIOS.removeEventListener('change', this.onAppPaused);
}
onAppPaused = (event) => {
// arrow function , this
}
}
Mixins
ES5에서는 PureRenderMixin과 같은 클래스에 새로운 방법을 추가하기 위해 Mixin을 자주 사용합니다.
var PureRenderMixin = require('react-addons-pure-render-mixin');
React.createClass({
mixins: [PureRenderMixin],
render: function() {
return foo;
}
});
그러나 현재 정부는 더 이상 ES6에서 Mixin을 추진할 계획이 없으므로 가능한 한 빨리 Mixin의 작성 방식을 포기해야 한다.
//Enhance.js
import { Component } from "React";
export var Enhance = ComposedComponent => class extends Component {
constructor() {
this.state = { data: null };
}
componentDidMount() {
this.setState({ data: 'Hello' });
}
render() {
return ;
}
};
//HigherOrderComponent.js
import { Enhance } from "./Enhance";
MyComponent extends Component {
render() {
if (!this.data) return Waiting...;
return {this.data};
}
}
export default Enhance(MyComponent); // Enhanced component
하나의'증강함수'로 특정한 클래스에 방법을 추가하고 새로운 클래스로 돌아가는 것은 mixin이 실현하는 대부분의 수요를 실현할 수 있다.
ES6+의 기타 이점
해체 & 속성 연장
ES6+의 해체와 속성 연장을 결합하여 우리는 아이에게 속성을 전달하는 것이 더욱 편리하다.이 예에서는 className 이외의 모든 속성을 div 태그에 전달합니다.
class AutoloadingPostsGrid extends Component {
render() {
const {
className,
...others, // contains all properties of this.props except for className
} = this.props;
return (
);
}
}
모든 속성을 전달하면서 새 className 값을 덮어씁니다.
…
이 예는 반대로 속성에className이 포함되지 않으면 기본값을 제공하고, 속성에 이미 포함되면 속성의 값을 사용합니다
…
나중에 수집하면 계속 업데이트해서 문법을 배우기 편할 것이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.