做爲一個寡言少語的人,一直在享受社區的文章分享和幫助,是它們讓我不斷成長,這種分享的熱情是開源社區繁榮昌盛的根基。某雖不才,也有一樣的心情,也想寫點東西。不只僅是個教程系列,也是一個研究學習的過程。近期一直研究React,將本身的一些思考摘錄下來,分享一下,也歡迎有興趣的讀者留言發表本身的觀點,互相探討學習。javascript
A JavaScript library for building user interfaces:一個用於構建用戶界面的JavaScript庫html
官方這句話措辭懇切嚴謹,有兩點須要注意:vue
react由美國臉譜網(facebook)出品,大廠背書,更加可靠,雖然前段時間出了個改協議事件,因爲受到社區的反對,又改了回來,說明其對社區仍是尊重的。java
由於咱們主題是React,因此咱們會說React的優勢,可能帶有主觀性,也許有失偏頗。但做爲一個寫過Vue和React的人,仍是想談談兩者的一些使用感覺。react
綜合起來: Vue封裝度較高,想開發者之所想。 React靈活性好,邊界把控的好。web
Vue API設計簡潔優雅。 React API設計嚴謹中規中矩。vuex
做爲一個嚴肅的、喜歡折騰代碼的人,我更喜歡React。redux
接下來挑幾點,說說爲什麼喜歡React:數組
更靈活的組件寫法,Vue推薦 .vue
文件,react推薦.jsx
文件,就內容而言,.vue
導出內容是一個對象,而.jsx
自己就是一個合法的js文件,導出內容是一個class,能夠寫成員方法,在class體外定義方法變量,組件之間還能實現繼承。寫法與功能上react更增強大。框架
單向數據流,與之對應的是雙向數據綁定,由angular獨創,它的出現大大提升了開發的效率。而Vue一大特色就在於此:實例加載時將data屬性(或data函數返回對象的屬性)註冊爲響應式。這裏的data屬性更可能是一種應用state的概念,開發者要麼將變量定義爲data屬性,要麼定義在data函數裏,前者可能形成冗餘的響應式,後者形成代碼的晦澀難懂。單向數據流保證了數據流的純淨與簡單。
良好簡便的jsx支持 jsx絕對是個很牛掰的發明,在js裏寫html標籤,雖然也有瑕疵,但瑕不掩瑜。這直接賦予了jsUI操做能力,況且React是jsx的原始地。雖然Vue也支持jsx語法,但聲明式視圖註定了不會好用。
清晰的state管理,應用到了必定的規模,會用到狀態管理插件,React有redux,Vue有vuex,redux形式store是以props傳入的,所以能夠在生命週期componentDidUpdate裏對props.store做比對處理, 而Vuex形式的store的更改須要在watchers裏監聽才能感知,這可能致使邏輯的混亂。相比之下,React的單一數據流的好處就展現出來了
完全的組件化思想,在react裏一些皆是組件,連路由都是。這樣的設計系統而統一,而Vue雖然說也是組件化思想,但界限貌似沒有劃好。
固然了,Vue相比React簡單很多,API設計簡潔優雅,可是雙向數據綁定在小項目中的發揮出色,在邏輯複雜的項目中註定了冗餘與維護困難。在我看來Vue更像一個青春張揚的少年,朝氣蓬勃。而React則是一名成熟穩重的中年,一絲不苟。因此沒有好壞,只是理念不一樣而已。
React embraces the fact that rendering logic is inherently coupled with other UI logic: how events are handled, how the state changes over time, and how the data is prepared for display. React堅信渲染邏輯與UI邏輯天生融合:事件處理、狀態隨時間變化、數據的準備與展示,這意味着jsx是React的一個核心設計,由於web應用的核心就是這三個
關於jsx有如下幾點須要注意:
再來講說jsx中的標籤及其屬性:
布爾值、對象、函數
該屬性會被忽略。<div className="div">我是一個div</div>
<MyCompo lover="someone" married={false} />
,屬性可爲任意值。全部屬性合併爲一個對象傳入組件內。可是隻有字符串才能展現,假設傳入了一個布爾值,想做爲文本顯示是不可能的
,這顯示出React的嚴謹與專業。有一個特殊的屬性:children
表示做爲組件子節點傳入的標籤//函數組件
function FnCompo(props){
return (
<div className={props.className}>
{ props.children }
</div>
)
}
//class組件
class ClassCompo extends React.Component{
render(){
<div className={this.props.className}>
{ this.props.children }
</div>
}
}
//分別使用
<FnCompo className="fn">
<div>我是一個child標籤</div>
</FnCompo>
<ClassCompo className="class">
<div>我是一個child標籤</div>
</ClassCompo >
複製代碼
看出端倪了嗎?
來段官方的介紹:
A higher-order component (HOC) is an advanced technique in React for reusing component logic. HOCs are not part of the React API, per se. They are a pattern that emerges from React’s compositional nature. 高階組件是一種組件複用技術,不是官方API,只是一種組合模式。
總結就是:
舉幾個項目中的例子:
注意:高階組件、關聯組件的關係跟父子組件關係有很大的不一樣
HOC與關聯組件
class HOC extends Component{
render(){
return <this.props.template/>;
}
componentDidMount(){
console.log('我後執行')
}
}
class Template extends Component{
render(){
return <div>我是一個child節點</div>;
}
componentDidMount(){
console.log('我先執行')
}
}
class App extends Component{
render(){
return <HOC template = { Template }/> } } export default App; 複製代碼
本文介紹了React,談了React的優勢,jsx語法、高階組件。其中不可避免有些主觀的成分在。內容有深有淺,不可能面面俱到,不足之處望讀者朋友們見諒。
下一篇咱們會介紹視圖控制器-路由的概念