องค์ประกอบและการสืบทอด

     React มี Component ที่มีประสิทธิภาพ และเราจะแนะนำให้ใช้องค์ประกอบแทนการสืบทอด เพื่อนำโค้ดมาใช้ซ้ำระหว่าง Component ในส่วนนี้เราจะพิจารณาปัญหาสัก 2-3 ข้อที่นักพัฒนาซอฟต์แวร์ใหม่ ๆ ไปทำปฏิกิริยามักเข้าถึงเพื่อสร้างการสืบทอดและแสดงวิธีแก้ปัญหาเหล่านี้ด้วย Component

 

Containment

     Component บางตัวไม่รู้จักลูกๆ ก่อนเวลาอันควร นี่เป็นเรื่องธรรมดาสำหรับ Compinent เช่น Sidebar หรือ Dialog ซึ่งแสดงถึง "boxes" ทั่วไป เราขอแนะนำให้ใช้ Component นี้ ในการใช้ children พิเศษในการส่งผ่าน Elements ของ children ไปสู่ output โดยตรง :

function FancyBorder(props) {
  return (
    <div className={'FancyBorder FancyBorder-' + props.color}>
      {props.children}
    </div>
  );
}

     ซึ่งจะทำให้ Component อื่นๆส่งผ่านให้ children เข้าไปได้โดยพละการ :

function WelcomeDialog() {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        Welcome
      </h1>
      <p className="Dialog-message">
        Thank you for visiting our spacecraft!
      </p>
    </FancyBorder>
  );
}

     ผลลัพธ์ที่ได้ :

Exam1

Exam1

     จากโค้ดด้สนบน อะไรก็ตามที่อยู่ภายในแท็ก <FancyBorder> จะได้รับการส่งผ่านไปยัง Component FancyBorder ในรูปแบบของ children เนื่องจาก FancyBorder แสดงผล {props.children} ภายใน <div> Element ที่ส่งผ่านจะปรากฏใน output สุดท้าย

     ถึงแม้ว่าจะเป็นเรื่องที่พบได้บ่อยครั้ง แต่บางครั้งเราอาจต้องสร้าง "Holes" หลายชุดใน Component  

     Example :

function SplitPane(props) {
  return (
    <div className="SplitPane">
      <div className="SplitPane-left">
        {props.left}
      </div>
      <div className="SplitPane-right">
        {props.right}
      </div>
    </div>
  );
}

function App() {
  return (
    <SplitPane
      left={
        <Contacts />
      }
      right={
        <Chat />
      } />
  );
}

     ผลลัพท์ที่ได้ :

Exam2

Exam2

     จากตัวอย่างข้างบนนี้ React Element เช่น <Contacts /> และ <Chat /> เป็นเพียง object  เท่านั้น ดังนั้นเราจะสามารถส่งผ่านข้อมูลเหล่านี้เป็น props ต่างๆเช่นข้อมูลอื่น ๆ

 

Specialization

     บางครั้งเราคิดว่า Component เป็น "special cases" ของ Component อื่น ๆ ตัวอย่างเช่นเราอาจกล่าวได้ว่า WelcomeDialog เป็นเคสพิเศษของ Dialog     ใน React นี้เราสามารถทำได้โดย Component ซึ่งส่วนประกอบ "specific" ที่เฉพาะเจาะจง จะแสดงผลเป็น "generic" ขึ้นมาและกำหนดค่าโดยใช้ props :

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
    </FancyBorder>
  );
}

function WelcomeDialog() {
  return (
    <Dialog
      title="Welcome"
      message="Thank you for visiting our spacecraft!" />
  );
}

     ผลลัพธ์ที่ได้ :

exam3

exam3

     องค์ประกอบทำงานอย่างเท่าเทียมกันดี สำหรับ Component ที่กำหนดเป็น class :

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
      {props.children}
    </FancyBorder>
  );
}

class SignUpDialog extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.handleSignUp = this.handleSignUp.bind(this);
    this.state = {login: ''};
  }

  render() {
    return (
      <Dialog title="Mars Exploration Program"
              message="How should we refer to you?">
        <input value={this.state.login}
               onChange={this.handleChange} />
        <button onClick={this.handleSignUp}>
          Sign Me Up!
        </button>
      </Dialog>
    );
  }

  handleChange(e) {
    this.setState({login: e.target.value});
  }

  handleSignUp() {
    alert(`Welcome aboard, ${this.state.login}!`);
  }
}

        ผลลัพธ์ที่ได้ คือ เมื่อเรากรอกชื่อลงไป แล้วกด Signin จากนั้น Alert Dialog จะขึ้นมาแล้วแล้วทักทายเรา :

Exam4

Exam4

Exam5

Exam5

 

แล้วสิ่งที่สืบทอดคืออะไร

     Facebook ใช้ React ในหลายพัน Component และยังไม่พบกรณีการใช้งานใด ๆ ที่จะแนะนำให้สร้างลำดับชั้นของส่วนรับมรดก Component 

 

 

ข้อมูลอ้างอิง : https://reactjs.org

กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
ขอความช่วยเหลือการเขียนโปรแกรมภาษาC หน่อยคะ
โดย puppomome ศ 11 ก.พ. 2011 3:07 pm บอร์ด Programming - C/C++ & java & Python
1
1628
อ 20 ก.พ. 2011 2:18 am โดย touleg View Topic ขอความช่วยเหลือการเขียนโปรแกรมภาษาC หน่อยคะ
อยากแก้ date format เป็น ddmmyy ในphpmyadminคับ
โดย rukturna ศ 11 ก.พ. 2011 11:50 am บอร์ด Programming - PHP
5
5187
อ 15 ก.พ. 2011 11:39 pm โดย imsn View Topic อยากแก้ date format เป็น ddmmyy ในphpmyadminคับ
เช็ค user ไม่ให้ซ้ำ ในฐานข้อมูล ไม่ผ่านครับ ช่วยทีครับ
โดย ManGal49 พฤ 10 ก.พ. 2011 8:23 pm บอร์ด SQL - Database
11
17255
อ 08 มี.ค. 2011 4:07 pm โดย yaizenx View Topic เช็ค user ไม่ให้ซ้ำ ในฐานข้อมูล ไม่ผ่านครับ ช่วยทีครับ
Deprecated: Assigning the return value of new by refereสอบถามเรื่อง ภาษาPHP ครับ
โดย BebyTemple พฤ 10 ก.พ. 2011 7:57 pm บอร์ด Programming - PHP
1
1786
ศ 11 ก.พ. 2011 12:12 pm โดย mindphp View Topic Deprecated: Assigning the return value of new by refereสอบถามเรื่อง ภาษาPHP ครับ
ช่วยแนะนำทีครับลง appserv-win32-2.5.10 แล้วไม่แสดงภาษาไทย
โดย Anonymous พฤ 10 ก.พ. 2011 8:17 am บอร์ด Programming - PHP
7
3964
อ 15 ก.พ. 2011 11:41 pm โดย imsn View Topic ช่วยแนะนำทีครับลง appserv-win32-2.5.10 แล้วไม่แสดงภาษาไทย
รายการสินค้า รบกวนดูให้ด้วย
โดย pichy พ 09 ก.พ. 2011 11:45 pm บอร์ด Programming - PHP
1
810
พฤ 10 ก.พ. 2011 1:21 am โดย mindphp View Topic รายการสินค้า รบกวนดูให้ด้วย
ผมเข้า phpmyadmin ไม่ได้
โดย BebyTemple อ 08 ก.พ. 2011 7:35 pm บอร์ด Programming - PHP
4
1313
พ 09 ก.พ. 2011 11:38 pm โดย mindphp View Topic ผมเข้า  phpmyadmin ไม่ได้
รบกวนพี่ๆ หน่อยน่ะครับ (sql)
โดย natt_hacker105 จ 07 ก.พ. 2011 3:38 pm บอร์ด SQL - Database
1
2753
อ 08 ก.พ. 2011 7:53 am โดย mindphp View Topic รบกวนพี่ๆ หน่อยน่ะครับ  (sql)