1. 程式人生 > >React(一)

React(一)

一、簡介

React 是一個用於構建使用者介面的JAVASCRIPT 庫。

React主要用於構建UI,很多人認為 React 是 MVC 中的 V(檢視)。

React 起源於 Facebook 的內部專案,用來架設Instagram 的網站,並於 2013 年 5 月開源。

React 擁有較高的效能,程式碼邏輯非常簡單,越來越多的人已開始關注和使用它。

二、特點

1.宣告式設計 −React採用聲明範式,可以輕鬆描述應用。

2.高效 −React通過對DOM的模擬,最大限度地減少與DOM的互動。

3.靈活 −React可以與已知的庫或框架很好地配合。

4.JSX − JSX 是 JavaScript 語法的擴充套件。React 開發不一定使用 JSX ,但我們建議使它。

5.元件 − 通過 React 構建元件,使得程式碼更加容易得到複用,能夠很好的應用在大專案的開發中。

6.單向響應的資料流 − React實現了單向響應的資料流,從而減少了重複程式碼,這也是它為什麼比傳統資料繫結更簡單。

三、hello world程式

<!DOCTYPE html>

<html>

 <head>

   <meta charset="UTF-8" />

   <title>Hello React!</title>

   <scriptsrc="http://static.runoob.com/assets/react/react-0.14.7/build/react.min.js"></script>

   <script src="http://static.runoob.com/assets/react/react-0.14.7/build/react-dom.min.js"></script>

   <scriptsrc="http://static.runoob.com/assets/react/browser.min.js"></script>

 </head>

 <body>

   <div id="example"></div>

   <script type="text/babel">

     ReactDOM.render(

       <h1>Hello, world!</h1>,

       document.getElementById('example')

     );

   </script>

 </body>

</html>

例項中我們引入了三個庫: react.min.js 、react-dom.min.js 和 browser.min.js:

react.min.js - React 的核心庫

react-dom.min.js - 提供與 DOM 相關的功能

browser.min.js - 用於將 JSX 語法轉為JavaScript 語法

ReactDOM.render(

         <h1>Hello,world!</h1>,

         document.getElementById('example')

);

以上程式碼將一個 h1 標題,插入 id="example" 節點中。

注意:

如果我們需要使用 JSX,則 <script> 標籤的 type 屬性需要設定為 text/babel

四、通過 npm 使用 React

建議在 React 中使用 CommonJS 模組系統,比如 browserify 或 webpack,本教程使用 webpack。

第一步、安裝全域性包

$ npm install babel -g

$ npm install webpack -g

$ npm install webpack-dev-server --save-dev   # 或者  npm install webpack -g

第二步、建立根目錄

建立一個根目錄,目錄名為:reactApp,再使用 npm init 初始化,生成 package.json 檔案:

$ mkdir reactApp

$ cd reactApp/

$ npm init

name: (reactApp) runoob-react-test

version: (1.0.0)

description: 菜鳥教程 react 測試

entry point: (index.js)

test command:

git repository:

keywords:

author:

license: (ISC)

About to write to /Users/tianqixin/www/reactApp/package.json:

{

  "name":"runoob-react-test",

  "version":"1.0.0",

  "description":"菜鳥教程 react 測試",

  "main":"index.js",

  "scripts":{

    "test":"echo \"Error: no test specified\" && exit 1"

  },

  "author":"",

  "license":"ISC"

}

Is this ok? (yes)

第三步、新增依賴包及外掛

因為我們要使用 React, 所以我們需要先安裝它,--save 命令用於將包新增至 package.json 檔案。

$ npm install react --save

$ npm install react-dom --save

同時我們也要安裝一些 babel 外掛

$ npm install babel-core

$ npm install babel-loader

$ npm install babel-preset-react

$ npm install babel-preset-es2015

第四步、建立檔案

接下來我們建立一些必要檔案:

$ touch index.html

$ touch App.jsx

$ touch main.js

$ touch webpack.config.js

第五步、設定編譯器,伺服器,載入器

開啟 webpack.config.js 檔案新增以下程式碼:

 varconfig = {

  entry: './main.js',

  output: {

     path:'./',

     filename: 'index.js',

   },

  devServer: {

     inline: true,

     port: 7777

   },

   module:{

     loaders: [ {

        test: /\.jsx?$/,

        exclude: /node_modules/,

        loader: 'babel',

        query: {

           presets: ['es2015', 'react']

        }

     }]

   }

}

module.exports = config;

entry: 指定打包的入口檔案 main.js。

output:配置打包結果,path定義了輸出的資料夾,filename則定義了打包結果檔案的名稱。

devServer:設定伺服器埠號為 7777,埠後你可以自己設定 。

module:定義了對模組的處理邏輯,這裡可以用loaders定義了一系列的載入器,以及一些正則。當需要載入的檔案匹配test的正則時,就會呼叫後面的loader對檔案進行處理,這正是webpack強大的原因。

現在開啟 package.json 檔案,找到 "scripts" 中的 "test""echo \"Error: no test specified\" && exit 1" 使用以下程式碼替換:

"start": "webpack-dev-server--hot"

替換後的 package.json 檔案 內容如下:

$ cat package.json

{

  "name":"runoob-react-test",

  "version":"1.0.0",

  "description":"菜鳥教程 react 測試",

  "main":"index.js",

  "scripts":{

         "start":"webpack-dev-server --hot"

  },

  "author":"",

  "license":"ISC",

  "dependencies":{

    "react":"^0.14.7",

    "react-dom":"^0.14.7"

  }

}

現在我們可以使用 npm start 命令來啟動服務。--hot 命令會在檔案變化後重新載入,這樣我們就不需要在程式碼修改後重新重新整理瀏覽器就能看到變化。

第六步、index.html

設定 div id = "app" 為我們應用的根元素,並引入 index.js 指令碼檔案。

<!DOCTYPE html>

<html>

   <head>

     <meta charset = "UTF-8">

     <title>React App - 菜鳥教程(runoob.com)</title>

   </head>

   <body>

     <div id = "app"></div>

     <script src = "index.js"></script>

   </body>

</html>

第七步、App.jsx 和 main.js

這是第一個 react 元件。後面的章節我們會詳細介紹 React 元件。這個元件將輸出 Hello World!!!。

App.jsx 檔案程式碼

import React from 'react';

class App extends React.Component {

  render() {

     return (

        <div>

           Hello World!!!<br />

            歡迎來到菜鳥教程學習!!!

        </div>

     );

   }

}

export default App;

我們需要引入元件並將其渲染到根元素 App 上,這樣我們才可以在瀏覽器上看到它。

main.js 檔案程式碼

import React from 'react';

import ReactDOM from 'react-dom';

import App from './App.jsx';

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

注意:

如果想要元件可以在任何的應用中使用,需要在建立後使用 export 將其匯出,在使用元件的檔案使用 import 將其匯入。

第八步、執行服務

完成以上配置後,我們即可執行該服務:

$ npm start

通過瀏覽器訪問 http://localhost:7777/,即可得到輸出結果。

五、React JSX

React 使用 JSX 來替代常規的JavaScript。

JSX 是一個看起來很像 XML 的 JavaScript 語法擴充套件。

我們不需要一定使用 JSX,但它有以下優點:

JSX 執行更快,因為它在編譯為JavaScript 程式碼後進行了優化。

它是型別安全的,在編譯過程中就能發現錯誤。

使用 JSX 編寫模板更加簡單快速。

1、使用JSX

JSX 看起來類似 HTML ,我們可以看下例項:

ReactDOM.render(

         <h1>Hello,world!</h1>,

         document.getElementById('example')

);

我們可以在以上程式碼中巢狀多個 HTML 標籤,需要使用一個 div 元素包裹它,例項中的 p 元素添加了自定義屬性 data-myattribute新增自定義屬性需要使用 data- 字首

ReactDOM.render(

         <div>

         <h1>菜鳥教程</h1>

         <h2>歡迎學習 React</h2>

    <pdata-myattribute = "somevalue">這是一個很不錯的 JavaScript 庫!</p>

    </div>

         ,

         document.getElementById('example')

);

2、獨立檔案

你的 React JSX 程式碼可以放在一個獨立檔案上,例如我們建立一個 helloworld_react.js 檔案,程式碼如下:

ReactDOM.render(

  <h1>Hello,world!</h1>,

 document.getElementById('example')

);

然後在 HTML 檔案中引入該 JS 檔案:

<body>

  <divid="example"></div>

<script type="text/babel" src="helloworld_react.js"></script>

</body>

3、JavaScript 表示式

我們可以在 JSX 中使用 JavaScript 表示式。表示式寫在花括號 {} 中。例項如下:

ReactDOM.render(

         <div>

           <h1>{1+1}</h1>

         </div>

         ,

         document.getElementById('example')

);

在 JSX 中不能使用 if else 語句,但可以使用 conditional (三元運算) 表示式來替代。以下例項中如果變數 i 等於 1 瀏覽器將輸出 true, 如果修改 i 的值,則會輸出 false.

ReactDOM.render(

         <div>

           <h1>{i == 1 ? 'True!' : 'False'}</h1>

         </div>

         ,

         document.getElementById('example')

);

4、樣式

React 推薦使用內聯樣式。我們可以使用 camelCase 語法來設定內聯樣式.React會在指定元素數字後自動新增 px 。以下例項演示了為 h1 元素新增 myStyle 內聯樣式:

var myStyle = {

         fontSize:100,

         color:'#FF0000'

};

ReactDOM.render(

         <h1style = {myStyle}>菜鳥教程</h1>,

         document.getElementById('example')

);

5、註釋

註釋需要寫在花括號中,例項如下:

ReactDOM.render(

         <div>

    <h1>菜鳥教程</h1>

    {/*註釋...*/}

        </div>,

         document.getElementById('example')

);

6、陣列

JSX 允許在模板中插入陣列,陣列會自動展開所有成員:

var arr = [

  <h1>菜鳥教程</h1>,

  <h2>學的不僅是技術,更是夢想!</h2>,

];

ReactDOM.render(

  <div>{arr}</div>,

 document.getElementById('example')

);

7、HTML 標籤 vs. React 元件

React 可以渲染 HTML 標籤 (strings) 或 React 元件 (classes)。

要渲染 HTML 標籤,只需在 JSX 裡使用小寫字母的標籤名。

var myDivElement = <div className="foo"/>;

ReactDOM.render(myDivElement, document.getElementById('example'));

要渲染 React 元件,只需建立一個大寫字母開頭的本地變數。

var MyComponent = React.createClass({/*...*/});

var myElement = <MyComponentsomeProperty={true} />;

ReactDOM.render(myElement, document.getElementById('example'));

React 的 JSX 使用大、小寫的約定來區分本地元件的類和 HTML 標籤。

注意:

由於 JSX 就是 JavaScript,一些識別符號像 class 和 for 不建議作為 XML 屬性名。作為替代,React DOM 使用 className 和 htmlFor 來做對應的屬性。