父組件向子組件傳遞資料與PropTypes
props
父組件向子組件傳遞資料可以透過JSX傳入自訂屬性 ( props )實現, 假設我們在App組件的子組件Buttonone傳入自訂屬性p1、p2與div標籤如下 :
const App = () => {return (<Buttonone p1={{ b: 2 }} p2={{ c: 3 }}><div>我會在children裡</div></Buttonone>)}
則在Buttonone組件內可以透過接收字父組件傳入的自訂屬性,並解構賦值給props,這就是父組件向子組件傳遞資料。
const Buttonone = (props) => {console.log(props);return (<button>按鈕 </button>)}//輸出 : {p1: {…}, p2: {…}, children: Array(1)}
傳入自訂屬性解構賦值至props
props = {p1: {…}, p2: {…}, children: Array(1)}
請注意App組件內Buttonone標籤之間的div標籤會被放到props 的 children裡, 使用時只需要使用 {props.children} 就可以了。
解構賦值更明顯的例子,若將接收的參數props改為物件 {p1 ,p2, ...other} , 會發現中間也是經過解構賦值 :
const Buttonone = ({p1 ,p2, ...other}) => {console.log(p1);console.log(p2);console.log(other);return (<button>按鈕 </button>)}//輸出p1為 : { b: 2 },//輸出p2為 : { c: 3 }//輸出pother為: children: Array(2)
PropTypes
由於props可以傳入任意類型之資料,所以我們或許會需要檢查props的資料類型, 而PropTypes正好可以讓替我們檢查自父祖件傳入的props類型。
例如現在從父組件傳入的有p1、p2與children,
const App = () => {return (<Buttonone p1={{ b: 2 }} p2={{ c: 3 }}><div>我會在children裡</div></Buttonone>)}
想針對Buttonone的props做檢查, 先引入PropTypes就可以針對組件傳入的props做類型檢查, 希望它為字串則使用PropTypes.string檢查。
import PropTypes from 'prop-types';const Buttonone = (props)) => {return (<button>按鈕 </button>)}Buttonone.propTypes = {p1: PropTypes.string}
更多能使用的檢查,整理如下 :
import PropTypes from 'prop-types';MyComponent.propTypes = {// 名稱 | 類型想檢查的props名稱: PropTypes.array,想檢查的props名稱: PropTypes.bool,想檢查的props名稱: PropTypes.func,想檢查的props名稱: PropTypes.number,想檢查的props名稱: PropTypes.object,想檢查的props名稱: PropTypes.string,想檢查的props名稱: PropTypes.symbol,想檢查的props名稱: PropTypes.node,想檢查的props名稱: PropTypes.element,想檢查的props名稱: PropTypes.elementType,// 檢查是否為陣列內其中一種類型想檢查的props名稱: PropTypes.oneOfType([PropTypes.string,PropTypes.number]),// 檢查陣列是否為某種類型想檢查的props名稱: PropTypes.arrayOf(PropTypes.number),// 檢查物件其內 value 值是否為某種類型想檢查的props名稱: PropTypes.objectOf(PropTypes.number),// 檢查物件其內 "指定" value 值是否為某種類型 (color、fontSize為舉例的 Key 名)想檢查的props名稱: PropTypes.shape({color: PropTypes.string,fontSize: PropTypes.number}),// 檢查某指定類型的props是否傳入,( isRequired設定其為必傳 )想檢查的props名稱: PropTypes.func.isRequired,// 檢查某任意類型的props是否傳入,( isRequired設定其為必傳 )想檢查的props名稱: PropTypes.any.isRequired}