iT邦幫忙

2021 iThome 鐵人賽

DAY 6
1
自我挑戰組

Re: 新手讓網頁 act 起來系列 第 6

Re: 新手讓網頁 act 起來: Day06 - PropTypes

  • 分享至 

  • xImage
  •  

昨天我們介紹完如何建立一個元件,今天就來介紹 PropTypes,讓建立的元件更加的完整吧!

PropTypes

當我們在寫元件的時候,會建議將 props 先定義好要接收什麼樣的型別,而這樣的好處是當別人要使用你寫好的元件時,會比較清楚該傳什麼樣的東西進去,降低產生 bug 的機率。

延續昨天的 Message 元件,它會接收兩個字串型別的 prop,但假設使用這個元件的人,忘記少傳一個 prop,或是傳入數字進來,如下:

const Message = ({ color, animal }) => {
  return <div>{color} {animal}</div>
}

const element = (
  <div className='container'>
    <Message color={'Black'} />
    <Message color={3} animal={'dog'} />
  </div>
)

ReactDOM.render(element, document.getElementById('root'))

畫面看起來都非常的正常,但這不是我們所希望看到的。至少我們期望,如果別人少傳或亂傳東西到這個元件,能夠在 console 印出錯誤訊息,來讓開發的人員注意到這個問題。

接下來就讓我們來使用 propTypes 來改善我們的 Message 元件。

首先在 Message 元件上建立 propTypes 的屬性物件,而這個物件的 key 就是你要定義型別驗證的 prop,以上面的範例來說,兩個 props 都要驗證。

Message.propTypes = {
  color: PropTypes.string,
  animal: PropTypes.string
}

再來,我們的 value 要必須是一個 callback ,它會接收三個參數分別是 props、這個 prop 的名稱以及元件名稱。

const PropTypes = {
  string(props, propName, componentName) {
    const type = props[propName]
    
    if (typeof type !== 'string') {
      throw new Error(
        `The ${componentName} component needs ${propName} prop to be type of 'string', but was passed a ${type} instead`
      )
    }
  }
}

把這兩段加進去後,再去看 console 就會出現我們所寫的錯誤訊息啦!

使用 prop-types 套件

在上面的範例中我們自己寫了一個簡單的型別驗證,讓我們可以檢查傳進來的 props 是不是符合預期的型別。但其實我們可以使用這個 prop-types 套件來幫助我們做檢驗。

<html lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>

<body>
  <div id='root'></div>
  
  <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
  <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
  <script src="https://unpkg.com/@babel/standalone@7.9.3/babel.js"></script>
  <script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
  
  <script type='text/babel'>

    const Message = ({ color, animal }) => {
      return <div>{color} {animal}</div>
    }

    Message.propTypes = {
      color: PropTypes.string,
      animal: PropTypes.string
    }

    const element = (
      <div className='container'>
        <Message color={'Black'} />
        <Message color={3} animal={'dog'} />
      </div>
    )

    ReactDOM.render(element, document.getElementById('root'))
  </script>
</body>

</html>

引入 prop-types 之後,就可以把我們前面寫的 PropTypes 物件刪掉了,然後剛好我們之前的命名跟套件使用的物件一樣,所以會發現 console,依然會出現一個型別錯誤訊息,不過沒有給 animal prop 卻沒有錯誤提示。

這個時候只要在 string 後面加上 isRequired,讓它知道這個 prop 是必填

Message.propTypes = {
  color: PropTypes.string.isRequired,
  animal: PropTypes.string.isRequired
}

再看一下 console 就會出現兩個錯了

關於 prop-types 的套件使用,有興趣的人可以到它的 Github 做深入的了解,
以上就是今天的內容了,有什麼問題都歡迎在下方留言。


上一篇
Re: 新手讓網頁 act 起來: Day05 - 建立元件
下一篇
Re: 新手讓網頁 act 起來: Day07 - Form
系列文
Re: 新手讓網頁 act 起來30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Sonic
iT邦新手 5 級 ‧ 2021-12-08 09:58:09

[[color: PropTypes.string]] 句尾缺了 ","

Will iT邦新手 4 級 ‧ 2021-12-11 17:00:01 檢舉

感謝你的發現/images/emoticon/emoticon12.gif

我要留言

立即登入留言