React構建單頁應用方法與實例

来源:http://www.cnblogs.com/luozhihao/archive/2016/06/13/5579786.html
-Advertisement-
Play Games

React作為目前最流行的前端框架之一,其受歡迎程度不容小覷,從這門框架上我們可以學到許多其他前端框架所缺失的東西,也是其創新性所在的地方,比如虛擬DOM、JSX等。那麼接下來我們就來學習一下這門框架是如何構建起一個單頁應用的。 前言 首先在學習這門框架前,你需要對以下知識有所瞭解: 原生JS基礎 ...


React作為目前最流行的前端框架之一,其受歡迎程度不容小覷,從這門框架上我們可以學到許多其他前端框架所缺失的東西,也是其創新性所在的地方,比如虛擬DOM、JSX等。那麼接下來我們就來學習一下這門框架是如何構建起一個單頁應用的。

前言

首先在學習這門框架前,你需要對以下知識有所瞭解:

  1. 原生JS基礎

  2. CSS基礎

  3. npm包管理基礎

  4. webpack構建項目基礎

  5. ES6規範

以上五個知識點也是目前學習其他前端框架所必須瞭解的前置任務。
JS和CSS就不多說了,npm是目前最提倡也是占據主導地位的包管理工具,還在用bower或者其他工具的童鞋可以考慮下了。而webpack作為新一代打包工具,已經在前端打包工具中獨占鰲頭,和Browserify相比也有很大優勢。至於ES6規範雖然現在主流瀏覽器還不相容,但可以使用babel等轉換器進行轉換。

結合其他的一些主流前端框架,我個人認為構建單頁應用有這樣三個基本的東西:組件、路由、狀態管理。那麼接下來我就基於這三者來介紹React,當然其中會穿插一些額外的知識點。

 

組件

React的組件撰寫和調用主要依賴於ES6的模塊化和JSX的語法,以下是一個例子:

// main.js
import React from 'react'
import { render } from 'react-dom'
import MyComponent from './component.js'
import './main.css'


// 主組件
class MyDemo extends React.Component {
    render() {
        return (
            <div className="box">
                <MyComponent />
            </div>
        )
    }
}

render((
    <MyDemo />
), document.getElementById('app'))


// component.js

// 子組件
import React from 'react'

export default class MyComponent extends React.Component {
    render() {
        return (
            <div>
                <p>這是一個組件!</p>
            </div>
        )
    }
}


// main.css
.box {
    width: 100%
}

相比Vue.js框架,我個人認為React的組件編寫方式還是沒有Vue來的舒服,組件的css樣式還是脫離在組件外部的,維護起來也不是很方便。想瞭解Vue組件編寫方式的可以看一下我之前寫的一篇文章《淺談Vue.js》

從這個例子中我們就可以看到React的虛擬DOM和JSX的特性了。相比其他框架,React的虛擬DOM不僅可以提升頁面的性能,同時還可以防止XSS攻擊等。關於虛擬DOM的具體原理這裡不作介紹,有興趣的童鞋可以參考
http://www.alloyteam.com/2015/10/react-v...

至於JSX語法則是JS的一種語法糖,我們可以通過這種語法糖來便捷實現一些功能,這裡JSX 把類 XML 的語法轉成純粹 JavaScript,XML 元素、屬性和子節點被轉換成 React.createElement 的參數。類似的JS語法糖還有TypeScript等。

 

路由

前端路由機制是目前構建單頁應用(SPA)最重要的一環之一。通過前端路由我們可以優化用戶體驗,不需要每次都從伺服器獲取全部數據,從而快速將頁面展現給用戶。

React路由依賴於React Router。React Router 保持 UI 與 URL 同步。它擁有簡單的 API 與強大的功能例如代碼緩衝載入、動態路由匹配、以及建立正確的位置過渡處理。

下麵是一個React路由的例子:

import React, { Component } from 'react'
import { render } from 'react-dom'
import { Router, Route, IndexRoute, Link, browserHistory } from 'react-router'

const ACTIVE = { color: 'red' }

class App extends Component {
    render() {
        return (
            <div>
                <h1>我的路由</h1>
                <ul>
                    <li><Link to="/" activeStyle={ACTIVE}>首頁</Link></li>
                    <li><Link to="/users" activeStyle={ACTIVE}>用戶頁</Link></li>
                </ul>
                {this.props.children}
            </div>
        )
    }
}

class Index extends React.Component {
    render() {
        return (
            <div>
                <h2>Index!</h2>
            </div>
        )
    }
}

class Users extends React.Component {
    render() {
        return (
            <div>
                <h2>Users</h2>
            </div>
        )
    }
}

render((
    <Router history={browserHistory}>
        <Route path="/" component={App}>
            <IndexRoute component={Index}/>
            <Route path="users" component={Users}></Route>
        </Route>
    </Router>
), document.getElementById('app'))

這裡只列出了React的一種路由寫法。相比其他框架,React路由的語法更加通俗易懂。關於React Router的詳細介紹請參照官方文檔:http://react-guide.github.io/react-route...

 

狀態管理

狀態管理不是單頁應用必須的,使用它能夠幫助我們統一管理各個狀態的變更,使整個項目流程清晰可維護。React實現狀態管理可以使用官方推薦的Redux。
Redux使用的是嚴格的單向數據流。整個應用的 state 被儲存在一棵 object tree 中,並且這個 object tree 只存在於唯一一個 store 中。關於Redux的詳細資料官方文檔也介紹的非常詳細,詳情請戳這裡:http://cn.redux.js.org/index.html

 

項目實例

這裡我用React寫了一個單頁網站,頁面如下:

 

這是一個基於React和Antd的實例,全部源碼我已經上傳至我的github,地址為:https://github.com/luozhihao/react-antd-...,這裡只為不懂如何用React構建單頁應用的童鞋作參考。

Antd是螞蟻金服的一款基於React的開源UI組件庫,其官網為:http://ant.design/

 

Fetch

因為上面的實例中我用到了Fetch來進行Ajax交互,所以這裡簡單介紹下Fetch。
我們可以把Fetch作為下一代Ajax技術,它採用了目前流行的 Promise 方式處理。利用Fetch我們可以這樣寫Ajax進行數據交互:

// 獲取數據方法
    fetchFn = () => {
        fetch('../../data.json')
            .then((res) => { console.log(res.status);return res.json() })
            .then((data) => { this.setState({lists:data.listData}) })
            .catch((e) => { console.log(e.message) })
    }

這裡有一篇介紹Fetch的文章寫的不錯,推薦給大家《傳統 Ajax 已死,Fetch 永生》

 

結語

還是那句話,學習一門框架最重要的並不是學習它的技術,而是學習其帶來的解決問題的思路。通過React這一門框架的學習,你可以從它獨特的新特性中發掘一種新的思維模式。只有思維層面得到了擴展,你才能在前端的海洋里自由翱翔。

 

原創文章,轉載請註明來自一個蘿蔔一個坑 -博客園[http://www.cnblogs.com/luozhihao] 

本文地址:http://www.cnblogs.com/luozhihao/p/5579786.html

本文同步發表於:https://segmentfault.com/a/1190000005703694


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

-Advertisement-
Play Games
更多相關文章
  • 手機涉及到填寫表單時,需要手機彈出自定義的輸入框,而非手機自帶的輸入鍵盤,如大寫數字等。 實現思路(考慮多種文本輸入形式): 首先,文本框獲取焦點時禁止手機彈出自帶的輸入鍵盤。 其次,顯示與關閉自定義的輸入鍵盤。 最後,點擊自定義的輸入鍵盤,做判斷使對應的input獲取值。 ...
  • ES5引入Object.getPrototypeOf函數作為獲取對象原型的標準API,但由於之前的很多js引擎使用了一個特殊的__proto__屬性來達到相同的目的。但有些瀏覽器並不支持這個__proto__屬性,所以並不是完全相容的。例如對於擁有null原型的對象,不同的環境結果就不同了。 ...
  • 眾所周知在前段的工作中註冊信息或獲取當前手機號信息等需求,我們基本上都要涉及到手機號驗證碼,在網路上搜索的案例雜亂無章,用的時候全是坑,真心不想用了,然後自己寫了一個獲取手機驗證碼的倒計時效果。有需求的伙伴們可以看看怎麼實現的。 如何獲取手機驗證碼? 小月不知道大家是利用什麼平臺去獲取驗證碼的,但是 ...
  • 前段時間做了一個項目,涉及到上傳本地圖片以及預覽的功能,正好之前瞭解過 html5(點擊查看更多關於web前端的有關資源) 可以上傳本地圖片,然後再網上看了一些demo結合自己的需求,終於搞定了。(PS : 不得不承認我這個人有多懶,沒有需求的時候我向來不主動去學習)。移動端完全支持哦!已測試。 下 ...
  • 原型包括三個獨立但相關的訪問器。這三個單詞都是對單詞prototype做了一些變化。 C.prototype用於建立由new C()創建的對象的原型 Object.getPrototypeOf(obj)是ES5中用來獲取obj對象的原型對象的標準方法 obj.__proto__是獲取obj對象... ...
  • .bottomTable{ background-color: rgb(249,249,249); z-index:99999999; position:fixed; bottom:0; left:0; width:100%; _position:absolute; /* for IE6 */ /* ...
  • javascript的列印輸出document.write() 1 document.write(hello world !); ...
  • 效果展示 http://hovertree.com/texiao/jquery/77/看慣了左右切換的幻燈片,何問起向您推薦一個新穎的,旋轉切換,通過點擊按鈕的相應區域可以使幻燈片以旋轉的方式來切換圖片,非常有創意。點擊哪個顏色就切換到那個顏色,還帶音效。背景圖可以自定義。進入源碼下載頁面 http ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...