網站是畢業設計的作品,開發這個網站的目的主要用於記錄一些筆記,以及聚合一些資訊信息,也算自己在網絡世界中的一塊靜地吧,可以在這裡一些技術上想法的實踐。
網站最初前端使用vue
開發,在前段時間由於專案的開發進度已經不是那麼緊急,有了一些空閒時間。而對沒有使用過React
又一直耿耿於懷,索性就使用React
進行了一次前端的重構。
學習一門新的技術最基本的當然就是閱讀相關文檔了,作為一個單頁面應用前端路由當然是不可能少了,而使用React
如果不使用Reduce
那又感覺發揮不其作用(雖然他們其實也沒什麼必須的關係)。所以這裡使用了react
,react-router
,react-redux
,以下為在使用React
開發中的一些見聞,有幸被你看到該文,如有不對之處,也望指出,如果你不小心被帶入坑,本人概不負責。
首先就是閱讀React
的文檔了,文檔使用大量舉例的形式介紹如何使用React
進行開發,如如何設計state
, props
,如何元件間通信,如何設計元件等。雖然文檔進行了詳細的介紹,但是往往還是需要真正的實踐才能發現其中的妙處。如state
,props
的設計,在一個X
元件中擁有Y
,Z
兩個元件,假設Y
元件擁有一個輸入框,而Z
元件可能需要用到Y
元件輸入的值做出一定的變化,當然如果把他們寫在一起也不是不可以的,但是考慮到組件復用,功能單一等因素還是拆開比較合理,那麼這個值到底應該哪個組件來儲存呢?如下兩個元件分別為Y
,X
,這樣設計明顯是不符合state
設計的,有太多冗餘部分。
class InputComponent extends Component { constructor () { super()this.state = { value: ''} } valInput (e) { let value = e.target.valuethis.setState({value})this.props.inputChange(value) } render () {return <input onChange={this.valInput.bind(this)}/> } }
class ParentComponent extends Component { constructor () { super()this.state = { val: ''} } inputChange (val) {this.setState({val}) } render () {return ( <section>{this.state.val}<InputComponent inputChange={this.inputChange.bind(this)}/> </section> ) } }
如果使用如下的寫法或許看起來更好
class InputComponent extends Component { render () { let {val, inputChange} = this.props// 这里的val并不是必须的,但是当一个值来自非输入控件的时候,如可编辑的div,ace在每次执行render函数的时候都会导致原来输入的值被清空。return <input value={val} onChange={inputChange}/> } }
class ParentComponent extends Component { constructor () { super()this.state = { val: ''} } inputChange (e) {this.setState({val: e.target.value}) } render () { let val = this.state.valreturn ( <section>{val}<InputComponent val={val} inputChange={this.inputChange.bind(this)}/> </section> ) } }
#react-router
提供了前端路由基本的需求,根據需要使用到的功能在專案文件介紹中即可找到具體使用方法。基本的配置和其他框架也是大同小異,但是很多API的使用確有些大相徑庭(和vue
相比),還是需要仔細通讀文檔的,以免在開發中出現問題再去解決浪費時間,如IndexRoute
在vue
中可以在子路由通過''
這樣的空字元來作為預設UI
。
function root () { this.path = '/' this.component = require('pages/index').default}function demo () { this.path = 'demo' this.getComponent = (nextstate, cb) => { require.ensure([], (require) => { cb(null, require('pages/demo').default) }) } } const createRoute = (R) => { let route = new R() route.childRoutes = route.childRoutes && route.childRoutes.map(r => createRoute(r)) return route } export default [root, demo].map((route) => createRoute(route))
react-redux
在從表象理解Redux中進行了簡單介紹。 Redux
的使用減少了開發中思考的時間,同時也避免了一些可能的問題。在使用過程中也發現一些問題,使用Redux
必然導致大量的dispatch
出現在元件中,如何防止業務變得複雜和龐大後導致專案變得難以維護,也是值得思考的。在被改版的網站中使用頁面+組件的方式開發,一個頁面表示除了跟組件外的最高級組件,可擁有多個組件,只有頁面才能向reducer
發起action
,所有多個元件共用的數據則透過在頁面中傳遞到子元件的props
,子元件如果需要更新數據,則透過props
屬性呼叫父元件傳入的方法向上傳遞指令,在頁面中使用dispath
來指定action
來呼叫reducer
進行資料更新,當然有時候也需要在action
中進行處理後在dispath
action
到reducer
(例如網路請求)。值得注意的是每次dispath
一個action
,Redux
都會遍歷所有已經註冊的reducer
(reducer往往由多個子reducer組成),也就是說所有reducer
都會被呼叫(從專案中的表現和文件來看是這樣的),一下是被改版網站使用的reducer
部分程式碼。
export default class ArticleReducer { [AAS.ARTICLE_REQUEST_STATE] (state, action) {return Object.assign({}, state, {loading: action.loading}) } [AAS.ARTICLE_SEARCH_STATE] (state, action) {return Object.assign({}, state, {searching: action.searching}) } }
const reducers = {} const AR = new ArticleReducer() const NR = new NewsReducer() reducers.articles = (state = initState.article, action) => { return AR[action.type] ? AR[action.type](state, action) : state } reducers.editor = (state = initState.editor, action) => { return ER[action.type] ? ER[action.type](state, action) : state }
就使用React
後的感覺,由於第一次真正使用Redux
這樣的狀態管理工具來進行開發(雖然也有使用vuex,但是都不是基於整個專案的),開發流程變得更加可控,資料流向變得清晰,而在開發中各個工具耦合性也變得更低,總的來說這是一次不錯的嘗試。不過個人覺得不管使用什麼技術,複雜程度隨著業務的增加必定變得更高,而要維持一個專案的穩定,健壯,易於維護將變得更加困難。
最後不得不感嘆,良好程式設計習慣的重要性。
以上是使用React寫一個網站的心得體會的詳細內容。更多資訊請關注PHP中文網其他相關文章!