การเรียนรู้ Props และ PropTypes ใน React

เผยแพร่แล้ว: 2022-03-10
สรุปโดยย่อ ↬ Props และ PropTypes เป็นกลไกสำคัญในการส่งข้อมูลระหว่างส่วนประกอบ React และเราจะพิจารณารายละเอียดเหล่านี้อย่างละเอียดที่นี่ บทช่วยสอนนี้จะแนะนำรายละเอียดเกี่ยวกับอุปกรณ์ประกอบฉาก การส่งและการเข้าถึงอุปกรณ์ประกอบฉาก และการส่งข้อมูลไปยังส่วนประกอบใดๆ โดยใช้อุปกรณ์ประกอบฉาก อย่างไรก็ตาม การตรวจสอบข้อมูลที่เราได้รับผ่านอุปกรณ์ประกอบฉากนั้นเป็นแนวปฏิบัติที่ดีเสมอโดยใช้ PropTypes ดังนั้น คุณจะได้เรียนรู้วิธีรวม PropTypes ใน React ด้วย

props และ PropTypes ทำให้คุณสับสนหรือไม่? คุณไม่ได้โดดเดี่ยว. ฉันจะแนะนำคุณเกี่ยวกับทุกสิ่งเกี่ยวกับอุปกรณ์ประกอบฉากและ PropTypes พวกเขาสามารถทำให้ชีวิตของคุณง่ายขึ้นอย่างมากเมื่อพัฒนาแอพ React บทช่วยสอนนี้จะแนะนำรายละเอียดเกี่ยวกับอุปกรณ์ประกอบฉาก การส่งและการเข้าถึงอุปกรณ์ประกอบฉาก และการส่งข้อมูลไปยังส่วนประกอบใดๆ โดยใช้อุปกรณ์ประกอบฉาก

การสร้างแอปพลิเคชัน React เกี่ยวข้องกับการแยกส่วน UI ออกเป็นหลายองค์ประกอบ ซึ่งหมายความว่าเราจะต้องส่งข้อมูลจากองค์ประกอบหนึ่งไปยังอีกองค์ประกอบหนึ่ง อุปกรณ์ประกอบฉากเป็นกลไกสำคัญในการส่งข้อมูลระหว่างส่วนประกอบ React และเราจะพิจารณาอย่างละเอียดถี่ถ้วน บทความนี้จะไม่สมบูรณ์โดยไม่ต้องดู PropTypes เพราะจะตรวจสอบให้แน่ใจว่าส่วนประกอบใช้ประเภทข้อมูลที่ถูกต้องและส่งข้อมูลที่ถูกต้อง

แนวทางปฏิบัติที่ดีในการตรวจสอบข้อมูลที่เราได้รับเป็นอุปกรณ์ประกอบฉากโดยใช้ PropTypes ถือเป็นแนวทางปฏิบัติที่ดี คุณจะได้เรียนรู้เกี่ยวกับการรวม PropTypes ใน React การตรวจสอบการพิมพ์ด้วย PropTypes และการใช้ defaultProps ในตอนท้ายของบทช่วยสอนนี้ คุณจะเข้าใจวิธีใช้อุปกรณ์ประกอบฉากและ PropTypes อย่างมีประสิทธิภาพ สิ่งสำคัญคือคุณต้องมีความรู้พื้นฐานเกี่ยวกับวิธีการทำงานของ React อยู่แล้ว

ทำความเข้าใจอุปกรณ์ประกอบฉาก

React ช่วยให้เราส่งข้อมูลไปยังส่วนประกอบโดยใช้สิ่งที่เรียกว่าอุปกรณ์ประกอบฉาก (ย่อมาจากคุณสมบัติ) เนื่องจาก React ประกอบด้วยส่วนประกอบหลายอย่าง อุปกรณ์ประกอบฉากจึงทำให้สามารถแชร์ข้อมูลเดียวกันข้ามส่วนประกอบที่ต้องการได้ มันใช้ประโยชน์จากการไหลของข้อมูลแบบทิศทางเดียว (ส่วนประกอบ parent-to-child) อย่างไรก็ตาม ด้วยฟังก์ชันเรียกกลับ มันเป็นไปได้ที่จะส่งอุปกรณ์ประกอบฉากกลับจากลูกไปยังองค์ประกอบหลัก

ข้อมูลเหล่านี้สามารถมาในรูปแบบที่แตกต่างกัน: ตัวเลข สตริง อาร์เรย์ ฟังก์ชัน ออบเจ็กต์ ฯลฯ เราสามารถส่งอุปกรณ์ประกอบฉากไปยังองค์ประกอบใดๆ ก็ได้ เช่นเดียวกับที่เราสามารถประกาศแอตทริบิวต์ในแท็ก HTML ใดๆ ก็ได้ ดูรหัสด้านล่าง:

 <PostList posts={postsList} />

ในตัวอย่างนี้ เรากำลังส่งพร็อพที่ชื่อ posts ไปยังองค์ประกอบที่ชื่อ PostList พร็อพนี้มีมูลค่า {postsList} มาดูรายละเอียดวิธีการเข้าถึงและส่งข้อมูลกัน

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

ผ่านและเข้าถึงอุปกรณ์ประกอบฉาก

เพื่อให้บทช่วยสอนนี้น่าสนใจ ให้สร้างแอปพลิเคชันที่แสดงรายชื่อและโพสต์ของผู้ใช้ การสาธิตแอปแสดงอยู่ด้านล่าง:

ดูปากกา [ผ่านและเข้าถึงอุปกรณ์ประกอบฉาก](https://codepen.io/smashingmag/pen/MWyKQpd) โดย David Adeneye

ดู Pen Passing and Accessing Props โดย David Adeneye

แอปประกอบด้วยคอลเล็กชันของคอมโพเนนต์: คอมโพเนนต์ ของ App คอมโพเนนต์ PostList และคอมโพเนนต์ Post

รายการโพสต์จะต้องมีข้อมูลเช่น content และ name ผู้ใช้ เราสามารถสร้างข้อมูลได้ดังนี้:

 const postsList = [ { id: 1, content: "The world will be out of the pandemic soon", user: "Lola Lilly", }, { id: 2, content: "I'm really exited I'm getting married soon", user: "Rebecca Smith", }, { id: 3, content: "What is your take on this pandemic", user: "John Doe", }, { id: 4, content: "Is the world really coming to an end", user: "David Mark", }, ];

หลังจากนี้ เราจำเป็นต้องมีองค์ประกอบ App เพื่อดึงข้อมูล นี่คือโครงสร้างพื้นฐานของส่วนประกอบนั้น:

 const App = () => { return ( <div> <PostList posts={postsList} /> </div> ); };

ในที่นี้ เรากำลังส่งต่ออาร์เรย์ของโพสต์ที่เป็นพร็อพไปยัง PostList (ซึ่งเราจะสร้างขึ้นในอีกสักครู่) องค์ประกอบหลัก PostList จะเข้าถึงข้อมูลใน postsList ซึ่งจะถูกส่งต่อเป็นอุปกรณ์ประกอบการ posts ไปยังองค์ประกอบย่อย ( Post ) หากคุณยังจำได้ แอปของเราประกอบด้วยสามองค์ประกอบ ซึ่งเราจะสร้างขึ้นเมื่อเราดำเนินการต่อไป

มาสร้าง PostList กันเถอะ:

 class PostList extends React.Component { render() { return ( <React.Fragment> <h1>Latest Users Posts</h1> <ul> {this.props.posts.map((post) => { return ( <li key={post.id}> <Post {...post} /> </li> ); })} </ul> </React.Fragment> ); } }

คอมโพเนนต์ PostList จะได้รับ posts เป็นพร็อพ จากนั้นจะวนซ้ำผ่านเสา posts this.props.posts เพื่อส่งคืนแต่ละรายการที่ Post (ซึ่งเราจะสร้างแบบจำลองในภายหลัง) นอกจากนี้ โปรดสังเกตการใช้ key ในตัวอย่างด้านบน สำหรับผู้ที่เพิ่งเริ่มใช้ React คีย์คือตัวระบุที่ไม่ซ้ำกันซึ่งกำหนดให้กับแต่ละรายการในรายการของเรา ทำให้เราสามารถแยกแยะระหว่างรายการต่างๆ ในกรณีนี้ กุญแจสำคัญคือ id ของแต่ละโพสต์ ไม่มีโอกาสที่รายการสองรายการจะมี id เดียวกัน ดังนั้นจึงเป็นข้อมูลที่ดีที่จะใช้เพื่อการนี้

ในขณะเดียวกัน คุณสมบัติที่เหลือจะถูกส่งต่อเป็นอุปกรณ์ประกอบฉากไปยังองค์ประกอบ Post ( <Post {...post} /> )

มาสร้างองค์ประกอบ Post และใช้อุปกรณ์ประกอบฉากกัน:

 const Post = (props) => { return ( <div> <h2>{props.content}</h2> <h4>username: {props.user}</h4> </div> ); };

เรากำลังสร้างองค์ประกอบ Post เป็นองค์ประกอบการทำงาน แทนที่จะกำหนดเป็นองค์ประกอบคลาสเหมือนที่เราทำสำหรับองค์ประกอบ PostList ฉันทำสิ่งนี้เพื่อแสดงให้คุณเห็นถึงวิธีการเข้าถึงอุปกรณ์ประกอบฉากในองค์ประกอบการทำงาน เปรียบเทียบกับวิธีที่เราเข้าถึงอุปกรณ์ประกอบฉาก ด้วย this.props เนื่องจากเป็นองค์ประกอบที่ใช้งานได้ เราจึงสามารถเข้าถึงค่าต่างๆ ได้ โดยใช้ props

ตอนนี้เราได้เรียนรู้วิธีส่งผ่านและเข้าถึงอุปกรณ์ประกอบฉาก และวิธีส่งข้อมูลจากองค์ประกอบหนึ่งไปยังอีกองค์ประกอบหนึ่ง มาดูว่าอุปกรณ์ประกอบฉากทำงานกับฟังก์ชันอย่างไร

ผ่านฟังก์ชั่นผ่านอุปกรณ์ประกอบฉาก

ในส่วนก่อนหน้านี้ เราได้ส่งผ่านอาร์เรย์ของข้อมูลเป็นอุปกรณ์ประกอบฉากจากองค์ประกอบหนึ่งไปยังอีกองค์ประกอบหนึ่ง แต่ถ้าเราใช้ฟังก์ชันแทนล่ะ? React ช่วยให้เราส่งผ่านฟังก์ชันระหว่างส่วนประกอบต่างๆ สิ่งนี้มีประโยชน์เมื่อเราต้องการทริกเกอร์การเปลี่ยนแปลงสถานะในองค์ประกอบหลักจากองค์ประกอบย่อย อุปกรณ์ประกอบฉากควรจะไม่เปลี่ยนรูป คุณไม่ควรพยายามเปลี่ยนค่าของเสา คุณต้องทำในองค์ประกอบที่ส่งต่อซึ่งเป็นองค์ประกอบหลัก

มาสร้างแอปสาธิตอย่างง่ายที่ฟังเหตุการณ์การคลิกและเปลี่ยนสถานะของแอปกัน ในการเปลี่ยนสถานะของแอปในองค์ประกอบอื่น เราต้องส่งต่อฟังก์ชันของเราไปยังส่วนประกอบที่ต้องการเปลี่ยนสถานะ ด้วยวิธีนี้ เราจะมีฟังก์ชันในองค์ประกอบย่อยที่สามารถเปลี่ยนสถานะได้

ฟังดูซับซ้อนไปหน่อยไหม? ฉันได้สร้างแอปพลิเคชัน React อย่างง่ายที่เปลี่ยนสถานะด้วยการคลิกปุ่มและแสดงข้อมูลต้อนรับบางส่วน:

ดูปากกา [ส่งฟังก์ชันผ่านอุปกรณ์ประกอบฉากในปฏิกิริยา](https://codepen.io/smashingmag/pen/WNwrMEY) โดย David Adeneye

ดูฟังก์ชัน Pen Passing ผ่าน Props in React โดย David Adeneye

ในการสาธิตด้านบน เรามีสององค์ประกอบ หนึ่งคือองค์ประกอบของ App ซึ่งเป็นองค์ประกอบหลักที่มีสถานะของแอปและฟังก์ชันในการตั้งค่าสถานะ ChildComponent จะเป็นรายการย่อยในสถานการณ์นี้ และหน้าที่ของมันคือการแสดงข้อมูลต้อนรับเมื่อสถานะเปลี่ยนแปลง

แบ่งสิ่งนี้ออกเป็นรหัส:

 class App extends React.Component { constructor(props) { super(props); this.state = { isShow: true, }; } toggleShow = () => { this.setState((state) => ({ isShow: !state.isShow })); }; render() { return ( <div> <ChildComponent isShow={this.state.isShow} clickMe={this.toggleShow} /> </div> ); } }

ขอให้สังเกตว่าเราได้ตั้งค่าสถานะของเรา true และวิธีการเปลี่ยนสถานะจะถูกสร้างขึ้นในองค์ประกอบของ App ในฟังก์ชัน render() เราส่งสถานะของแอปเป็น prop isShow ไปยังองค์ประกอบ ChildComponent นอกจากนี้เรายังส่ง toggleShow() เป็นอุปกรณ์ประกอบฉากชื่อ clickMe

เราจะใช้สิ่งนี้ใน ChildComponent ซึ่งมีลักษณะดังนี้:

 class ChildComponent extends React.Component { clickMe = () => { this.props.clickMe(); }; render() { const greeting = "Welcome to React Props"; return ( <div style={{ textAlign: "center", marginTop: "8rem" }}> {this.props.isShow ? ( <h1 style={{ color: "green", fontSize: "4rem" }}>{greeting}</h1> ) : null} <button onClick={this.clickMe}> <h3>click Me</h3> </button> </div> ); } }

สิ่งที่สำคัญที่สุดข้างต้นคือองค์ประกอบ App ส่งผ่านฟังก์ชั่นเป็นอุปกรณ์ประกอบฉากไปยัง ChildComponent ฟังก์ชัน clickMe() ใช้สำหรับตัวจัดการการคลิกใน ChildComponent ในขณะที่ ChildComponent ไม่ทราบตรรกะของฟังก์ชัน แต่จะทริกเกอร์ฟังก์ชันเมื่อมีการคลิกปุ่มเท่านั้น สถานะจะเปลี่ยนไปเมื่อมีการเรียกใช้ฟังก์ชัน และเมื่อสถานะเปลี่ยนไปแล้ว สถานะจะถูกส่งต่อเป็นอุปกรณ์ประกอบฉากอีกครั้ง ส่วนประกอบที่ได้รับผลกระทบทั้งหมด เช่น ลูกในกรณีของเราจะแสดงผลอีกครั้ง

เราต้องส่งสถานะของแอป isShow เพื่อเป็นพร็อ ChildComponent เพราะหากไม่มี เราไม่สามารถเขียนตรรกะด้านบนเพื่อแสดง greeting เมื่อสถานะได้รับการอัปเดต

เมื่อพิจารณาถึงฟังก์ชันแล้ว มาดูการตรวจสอบความถูกต้องกัน เป็นวิธีปฏิบัติที่ดีเสมอที่จะตรวจสอบความถูกต้องของข้อมูลที่เราได้รับผ่านอุปกรณ์ประกอบฉากโดยใช้ PropTypes มาดำน้ำกันตอนนี้เลย

PropTypes ใน React คืออะไร?

PropTypes เป็นกลไกเพื่อให้แน่ใจว่าส่วนประกอบใช้ประเภทข้อมูลที่ถูกต้องและส่งข้อมูลที่ถูกต้อง และส่วนประกอบนั้นใช้อุปกรณ์ประกอบฉากที่ถูกต้อง และส่วนประกอบที่ได้รับจะได้รับอุปกรณ์ประกอบฉากที่ถูกต้อง

เราสามารถคิดได้เหมือนลูกสุนัขที่ถูกส่งไปที่ร้านขายสัตว์เลี้ยง ร้านขายสัตว์เลี้ยงไม่ต้องการหมู สิงโต กบ หรือตุ๊กแก แต่ต้องการลูกสุนัข PropTypes ช่วยให้แน่ใจว่าชนิดข้อมูลที่ถูกต้อง (ลูกสุนัข) ถูกส่งไปยังร้านขายสัตว์เลี้ยง ไม่ใช่สัตว์ชนิดอื่น

ในหัวข้อข้างต้น เราได้ทราบวิธีส่งข้อมูลไปยังส่วนประกอบโดยใช้อุปกรณ์ประกอบฉาก เราส่งอุปกรณ์ประกอบฉากโดยตรงเป็นแอตทริบิวต์ไปยังส่วนประกอบ และเรายังส่งอุปกรณ์ประกอบฉากจากภายนอกส่วนประกอบและใช้ในส่วนประกอบนั้น แต่เราไม่ได้ตรวจสอบประเภทของค่าที่เราได้รับจากส่วนประกอบของเราผ่านอุปกรณ์ประกอบฉาก หรือทุกอย่างยังคงใช้งานได้

เป็นหน้าที่ของเราทั้งหมดว่าจะตรวจสอบข้อมูลที่เราได้รับในส่วนประกอบผ่านอุปกรณ์ประกอบฉากหรือไม่ แต่ในการใช้งานที่ซับซ้อน การตรวจสอบความถูกต้องของข้อมูลนั้นเป็นแนวปฏิบัติที่ดีเสมอ

การใช้ PropTypes

ในการใช้ PropTypes เราต้องเพิ่มแพ็คเกจเป็นการพึ่งพาแอปพลิเคชันของเราผ่าน npm หรือ Yarn โดยเรียกใช้รหัสต่อไปนี้ในบรรทัดคำสั่ง สำหรับ npm:

 npm install --save prop-types

และสำหรับเส้นด้าย:

 yarn add prop-types

ในการใช้ PropTypes ก่อนอื่นเราต้องนำเข้า PropTypes จากแพ็คเกจ prop-types:

 import PropTypes from 'prop-types';

ลองใช้ ProTypes ในแอปของเราที่แสดงรายการโพสต์ของผู้ใช้ นี่คือวิธีที่เราจะใช้สำหรับองค์ประกอบ Post :

 Post.proptypes = { id: PropTypes.number, content: PropTypes.string, user: PropTypes.string }

ที่นี่ PropTypes.string และ PropTypes.number เป็นเครื่องมือตรวจสอบอุปกรณ์ประกอบฉากที่สามารถใช้เพื่อให้แน่ใจว่าอุปกรณ์ประกอบฉากที่ได้รับเป็นประเภทที่ถูกต้อง ในโค้ดด้านบนนี้ เรากำลังประกาศว่า id เป็นตัวเลข ในขณะที่ content และ user เป็นสตริง

นอกจากนี้ PropTypes ยังมีประโยชน์ในการจับบั๊ก และเราสามารถบังคับส่งอุปกรณ์ประกอบฉากโดยใช้ isRequired :

 Post.proptypes = { id: PropTypes.number.isRequired, content: PropTypes.string.isRequired, user: PropTypes.string.isRequired }

PropTypes มีตัวตรวจสอบความถูกต้องมากมาย ต่อไปนี้คือบางส่วนที่พบบ่อยที่สุด:

 Component.proptypes = { stringProp: PropTypes.string, // The prop should be a string numberProp: PropTypes.number, // The prop should be a number anyProp: PropTypes.any, // The prop can be of any data type booleanProp: PropTypes.bool, // The prop should be a function functionProp: PropTypes.func // The prop should be a function arrayProp: PropTypes.array // The prop should be an array }

มีประเภทอื่นๆ ให้เลือก ซึ่งคุณสามารถตรวจสอบได้ในเอกสารประกอบของ React]

อุปกรณ์ประกอบฉากเริ่มต้น

หากเราต้องการส่งข้อมูลเริ่มต้นบางส่วนไปยังส่วนประกอบของเราโดยใช้อุปกรณ์ประกอบฉาก React ช่วยให้เราสามารถทำเช่นนั้นกับสิ่งที่เรียกว่า defaultProps ในกรณีที่ PropTypes เป็นทางเลือก (นั่นคือ ไม่ได้ใช้ isRequired ) เราสามารถตั้งค่า defaultProps ได้ อุปกรณ์ประกอบฉากเริ่มต้นช่วยให้มั่นใจว่าอุปกรณ์ประกอบฉากมีค่าในกรณีที่ไม่มีอะไรผ่านไป นี่คือตัวอย่าง:

 Class Profile extends React.Component{ // Specifies the default values for props static defaultProps = { name: 'Stranger' }; // Renders "Welcome, Stranger": render() { return <h2> Welcome, {this.props.name}<h2> } }

ที่นี่ defaultProps จะใช้เพื่อให้แน่ใจว่า this.props.name มีค่า ในกรณีที่องค์ประกอบหลักไม่ได้ระบุ หากไม่มีการส่งชื่อไปยังคลาส Profile ก็จะมีคุณสมบัติเริ่มต้น Stranger ที่จะถอยกลับ สิ่งนี้จะป้องกันข้อผิดพลาดเมื่อไม่มีเสาส่งผ่าน ฉันแนะนำให้คุณใช้ defaultProps กับ PropType ที่เป็นตัวเลือกทุกครั้ง

บทสรุป

ฉันหวังว่าคุณจะสนุกกับการทำงานในบทช่วยสอนนี้ หวังว่ามันจะแสดงให้คุณเห็นว่า props และ propTypes มีความสำคัญต่อการสร้างแอปพลิเคชัน React อย่างไร เพราะหากไม่มีพวกมัน เราจะไม่สามารถส่งผ่านข้อมูลระหว่างส่วนประกอบเมื่อมีการโต้ตอบเกิดขึ้น พวกเขาเป็นส่วนสำคัญของสถาปัตยกรรมที่ขับเคลื่อนด้วยส่วนประกอบและการจัดการสถานะที่ React ได้รับการออกแบบมา

PropType เป็นโบนัสสำหรับการรับรองว่าส่วนประกอบใช้ประเภทข้อมูลที่ถูกต้องและส่งข้อมูลที่ถูกต้อง และส่วนประกอบนั้นใช้อุปกรณ์ประกอบฉากที่ถูกต้อง และส่วนประกอบที่ได้รับจะได้รับอุปกรณ์ประกอบฉากที่ถูกต้อง

หากคุณมีคำถามใดๆ คุณสามารถทิ้งคำถามไว้ในส่วนความคิดเห็นด้านล่าง เรายินดีที่จะตอบทุกคำถามและแก้ไขปัญหาต่างๆ กับคุณ

อ้างอิง

  • “การคิดในการตอบสนอง”, React Docs
  • “รายการและคีย์”, React Docs
  • “ Typechecking ด้วย PropTypes”, React Docs
  • “วิธีส่งต่ออุปกรณ์ประกอบฉากไปยังส่วนประกอบในการตอบสนอง”, Robin Wieruch