使用React改版網站後的一些感想

來源:互聯網
上載者:User

標籤:方法   cto   dispatch   思考   閱讀   onchange   重構   解決   loading   

文章轉載:http://www.jianshu.com/p/8f74cfb146f7

網站是畢業設計的作品,開發這個網站的目的主要用於記錄一些筆記,以及彙總一些資訊資訊,也算自己在網路世界中的一塊靜地吧,可以在這裡一些技術上想法的實踐。

網站最初前端使用vue開發,在前段時間由於項目的開發進度已經不是那麼緊急,有了一些空閑時間。而對沒有使用過React又一直耿耿於懷,索性就使用React進行了一次前端的重構。

學習一門新的技術最基本的當然就是閱讀相關文檔了,作為一個單頁面應用前端路由當然是不可能少了,而使用React如果不使用Reduce那又感覺發揮不其作用(雖然他們其實也沒什麼必須的關係)。所以在這裡使用了reactreact-routerreact-redux,以下為在使用React開發中的一些見聞,有幸被你看到該文,如有不對之處,還望指出,如果你不小心被帶入坑,本人概不負責。

首先就是閱讀React的文檔了,文檔使用大量舉例的形式介紹如何使用React進行開發,如如何設計stateprops,如何組件間通訊,如何設計組件等。文檔雖然進行了詳細的介紹,但是往往還是需要真正的實踐才能發現其中的妙處。如stateprops的設計,在一個X組件中擁有YZ兩個組件,假設Y組件擁有一個輸入框,而Z組件可能需要用到Y組件輸入的值做出一定的變化,當然如果把他們寫到一起也不是不可以的,但是考慮到組件複用,功能單一等因素還是拆開比較合理,那麼這個值到底應該哪個組件來儲存呢?如下兩個組件分別為YX,這樣設計明顯是不符合state設計的,擁有太多冗餘部分。

class InputComponent extends Component {  constructor () {    super()    this.state = {      value: ‘‘    }  }  valInput (e) {    let value =  e.target.value    this.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.val    return (      <section>        {val}        <InputComponent val={val} inputChange={this.inputChange.bind(this)}/>      </section>    )  }}

react-router提供了前端路由基本的需求,根據需要使用到的功能在項目文檔介紹中即可找到具體使用方法。基本的配置和其他架構也是大同小異,但是很多API的使用確有些大相徑庭(和vue相比),還是需要仔細通讀文檔的,以免在開發中出現問題再去解決浪費時間,如IndexRoutevue中可以在子路由通過‘‘這樣的Null 字元來作為預設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中進行處理後在dispathactionreducer(比如網路請求)。值得注意的是每次dispath一個actionRedux都會遍曆所有已經註冊的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改版網站後的一些感想

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.