JSX(網路資料收集)

JSX

  • JSX是一種語法糖,它讓我們可以比較直覺的撰寫React Component,而我們需要透過Babel把JSX轉譯成真正的Javascript,透過Babel也可以讓我們直接使用ES6+的語法
  • JSX allow us to write what looks like HTML inside of our javascript
  1. //JSX基本寫法
    const ele = <h1>Today is day</h1>;
    
    //透過Bebel轉譯
    var ele = React.createElement(
    	"h1",  //HTML元素 或是 React Component,這裏是h1
    	null,  // 屬性值,用物件表示,這裏沒有傳屬性
    	"Today is day" // 元素子元素,這裏只有文字
    );

  • 允許使用{ }包住JavaScript Expression

  • function getName(){
    	return "flowers";
    }
    const ele = <h1>Hello, {getName()}!</h1>;
    
    
    function getDrink(){
    	return <span>Coffe</span>;  
    }
    const ele = <h1>Hello, {getDrink()} </h1>

     

  • 設定JSX屬性 (Attribute)​: attribute代入的內容可以是string,也可以是一個object。

    //傳入字串
    const ele1 = <div name="Hoo"/>;
    
    //傳入物件
    const ele2 = <div user={name:"Hoo", age:36} />

     

  • JSX雖然某部分跟HTML的tag element很像,但它是Javascript的延伸語法,為了和HTML屬性有所區別,React DOM在屬性的命名上採用camelCase方式。

  • JSX元件style設定值為一個Object

  1. 第一個{  }是表示JSX傳入Javascript Expression,

  2. 第二個{  }表示是Object。例如:

    // font-size => fontSize
    
    const ele = <div name="Hoo" style={{color: "#999", fontSize: "24"}} />

     

根據 React 官方定義,React 是一個構建使用者介面的 JavaScritp Library。以 MVC 模式來說,ReactJS 主要是負責 View 的部份

HTML 掌管內容結構、CSS 負責外觀樣式,JavaScript 主管邏輯互動

在 React 世界裡,所有事物都是 以 Component 為基礎,將同一個 Compoent 相關的程式和資源都放在一起

1. 提供更加語意化且易懂的標籤

使用 JSX,就像 XML 語法結構一樣可以自行定義標籤且有開始和關閉,容易理解:

<MessageBox />

以 Facebook 上面按讚功能來說,若是命令式 Imperative 寫法大約會是長這樣:

if(userLikes()) {
  if(!hasBlueLike()) {
    removeGrayLike();
    addBlueLike();
  }
} else {
  if(hasBlueLike()) {
    removeBlueLike();
    addGrayLike();
  }
}

若是聲明式 Declarative 則是會長這樣:

if(this.state.liked) {
  return (<BlueLike />);
} else {
  return (<GrayLike />);
}

2. 更加簡潔

不使用 JSX 的情況(記得我們說過 JSX 是選用的):

// React.createElement(元件/HTML標籤, 元件屬性,以物件表示, 子元件)
React.createElement('a', {href: 'https://facebook.github.io/react/'}, 'Hello!')

使用JSX

<a href="https://facebook.github.io/react/">Hello!</a>

3. 結合原生 JavaScript 語法

<ul> {  } </ul>

// const 為常數
const lists = ['JavaScript', 'Java', 'Node', 'Python'];
class HelloMessage extends React.Compoent {
  render() {
    return (
    <ul>
      {lists.map((result) => {
        return (<li>{result}</li>);
      })}
    </ul>);
  }
}

4. 標籤用法

JSX 標籤非常類似 XML ,可以直接書寫。一般 Component 命名首字大寫HTML Tags 小寫。以下是一個建立 Component 的 class:

//自定標簽
class CoffeShop extend React.Component{
	render(){
		rutnrn(
			<div>
				<p>Morning coffe</p>
				<ReadingMorningBook />
			</div>
		);
	}
}

5. 轉換成 JavaScript

JSX 最終會轉換成瀏覽器可以讀取的 JavaScript

React.createElement(
  string/ReactClass, // 表示 HTML 元素或是 React Component
  [object props], // 屬性值,用物件表示
  [children] // 接下來參數皆為元素子元素
)

解析前(特別注意在 JSX 中使用 JavaScript 表達式時使用 { } 括起,如下方範例的 text,裡面對應的是變數。若需希望放置一般文字,請加上 ''):

var text = 'Hello React';
<h1>{text}</h1>
<h1>{'text'}</h1>

解析完後:

var text = 'Hello React';
React.createElement("h1", null, "Hello React!");

另外要特別要注意的是由於 JSX 最終會轉成 JavaScript 且每一個 JSX 節點都對應到一個 JavaScript 函數,所以在 Component 的 render 方法中只能回傳一個根節點(Root Nodes)。例如:若有多個 <div> 要 render 請在外面包一個 Component 或 <div><span> 元素

6. Boolean 屬性

在 JSX 中預設只有屬性名稱但沒設值為 true

<input type="button" disabled />;
<input type="button" disabled={true} />;

反之,若是沒有屬性,則預設為 false

<input type="button" />;
<input type="button" disabled={false} />;

7. 擴展屬性

在 ES6 中使用 ... 是迭代物件的意思,可以把所有物件對應的值迭代出來設定屬性,但要注意後面設定的屬性蓋掉前面相同屬性

8. 自定義屬性

若是希望使用自定義屬性,可以使用 data-

<HelloMessage data-attr="xd" />

9. 事件處理

事件處理為前端開發的重頭戲

(Recap)

在 React 世界裡,所有事物都是以 Component 為基礎,通常會將同一個 Compoent 相關的程式和資源都放在一起,而在撰寫 React Component 時我們常會使用 JSX 的方式來提升程式撰寫效率。JSX 是一種語法類似 XML ECMAScript 語法擴充,可以善用 JavaScript 的強大能力,放棄蹩腳的模版語言。當然 JSX 並非強制使用,你也可以選擇不用,因為最終 JSX 的內容會轉化成 JavaScript

 

camelCase:駝峰式大小寫

引用:

https://ithelp.ithome.com.tw/articles/10184583

https://blog.techbridge.cc/2016/04/21/react-jsx-introduction/