ES6+開發React元件
在這裡簡要的說一下這些語言新特性對 React 應用的開發有什麼影響,這些 ES6+ 特性使得 React 開發更簡單更有趣。
類
迄今為止,最能體現我們使用 ES6+ 來編寫 React 元件的就是我們選擇使用類定義語法。替代了使用 React.createClass 方法來定義一個元件,我們可以定義一個 bonafide ES6 類來擴充套件 React.Component:
1
2
3
4
5
|
class Photo extends React.Component {
render() {
return <img alt={ this .props.caption} src={ this .props.src} />;
}
} |
現在,你就會發現一個微妙的差異 —— 當使用定義類的時候語法更簡潔:
1
2
3
4
5
|
// The ES5 way var Photo = React.createClass({
handleDoubleTap: function (e) { … },
render: function () { … },
}); |
1
2
3
4
5
|
// The ES6+ way class Photo extends React.Component {
handleDoubleTap(e) { … }
render() { … }
} |
值得關注的是,我們去掉了兩個括號和一個分號,每個方法宣告我們省略了一個冒號,一個關鍵字和一個分號。
當使用新的類定義時,所有的生命週期方法至少有一個是符合你期望的。類的 constructor 現在假設 role 之前是通過 componentWillMount 填充的:
1
2
3
4
|
// The ES5 way var EmbedModal = React.createClass({
componentWillMount: function () { … },
}); |
1
2
3
4
5
6
7
|
// The ES6+ way class EmbedModal extends React.Component {
constructor(props) {
super (props);
// Operations usually carried out in componentWillMount go here
}
} |
屬性初始化程式
在 ES6+ 類的世界裡,prop types 和 defaults live 在類自身作為靜態屬性。這些,在元件的初始化狀態也是一樣的,可以使用 ES7 property initializers 定義:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// The ES5 way var Video = React.createClass({
getDefaultProps: function () {
return {
autoPlay: false ,
maxLoops: 10,
};
},
getInitialState: function () {
return {
loopsRemaining: this .props.maxLoops,
};
},
propTypes: {
autoPlay: React.PropTypes.bool.isRequired,
maxLoops: React.PropTypes.number.isRequired,
posterFrameSrc: React.PropTypes.string.isRequired,
videoSrc: React.PropTypes.string.isRequired,
},
}); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// The ES6+ way class Video extends React.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,
}
state = {
loopsRemaining: this .props.maxLoops,
}
} |
ES7 屬性初始化程式操作內部類的 constructor,this 指向 construction 的類例項,所以初始化狀態可以依賴於 this.props。值得關注的是,我們不再定義 prop 預設值和使用 getter 函式初始化狀態物件。
Arrow 函式
React.createClass 方法用來在你的元件例項方法中執行一些額外的繫結工作,為了確保 this 關鍵字會指向元件例項:
1
2
3
4
5
6
7
|
// Autobinding, brought to you by React.createClass var PostInfo = React.createClass({
handleOptionsButtonClick: function (e) {
// Here, `this` refers to the component instance.
this .setState({showOptionsModal: true });
},
}); |
自從我們不參與 React.createClass 方法,而是使用 ES6+ 類語法定義元件,看似需要手動繫結例項方法:
1
2
3
4
5
6
7
8
9
10
11
12
|
// Manually bind, wherever you need to class PostInfo extends React.Component {
constructor(props) {
super (props);
// Manually bind this method to the component instance...
this .handleOptionsButtonClick = this .handleOptionsButtonClick.bind( this );
}
handleOptionsButtonClick(e) {
// ...to ensure that `this` refers to the component instance here.
this .setState({showOptionsModal: true });
}
} |
幸運的是,通過繫結兩個 ES6+ 特性 – arrow functions 和屬性初始化程式 – 可以選擇繫結元件例項:
1
2
3
4
5
|
class PostInfo extends React.Component {
handleOptionsButtonClick = (e) => {
this .setState({showOptionsModal: true });
}
} |
ES6 的 arrow 函式體分享相同的詞 this,用這來圍繞他們的程式碼,這些可以達到我們預期的結果,也是 ES7 屬性初始化程式在域內的方式。 Peek under the hood 來看看為什麼能實現。
動態屬性名稱 & 模板字串
其中一個物件常量增強是可以分配到一個派生屬性名稱。我們最初可能會像下面這樣設定一些狀態:
1
2
3
4
5
6
7
|
var Form = React.createClass({
onChange: function (inputName, e) {
var stateToSet = {};
stateToSet[inputName + `Value` ] = e.target.value;
this .setState(stateToSet);
},
}); |
現在,我們有能力構造通過一個執行時 JavaScript 表示式確定屬性名稱的物件。這裡,我們使用了一個模板字串來確定哪個屬性設定狀態:
1
2
3
4
5
6
7
|
class Form extends React.Component {
onChange(inputName, e) {
this .setState({
[`${inputName}Value`]: e.target.value,
});
}
} |
解構 & 傳播屬性
通常在編寫元件的時候,我們可能想把大部分父元件的 props 傳遞給子元件,但不是所有。結合 ES6+ 解構和 JSX 傳播屬性,這個不需要多餘的部分就能實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class AutoloadingPostsGrid extends React.Component {
render() {
var {
className,
...others, // contains all properties of this.props except for className
} = this .props;
return (
<div className={className}>
<PostsGrid {...others} />
<button onClick={ this .handleLoadMoreClick}>Load more</button>
</div>
);
}
} |
我們可以結合 JSX 傳播屬性和常規屬性,利用一個簡單的優先原則實現 overrides 和 defaults。這個元素會要求 className “override” 甚至是在 this.props 存在 className 屬性:
1
2
3
|
<div {... this .props} className= "override" >
…
</div> |
這個元素常規來說需要 className “base” ,除非 this.props 有 className 屬性覆蓋:
1
2
3
|
<div className= "base" {... this .props}>
…
</div> |
希望大家能享受 ES6+ 語言特性給 React 開發帶來的一些便利。
相關文章
- React UI元件開發心得ReactUI元件
- 如何開發React UI元件庫ReactUI元件
- React 開發實戰(一)- Repeat 元件React元件
- 開發一個 React Loading 元件React元件
- 漫談 React 元件庫開發(二):元件庫最佳實踐React元件
- 從零開始學React:二檔 React生命週期以及元件開發React元件
- 分享一個自己開發的 react拖拽排序元件React排序元件
- 輕鬆開發React元件和造輪子指北React元件
- 用 SOLID 原則保駕 React 元件開發SolidReact元件
- 漫談 React 元件庫開發(一):多層巢狀彈層元件React元件巢狀
- Python開發篇——基於React-Dropzone開發上傳元件PythonReact元件
- React 開源元件筆記React元件筆記
- TypeScript+Webpack+React元件庫開發採坑實記TypeScriptWebReact元件
- 一款開發中的中國風React元件庫...React元件
- react篇章-React 元件-複合元件React元件
- 開發一個基於react & typescript 的npm ui元件包ReactTypeScriptNPMUI元件
- 七個不可錯過的 React 元件庫與開發框架React元件框架
- React篇章-React 元件React元件
- React元件React元件
- 採用React+Ant Design元件化開發前端介面(一)React元件化前端
- 星級評價元件--引發對React元件的思考元件React
- React Native開發封裝Toast與載入Loading元件React Native封裝AST元件
- 基於React的大檔案上傳元件的開發詳解React元件
- 前端元件化開發方案及其在React Native中的運用前端元件化React Native
- 如何建立React元件併發布到npm?React元件NPM
- react篇章-React 元件-向元件傳遞引數React元件
- beeshell:開源的 React Native 元件庫React Native元件
- (React啟蒙)理解React 元件React元件
- React拖拽元件React元件
- react 開發規範React
- Vue元件開發Vue元件
- SASS元件開發元件
- react開發教程(七)React事件系統React事件
- react元件(react-grid-gallery)React元件
- 從零開始學習 React 高階元件React元件
- 使用React來開發類Vue單檔案元件正規化的開發框架Lesx新鮮出爐ReactVue元件框架
- React受控元件和非受控元件React元件
- 基於react的錄音及音訊曲線繪製的元件開發React音訊元件