React,用元件化思想寫前端程式碼
前陣子嘗試用React開發了一個專案的前端,寫起來還算是流暢。將頁面中各模組進行分割並形成元件之後,管理起來更加的方便,程式碼的可讀性也相對於傳統的麵條式程式設計有很大的提高。React相對於Angular來說,我個人認為是更加輕量化的,它更注重於MVC中的V。
舉個例子,開發中常常會用到button這個元素,我們會給button加上樣式、行為等等。一個專案中button可能是被經常重複使用的,他的樣式也可能幾乎是一摸一樣的,無非是color和size的區別而已。按照傳統的寫法,可能程式碼是下面這個樣子的:
<button onClick='function(){alert('clicked!')}' class='btn btn-green btn-large'>點我</button>
如果click事件是有預設事件的,class預設也是綠色,那麼每次都寫這一堆是有點煩了,如果我們將這個button視為一個元件,那麼我們可以給它設定預設的樣式和行為,並通過傳不同的值給元件改變它的狀態。我們來個React版本的。
var Button = React.createClass({
propTypes:{
children: React.PropTypes.any,
className: React.PropTypes.string,
disabled: React.PropTypes.bool,
onClick: React.PropTypes.func,
style: React.PropTypes.object,
type: React.PropTypes.oneOf(['submit', 'button'])
},
getInitialState:function(){
return {
disabled:this.props.disabled,
className:'btn-green',
type: this.props.type ? this.props.type : 'button',
text: null
}
},
componentWillReceiveProps:function(newProps){
if (newProps.disabled !== this.props.disabled) {
this.setState({ disabled: newProps.disabled })
}
},
text:function(text){
this.setState({
text:text
});
},
handleClick:function() {
if (this.props.onClick) {
this.props.onClick()
}
},
render:function(){
return (
<button className={this.state.className}
disabled={this.state.disabled}
type={this.state.type}
style={this.props.style}
onClick={this.handleClick.bind(this)}>
{this.state.text || this.props.children}
</button>
);
}
});
這裡Button就視為一個模組或者元件,它接收父元件的值來改變它的預設狀態,當沒有值傳入時,使用預設的內部值。
為了達到最開始那個button的效果,我們可以這麼使用它:
React.render(
<div>
<Button size='large' onClick='function(){alert('click')}'>
</div>
, document.getElementById('container'));
雖然這樣看上去好像並沒有和傳統方式有太大的區別,而且還多了一堆程式碼去定義這個button元件,得不償失,但是這僅僅只是元件化的開始,面對更復雜的元件時,它的好處就體現出來了。看看下面的例子:
需求是我們需要一個搜尋框,在使用者輸入的同時通過非同步請求進行搜尋,同時為了防止使用者輸入速度快導致請求過於頻繁,在使用者輸入每個字後延遲300ms進行搜尋,如果在這段時間內使用者任然有輸入,那麼就再延遲300ms,也就是高頻防抖。
以傳統的方式來,我們得先寫個input,然後把這個input包裝成search input的樣子,然後註冊事件,並在事件中設定延遲函式,然後才真正執行搜尋動作。。。等另一個頁面又有搜尋時,重複剛才的步驟。如果把SearchInput設想成一個元件,那麼它會是下面這個樣子的。
var SearchInput = React.createClass({
inputTimeout:null,
propTypes:{
size: React.PropTypes.string,
onInput: React.PropTypes.func,
delay: React.PropTypes.number,
disabled: React.PropTypes.bool
},
getInitialState:function(){
return {
size: this.props.size ? this.props.size : '',
delay: this.props.delay ? this.props.delay : 300
}
},
handleInput: function(event){
var value = event.target.value;
if(this.inputTimeout){
window.clearTimeout(this.inputTimeout);
}
var that = this;
this.inputTimeout = setTimeout(function(){
that.props.onInput(value);
},this.state.delay);
},
render: function(){
var sizeClasss = this.state.size ? "topcoat-search-input--"+this.state.size :
"topcoat-search-input";
return (
<input type="search"
placeholder='search'
onInput={this.handleInput.bind(this)}
className={sizeClasss}
disabled={this.props.disabled}
/>
);
}
});
我們將延遲的時間和是否禁用等資訊當做屬性傳給SearchInput元件,並將延遲操作的邏輯等封裝在元件內部,以後我們就不用關心這些了,直接使用即可。
React.render(
<div>
<SearchInput delay=500 onClick='function(value){alert(value)}'></SearchInput>
</div>
, document.getElementById('container'));
我們傳入delay與搜尋邏輯函式即可,input的value也會傳入搜尋邏輯函式。
當然,還有更復雜的情況,我們可以將邏輯封裝在元件中,使用的人只需要通過屬性改變元件的狀態,而不需要關心元件狀態改變的邏輯。
最近嘗試封裝一些通用的React UI元件,挑選了Topcoat樣式去封裝,感興趣的朋友可以點選下面這個連結
https://github.com/ForeverPx/react-topcoat
文章作者:forevercjl
原文連結:www.foreverpx.cn
轉載請註明出處。
相關文章
- vue元件化思想Vue元件化
- 採用React+Ant Design元件化開發前端介面(一)React元件化前端
- React.js和Vue.js有感—前端開發元件化思想的區域性要點理解ReactVue.js前端元件化
- 微前端(qiankun)主應用共享React元件前端React元件
- vue輕量高效的前端元件化方案以及MVC MVVM思想Vue前端元件化MVCMVVM
- 封裝一個元件 + 函式惰性思想(重寫應用)封裝元件函式
- 前端常用手寫程式碼前端
- 如何寫出更好的 React 程式碼?React
- 前端面試之手寫程式碼前端面試
- .Net Core——用程式碼寫程式碼?
- React元件化複用的一些技巧React元件化
- (翻譯)用react-spring以react hook元件的形式編寫動畫ReactSpringHook元件動畫
- 【譯】如何寫出更好的 React 程式碼React
- [譯] 如何寫出更好的 React 程式碼?React
- 如何編寫一個React元件React元件
- 如何寫好前端業務程式碼?前端
- 前端筆試之手寫程式碼(一)前端筆試
- 前端和React Native程式碼互轉總結前端React Native
- 用 symfony/console 元件寫命令列指令碼元件命令列指令碼
- React元件及應用React元件
- 前端神器:一行命令,React 元件轉 Vue 元件!前端React元件Vue
- React 簽字手寫簽名元件 react-signatureReact元件
- 正確進行程式碼優化,一點思想論行程優化
- React元件化複製 react-clipboardjs-copyReact元件化JS
- 前端進階-編寫測試程式碼前端
- 程式碼規範之前端編寫碼規範前端
- 如何用React寫一個Modal元件React元件
- 手寫一個 React 動畫元件React動畫元件
- React實現元件全屏化React元件
- 仿寫美團酒店日期選擇元件(小程式、React-Native)元件React
- Vue核心思想:資料驅動、元件化Vue元件化
- 如何編寫難以維護的 React 程式碼?耦合通用元件與業務邏輯React元件
- REACT元件抽象與複用React元件抽象
- React元件複用的方式React元件
- Android程式碼混淆&元件化混淆方案Android元件化
- 前端工程化(1):VSCode中編寫Vue程式碼的最佳姿勢前端VSCodeVue
- 用 nodejs 寫一個命令列工具 :建立 react 元件的命令列工具NodeJS命令列React元件
- 前端面試必會手寫的程式碼前端面試
- React Hook 提高程式碼複用性ReactHook