本項目是學習react一個很是好的案例,不管是入門仍是想進階的人都能獲得幫助。若是你以爲本項目確實給你帶來了收穫,記得分享給他人和 star 一下。javascript
經過本項目,你能夠學到:css
注意:本項目代碼遵循Airbnb編碼規範並開啓了eslint的嚴格模式,若是eslint出現error,則會編譯失敗html
# install dependencies
yarn install or npm install
# serve with hot reload
yarn start or npm start
# build for production with minification
yarn build or npm run build
複製代碼
由於cnode關於發帖的API已經被禁止,沒有實現發帖功能java
本項目採用 redux 並結合了 immutabe.js 做爲管理數據的方式。 並作了以下限制:node
cnode-react
├─config(打包配置文件
├─docs(build生成的文件
│ └─static
│ ├─css
│ ├─js
│ └─media
├─public
├─scripts
└─src
├─assets(公共資源
│ ├─font
│ ├─images
│ └─styles
├─components(展現型且組件
│ ├─Header
│ ├─Image
│ ├─Loading
│ ├─Panel
│ └─UserInfoPanel
├─containers(容器型組件
│ ├─Detail
│ │ ├─components(私有展現型組件
│ │ │ ├─AuthorInfoPanel
│ │ │ ├─ReplyList
│ │ │ └─Topic
│ │ └─store(模塊化store和常量定義處
│ ├─Home
│ │ ├─components
│ │ │ ├─TopicList
│ │ │ └─TopicListItem
│ │ └─store
│ └─Login
│ ├─components
│ └─store
├─Layout(佈局組件
│ └─CommonLayout
├─store(全局store處,用來導入各處私有store
└─utils(公用方法,如請求用request對象
複製代碼
MITreact
class Foo extends Component {
static propTypes = {
// ↑ unexpected topken "="
foo: PropTypes.string,
}
}
複製代碼
這個是由於eslint默認的解析器並不支持es7的語法,安裝 eslint-babel,並在.babelrc裏把 parser 設置成babel-eslint便可ios
// .babelrc
module.exports = {
// ...
"parser": "babel-eslint",
// ...
};
複製代碼
這顯然不是好的解決方法,每次路由跳轉都回到頂部和路由不會重置都是糟糕的用戶體驗,我想了想,是否是能夠本身維持一個路由跳轉信息棧,用於保存路由信息和頁面高度,當跳轉時彈出棧中的一條路由信息和當前的路由進行比對,若是相符,就經過window.scrollTo滑動的保存的頁面高度,我以爲,這個方法的難點在於若是在合適的時機清空棧中的信息git
論壇的帖子是經過sub(主題)分類的,頁面上的每個tab(標籤)對應一個sub,每一次點擊tab都會跳轉到相應路由,組件經過路由拿到當前sub,而後請求相應的數據。然而,當用戶快速在路由間切換時,若是沒作限制,就會致使大量的異步網絡請求,而且因爲異步特性,可能致使後發的請求比前發的先到,而後數據被前發的覆蓋掉。爲了解決這個問題,我嘗試了三種方法,每一種都比上一種要好一點。github
在我寫react時,總會出現一個下面的錯誤提示npm
Can't perform a React state update on an unmounted component. This is a no-op...... 複製代碼
###緣由
我封裝了Image組件,接受一個src和alt參數,與img標籤不同的地方在於,Image組件會在圖片未加載時顯示一個loading效果,我經過state管理組件是否處於loading的狀態,經過設置img元素的onload屬性,在觸發onload事件後,會觸發一個回調函數,設置state的loadding狀態爲false。然而,Image做爲一個通用組件,我沒有考慮到Image組件可能會請求未完成的狀況下,就被銷燬,而此時事件還在,當img元素加載完畢後,就去觸發回調,調用setState,而此時組件已經被銷燬,就致使了內存泄漏的問題。
分析出緣由後,解決這個問題就變得簡單了,在unmount的時候,設置 img.onload = null; 就好了。
彷佛,react常見的內存泄漏緣由就是忘記組件unmount時銷燬事件,這牽扯到react事件的實現原理,react把全部事件掛載到window上進行代理,因此當元素被銷燬時,瀏覽器沒法銷燬與其相關的事件,由於事件沒有綁定在元素身上。
建議編碼的時候使用airbnb的編碼規範,airbnb做爲一個大型企業必定在js上吃了很多的虧,因此使用它們的編碼規範,不只使代碼看着舒服還能夠少踩不少的坑。