1. 程式人生 > 其它 >React簡單教程-2-ts和元件引數

React簡單教程-2-ts和元件引數

前言

在上一章:React 簡單教程-1-元件 我們知道了 React 的元件是什麼,長什麼樣,用 js 和 HTML 小小體驗了一下元件。在這一章,我們將使用 typescript(簡稱 ts) 來代替 js,這種語法的檔名字尾是 tsx

我強烈建議使用 ts 來開發 React,要說 ts 比 js 好在哪裡?這麼說,js 唯一不好的地方就是它只能用 js 來寫。

如果你不會 ts,那麼你可以稍微地學習一下,官網:typescript,能夠看懂一些基本語法就可以了,我們會在編寫程式碼的過程中慢慢學習。

新建 React-ts 專案

現在,忘了我們在上一章建立的專案吧,我們要重新建立一個使用 ts 開發的 React 專案。建立的方式其實和我們上一章的方式相同,在終端輸入命令,但有一點不一樣:

npm create vite@latest my-react-app -- --template react-ts

在最後面指定模板的引數,我們使用的是 react-ts,表示是一個 react 專案,且用 ts 開發。

進入到資料夾,應該會看到如下的目錄結構:

這個檔案結構我們還是很熟悉的,不過我們能夠注意到,在上一章中我們寫程式碼的元件檔名從 App.jsx 變成了 App.tsx,說明使用的是 ts 語言來開發。按照上一章的步驟,執行 npm i 安裝依賴包,然後執行 npm run dev 來啟動開發伺服器,在瀏覽器中開啟地址 http://localhost:3000/

你可以在 App.tsx

中隨意修改你的程式碼。這些步驟都跟我們在上一章中相同。

引數傳遞

元件可以接收其他元件傳遞過來的引數。比如說父元件中有一個值,這個值需要傳遞給子元件顯示,那麼子元件要這麼接收這個值呢?

我們先新建一個子元件吧,這個元件用於顯示值,就叫 displayer.tsx 吧。

export function Displayer() {
  return <div></div>;
}

這個元件要可以接收傳進來的引數,只需要在它的入參裡寫上 props 即可。

export function Displayer(props) {
  return <div></div>;
}

這個名字是約定的,所以不能寫錯。它的型別是一個物件,所有傳遞進來的引數都是 props 的屬性。比如說,外部傳遞進來了一個引數叫 name,那麼我們使用這個引數的寫法就是:

export function Displayer(props) {
  //  像這樣獲取,因為所有的傳遞給元件的引數都是 props 的屬性
  const name = props.name;
  return <div></div>;
}

然後,我們把這個引數的值,在返回的 html 裡使用,要用花括號括起來,表示使用這個變數,不然會被識別為字面量:

export function Displayer(props) {
  const name = props.name;
  return (
    <div>
      <div>可以這麼使用變數:{name}</div>
      <div>也可以直接使用:{props.name}</div>
      <div>沒有花括號則被當作是字面量:props.name</div>
    </div>
  );
}

然後,如同我們上一章學的,在父元件中使用子元件,這裡我們的父元件是 App

import { Displayer } from "./displayer";

function App() {
  return (
    <div>
      {/*使用子元件*/}
      <Displayer />
    </div>
  );
}

我們還沒有在父元件裡給子元件傳遞引數,傳遞引數的方式也非常簡單,就跟 html 的屬性一樣,直接寫上子元件的引數名:

import { Displayer } from "./displayer";

function App() {
  return (
    <div>
      {/*使用子元件,傳遞引數*/}
      <Displayer name="My name is App" />
    </div>
  );
}

注意傳遞引數是直接寫引數名,不需要寫 props,在子元件裡使用時才需要寫 props

我們啟動看看效果,如下:

可以看到父元件的引數成功傳遞到了子元件並顯示。

如果傳遞更多的引數的話也是一樣的寫法,我在下方做示例,同時給我們的 props 引數新增上型別,以方便的知道子元件能夠傳遞什麼引數,這也是使用 ts 的便捷之處。

//  子元件
export function Displayer(props: { name: string, content: string }) {
  const name = props.name;
  const content = props.content;
  return (
    <div>
      <div>{name}</div>
      <div>{content}</div>
    </div>
  );
}

//  父元件
import { Displayer } from "./displayer";

function App() {
  return (
    <div>
      <Displayer name="My name is App" content="My content is Aoh!!!" />
    </div>
  );
}

效果如下:

當然,我們可以隨意得把玩子元件,學習的方式之一就是用各種方式來把玩,我們可以在父元件中多用幾次子元件:

//  父元件
import { Displayer } from "./displayer";

function App() {
  return (
    <div>
      <Displayer name="My name is App1" content="My content is Aoh!!!1" />
      <Displayer name="My name is App2" content="My content is Aoh!!!2" />
      <Displayer name="My name is App3" content="My content is Aoh!!!3" />
      <Displayer name="My name is App4" content="My content is Aoh!!!4" />
    </div>
  );
}

那麼你就能看到如下效果:

警告

如果這麼寫會怎麼樣???

//  在元件中引用它自己
//  不要這麼寫
export function Displayer(props: { name: string, content: string }) {
  const name = props.name;
  const content = props.content;
  return (
    <div>
      <div>{name}</div>
      <div>{content}</div>
      {/* 會發生什麼事??? */}
      <Displayer name="My name is Sub1" content="My content is Error!!!1" />
    </div>
  );
}

總結

在本文中,我們學會了元件如何傳遞引數。但是我們的子元件還沒有任何樣式,下一篇中我們將給它加上樣式,讓它看起來好看一些。

參考資料

元件 & Props by React