React.js
React基礎
function component

有了 JSX 之後,工程師還是不滿足。因為過去像這樣的過程不斷的重複:

let menuItemWording = ['Like的發問', 'Like的回答', 'Like的文章', 'Like的留言'];
 
let menuItem = menuItemWording.map(wording => new MenuItem(wording));
 
let menuInstance = new Menu(menuItem);

但這樣不就等於是我們在自製 HTML 元素嗎? 既然現在 HTML 標籤元素可以被運算,那我們自製的元素能不能也用和 HTML 標籤元素一樣的方法使用呢?

於是,function component 就誕生了。

function component 的語法

在 React 中,我們只要遵循以下規則,就能讓 function 變成 React 的元件,並且在 JSX 中以<我的元件/>或是<我的元件><我的元件/>方式使用。

  • 開頭引入 React(React 17 前)
  • 函數名稱為大寫
  • 回傳 JSX

例如,這是一個以原生 JS撰寫的MenuItem:

function MenuItem(wording) {
    let menuItem = document.createElement('li');
    menuItem.setAttribute('class', 'menu-item');
    menuItem.textContent = wording;
 
    this.getDOMItem = () => menuItem;
}

在 React 中,我們可以這樣寫:

  • src/component/MenuItem.js (請注意這裡的路徑有小變化)
import React from 'react';
 
function MenuItem() {
    return <li>文字</li>;
}
 
export default MenuItem;

而回到前一篇的src/index.js,我們就能以<MenuItem/>或是<MenuItem><MenuItem/>的方式使用 MenuItem

  • src/index.js
import React from 'react';
import { createRoot } from 'react-dom/client';
 
const root = createRoot(document.getElementById('root'));
 
// 引入剛剛撰寫的元件
import MenuItem from './component/MenuItem';
 
let menuItemWording = ['Like的發問', 'Like的回答', 'Like的文章', 'Like的留言'];
 
let menuItemArr = menuItemWording.map(wording => <MenuItem />);
 
root.render(<div>{menuItemArr}</div>, document.getElementById('root'));

執行結果: 是不是很方便呢?

function component和一般函式的差異

在前面的教學文中,我們提及可以利用一般函式重複製造元素。

import React from 'react';
import { createRoot } from 'react-dom/client';
 
const menuFactory = () => {
    return <div>hello world!</div>;
};
 
const root = createRoot(document.getElementById('root'));
root.render(menuFactory());

這樣的做法和function component的差別是,函式只能重複製造元素,而function component可以使用React內建的特殊功能(例如: 可自動監聽的變數、生命週期等)。我們會在後面的文章中提到。