前言:幾天前我發了兩個沸點,是關於我學習和使用React
,並建立的一個minesweeper
遊戲。發現你們挺喜歡的,所以,我寫了這一篇文章,以此來記錄本身的歷程,也但願對你們有一點點幫助。html
學習一門新的技術,最好的開始就是閱讀官方文檔,而後纔開始本身的實踐。所以,個人學習步驟能夠概括以下:前端
React
和周圍生態,分析create-react-app
工程結構React
自己去構建基礎UI
)。google
一下(英文),每每有新發現。Redux
這種,代碼量少,寫得又很棒的庫,讀一讀,收穫挺大。好比有心人就會看到我倉庫裏面有個/test/compose.js
,這個文件就是測試一下寫寫compose
函數,想法來源也是Redux
。聲明式
:設計好UI
,它就會按你設計得方式運行,react
幫助您有效更新、正確渲染。組件化
:一個組件封裝好UI
和邏輯(基於JavaScript
而非模板
),能夠輕鬆地將組件進行組合,以構成更加複雜的頁面。一次學習 隨處編寫
:React
社區活躍,內容豐富,一種技術知足你服務端渲染和Native
應用的需求。從官方特色介紹,至少能夠知道一些要點java
JavaScript
:以js
爲技術基礎來構建UI
,若是js
基礎比較紮實,應該能夠較快入門。組件化
:組件化是目前前端開發的主流,瀏覽器甚至還在推廣Web Component
技術,這就要求咱們思考問題的時候,要常常想想,一個事物是否足夠獨立?是否足夠小?是否可以知足大多數場景的須要?生態豐富
:學習一門技術,能夠快速知足多種應用場景。狀態與DOM分離
:前端界長提MVVM
的概念,所謂Model
、View
和Model-View
。React
作到了數據(狀態)和視圖(DOM)分離。所以,在學習React
以前,我花了一些時間來複習JavaScript
和DOM
的一些基礎知識,後來的學習中證實這種角度是對的。react
render
函數會在頁面更新時,被React
調用,用於生成一幀
。是的我把它想象成一幀頁面
(以時間長度來看,一次render
是頁面生命週期的一幀
)。至於爲何是一個render
函數,由於咱們的React
是一個function
orclass
,使用一個函數來更新頁面會很方便區分和保留不一樣的狀態。(Vue
裏面data
聲明爲一個函數,原理也是同樣的。)props
來獲取從父組件傳遞來的狀態
,完成父子組件通訊。須要注意的是,React
上的DOM
不是原生的DOM
,而是由React
封裝後的,包括事件(官方文檔有講解)。class
組件的constructor
中聲明this.state
,能夠定義當前組件的內部狀態,而且可使用this.setState()
方法來更新這個狀態,每次state
被更新時,上面提到的render
會被調用用於生成一個新的幀
。React
基於js
來構建,那些第三方插件,很容易被引用進來。因爲技術文檔內容挺多的,我只挑選一些我以爲重要的概念,並加以個人理解進行闡述。webpack
jsx
:組件中的鬆散耦合。在一個文件中採用jsx
的語法書寫DOM
和js
,這裏須要瞭解語法,並在使用的過程當中實踐。props
:讓你能夠從父組件傳遞消息到子組件內(包括事件/方法),消息通訊讓狀態傳遞成爲可能,並且使用的語法和寫html
屬性差很少,挺友好的。state
:組件內部狀態(Model
)。經過調用setState
來更新state
,並觸發render
來獲得新的視圖(View
)。class
組件須要bind
事件的this
。這就是我在本文開始提到的bonus
,在js
基礎中,搞清楚this
的指向挺重要的。另外一個要點就是在React
世界中,在DOM
中直接觸發的事件每每須要手動調用e.preventDefault()
來阻止事件冒泡。key
:能夠想象,在一組元素的對比和更新中,帶有key
會下降對比的工做量,加快咱們更新的速度。React
內部維護了一個Virtual DOM
的概念,讓列表更新更快。props
中獲得的事件。ES 6 Module
和webpack
來看看,工程化的內容,待深刻。Refs
:因爲React
是本身包的DOM
元素,所以在父類要想拿到子類中的引用(一般這種狀況咱們須要從父類直接去調用子類的方法),就須要一個ref
。被forwardRef
以後實際是返回了一個高階組件,在這裏你可以拿到ref
(被你從React.createRef()
中建立的)。React
全是對象,那麼想提高對象的能力,很容易想到的就是給對象包一層外殼,在java
裏面常常要分什麼do\dto\bo\ao\vo
等等,在React
,利用js
的優點(函數乃第一公民),能夠很天然獲得高階組件這種概念。原理就是:一個純函數,處理一個組件,返回另外一個組件。高級指引裏面的內容,須要咱們在實踐中反覆地回看,所以,這裏就不贅述,每一個人對這些有本身的理解吧。git
每一個人都有本身的starter
項目,我選擇了minesweeper
。這個遊戲出現得挺早,可是我到高中上電腦課才從同窗那知道它的玩兒法。個人想法是:規則挺簡單,不須要我寫不少遊戲邏輯,不須要路由,能夠拆分好幾個組件,須要一點點狀態管理和組件通訊,正符合我這種初學React
的人。程序員
前期我閱讀了幾篇文章,主要是這一篇,做者用react
寫了一個minesweeper
。github
做爲項目而存在的React
是什麼個樣子,接下來就只須要去實踐它就好了。
接着我作了一些技術選型:web
React
固然是必選了。而且我選擇使用你們都普遍使用的create-react-app
做爲cli
。redux
Redux
&React-redux
:若是是一個小遊戲,本不須要狀態管理。我認爲項目的統一狀態管理應該出如今狀態多且複雜,並且須要衆多組件同時響應時。可是從小了說,任意組件的狀態可能都是有意義的(受到多個其餘組件引用、可能成爲全局狀態)。所以仍是選擇使用react-redux
,這樣在我須要組件間通訊的時候,我能夠少寫不少跳轉,只須要專一於寫一個組件。
簡單介紹一下,我是如何理解和使用
react-redux
的。
- 理解
reducer
。這個單詞直譯爲減小
,在Array.prototype.reduce
中,它減小了空間量,將先後空間量做用於一個reducer函數
,使得array
(多個數據)變成一個單一的數據。可是在redux
概念裏,reducer
須要放到生命週期裏來看,一個應用的生命週期中,reducer
會被調用無數次,所以我理解爲它是把時間上的多個變量減小爲單一變量,可是由於時間沒有中止(時間中止,則應用也中止了,變量也不存在),所以每次咱們只能拿到最終量的某一個時刻的樣子,這就是reducer
的產出被叫作nextState
的緣由。- 惟一數據中心
store
。這個很好理解,一個項目只須要一個大腦就好了,保持數據源一致。- 映射(
map
)。無論是mapStateToProps
仍是mapDispatchToProps
,目的都是一個,把數據從store
中取出來,掛載到UI組件
上,以造成容器組件
。- 容器(
Container
)。容器是一個高階組件,它把本身獲取到的State
和Dispatch
轉換爲props
掛載到UI組件
上。使用時容器組件和被它包裹的UI
組件是一個用法,區別是若是使用容器組件,咱們能夠從this.props
中獲取到store
內的state
,也可以分發dispatch
。conbineReducer
。能夠了解一下compose
的概念和使用場景。
rxjs
:最開始是想使用rxjs
的,可是在寫得過程當中發現不少事件都不必用流
,簡單地使用事件就能夠解決了,在這個項目中,rxjs
帶來的提高並不明顯,所以放棄了。
TypeScript
:有網友問我爲何沒有用用TypeScript
。由於,這個項目實在過小了,而我又須要快速完成它,若是我已經熟悉的語法和概念可讓我快速開發一個應用,那麼爲了一些ts
帶來的小優點而放棄了我另外一個優點,那就得不償失了。所以沒有采用這個。
redux-thunk
:當我寫到遊戲狀態更新、動畫這一塊的時候,我確實須要一些異步dispatch
的能力了,這時候我選擇引入redux-thunk
。固然,知道這個庫,也是google
,從社區中瞭解到的。
完成技術選型,剩下的就是寫起來。
無論是小項目仍是大項目,寫的初衷有兩個:
React
,爲以後的工做作一些準備我喜歡將一個項目各部分的職責劃分得清楚一些
test
:放置測試代碼。單元測試,測試一些優秀的代碼等等。assets
:放置靜態資源。大可能是圖片。components
:放置組件。組件須要劃分各自的職責,按模塊/語義化名字
來取。constant
:放置常量。字符串、數字等等。有點像java
裏面的enum
。util
orhelper
:輔助函數。和個人ui
無關、state
無關的內容,放置到這裏。有些要是和業務強相關的話,可能會增長一個business
目錄。要說minesweeper
,首先想到的是一個面板,加一點遊戲輔助信息。所以,我根據一個物件在頁面出現的位置,劃分了各個組件的職責。
Board
:遊戲面板。用於放置地圖、輔助信息等。
Cell
:方塊。一個方塊有多種狀態,所以能夠這麼思考:
Clock
:時鐘,這個可能會被全局用到,所以抽象爲一個組件。
Description
:用來寫一些遊戲描述信息
Emoji
:做爲一個基於程序員和用戶都喜歡的圖標--emoji
--來建立的項目,抽象出一個Emoji
組件是很天然的事。(一個項目多個部分都會用到)Info
:展現遊戲輔助信息,擴展性比較強
Matrix
:方塊地圖,整個遊戲的互動區域
Row
:爲了更好地渲染Cell
,在Matrix
和Cell
之間增長一層Rowclass
語法:任什麼時候候都要明確你的this
指向在哪裏。react-redux
的靈活使用:在須要狀態
和不須要狀態
的情形下要作取捨;純函數更新;異步更新;有什麼好處。dispatch
:分發鼠標事件到全局,用於更新store
,並讓各個部分有機刷新。最後這兩點(6/7)爲啥很重要,我是這麼思考的:
到這裏,基本上我貢獻了從開始閱讀
React
文檔到輸出一個minesweeper
遊戲的全部思考。
- 但願可以幫助到你們。
- 但願能獲得更多反饋,可以一塊兒交流。
最後奉上項目地址,謝謝你們。
(以上文章僅來自做者(我)我的觀點)