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

来源:http://www.cnblogs.com/wuhairui/archive/2017/06/08/6961052.html
-Advertisement-
Play Games

文章轉載:http://www.jianshu.com/p/8f74cfb146f7 網站是畢業設計的作品,開發這個網站的目的主要用於記錄一些筆記,以及聚合一些資訊信息,也算自己在網路世界中的一塊靜地吧,可以在這裡一些技術上想法的實踐。 網站最初前端使用vue開發,在前段時間由於項目的開發進度已經不 ...


文章轉載: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中可以在子路由通過''這樣的空字元來作為預設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,但是都不是基於整個項目的),開發流程變得更加可控,數據流向變得清晰,而在開發中各個工具耦合性也變得更低,總的來說這是一次不錯的嘗試。不過個人覺得不管使用什麼技術,複雜程度隨著業務的增加必定變得更高,而要維持一個項目的穩定,健壯,易於維護將變得更加困難。

最後不得不感嘆,良好編程習慣的重要性。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.什麼是生成器 通過列表生成式,我們可以直接創建一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以 ...
  • __doc__ 查看尖的描述信息 __module__表示當前操作的對象所在的模塊 __class__表示當前操作的對象所屬的類 __init__構造方法 通過類創建對象自動執行 __del__析構方法,當前對象在記憶體中被釋放自動斬妖執行 __call__對象後面加括弧觸發執行 __dict__查看 ...
  • 初學時,對不太熟悉的markdown語法,有個簡單記錄 [公式][1] 公式一般用Latex書寫,線上[Latex編輯器][2]可以使用,有以下幾種方法供選擇 有然後保存為圖片gif格式,使用img標簽進行引用。 使用Google Chart的伺服器 `` 給個例子, 顯示結果為(博客園的markd ...
  • 怎麼樣的SDK算是一個好的SDK? 在做SDK的過程中我們走過非常多的彎路,是一個難以想象的學習過程,我們總結一個好的SDK應該具備的特質: 易用性,穩定性,輕量,靈活,優秀的支持. 一、易用性 因為工作的關係我接觸了很多的開發者,其中有行業知名的公司的開發者,也有極小的個人開發者.有一個現象很有意 ...
  • 設計源於需求卻高於需求。 《軟體方法》上冊(五章)所表述的邏輯: 願景 業務建模 需求 分析 設計 1. 願景: 明白軟體的意義是什麼,幫助或者提高了現有系統的那些方面,減少了那些成本。 利潤 = 需求 - 設計 這個公式成立的前提是需求都已經實現,不同的設計會花費不同的成本。但看完上篇,我覺得應該 ...
  • 程式想要通過簡單地設置一些參數就生成一個不同的軟體,在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進去,就可以用條件編譯,通過預編譯指令設置編譯條件,在不同的需要時編譯不同的代碼。 (一)條件編譯方法 條件編譯是通過預編譯指令來實現的,主要方法有:1、#if, #elif, #else ...
  • 1、document.domain+iframe的設置2、動態創建script3、利用iframe和location.hash4、window.name實現的跨域數據傳輸5、使用HTML5 postMessage6、利用flash 7、jsonp 本地的話,可以利用花瓶、gulp等工具 ...
  • 總結: toggle對整個元素的可見樣式屬性進行動畫過渡處理 slideToggle對元素做高與透明度過渡處理 fadeToggle對元素僅做透明度過渡處理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...