ให้เรตสมาชิก: 3 / 5

ดาวใช้งานดาวใช้งานดาวใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งาน
 

การเพิ่ม Lifecycle ลงใน Class

     ในหนึ่งแอพพลิเคชั่นจะมีหลาย Component โดนแยก UI ออกเป็นส่วนๆ สิ่งที่สำคัญที่สุดคือเวลาที่เกิดความเสียหายขึ้น เราจะได้แก้ไขเฉพาะที่ มีผลดีคือ แก้ไขง่าย รวดเร็ว และไม่ทำให้เกิดความเสียหายทั้งหมด 

     Lifecycle แปลเป็นไทยคือ วงเวียนชีวิต ในที่นี้หมายถึงวงเวียนชีวิตของ Method ใน Component แต่ละตัว มีวิธีการเกี่ยวกับ Lifecycle หลายแบบซึ่งเราสามารถนำไปใช้ในแต่ละช่วงเวลาของเหตูการณ์นั้นๆได้
Method ที่นำหน้าด้วย Will ถูกเรียกก่อนที่มีบางสิ่งบางอย่างเกิดขึ้นและ Method ที่นำหน้าด้วย Did ถูกเรียกหลังจากมีบางสิ่งบางอย่างเกิดขึ้น

 

ในตัวอย่างต่อไปนี้ จะอธิบายถึงการทำงานของ Lifecycle ของ Component Clock

     1.  เมื่อเราต้องการเซ็ตเวลา Clock จะแสดงผลที่ DOM ก่อน เราเรียกสิ่งนี้ว่า "mounting" ใน React

     2.  เมื่อเราต้องการลบเวลา DOM ที่ถูกสร้างขึ้นโดย Clock จะถูกลบออก เราเรียกสิ่งนี้ว่า "unmounting" ใน React

     เราสามารถประกาศ Method พิเศษบน Component ได้ เพื่อ Run โค้ดบางส่วน  Method นี้เรียกว่า "Lifecycle hook" :

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {

  }

  componentWillUnmount() {

  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

     Hook componentDidMount() จะ Run หลังจากที่ Component แสดงผลไปที่ DOM

     Example ตัวอย่างโค้ดเวลา ที่มีการ save timerID ไว้ :

componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

     การดึง timerID ออกใน componentWillUnmount() Lifecycle hook  :

componentWillUnmount() {
    clearInterval(this.timerID);
  }

     สุดท้ายนี้เราจะเรียก Method tick() ของ Component Clock แล้วทำการ setState Clock ก็จะทำการเรียก ทุกๆวินาที 

     เราจะได้โค้ดเต็มของ Component Clock ดังนี้ :

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    this.setState({
      date: new Date()
    });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

 

สรุปการทำงานของ Component Clock

  • เมื่อ Element <Clock /> เข้ามาที่ ReactDOM.render() จากนั้นจะเรียก constructor ของ Component Clock เนื่องจาก Clock ต้องการแสดงเวลาปัจจุบัน

  • จากนั้น Method render() จะทำหน้าที่เป็น Output ส่วน React จะอัพเดท DOM ให้มีค่าตรงกับ Output

  • เมื่อ Output ของ Clock ถูกส่งไปที่ DOM ตัว React จะเรียก componentDidMount() จากนั้น Clock จะขอให้ Browser ตั้งเวลาเพื่อเรียก Method trick() หนึ่งครั้งต่อวินาที

  • ถ้า Clock เคยถูกลบออกจาก DOM ตัว React จะเรียก componentWillUnmount() เพื่อทำให้ Timer หยุด

 

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

กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
ตัวอย่างการสร้าง Service odoo13 บน Ubuntu 16.04
โดย mindphp ส 12 ต.ค. 2019 1:35 am บอร์ด Linux - Web Server
0
35
ส 12 ต.ค. 2019 1:35 am โดย mindphp
MJupgrade Joomla 1.5.26 > 3.9 ขึ้น Error: Could not connect to MySQL server.
โดย เห็ด อินโมชั่น ศ 11 ต.ค. 2019 3:30 pm บอร์ด Joomla Development
3
47
ศ 11 ต.ค. 2019 5:14 pm โดย เห็ด อินโมชั่น
MJupgrade Joomla 1.5.26 > 3.9 ขึ้น Error: Could not connect to MySQL server.
โดย เห็ด อินโมชั่น ศ 11 ต.ค. 2019 4:59 pm บอร์ด ปัญหาการใช้ phpBB3, SMF, Joomla, Wordpress, CMS CRM
7
66
ส 12 ต.ค. 2019 3:35 am โดย mindphp
อยากทราบวิธีนับจำนวน id ที่ซ้ำกัน ครับ
โดย jamepiyawat ศ 11 ต.ค. 2019 5:06 pm บอร์ด SQL - Database
3
44
ศ 11 ต.ค. 2019 6:20 pm โดย jamepiyawat
การ Search ค้นหาข้อมูลของบอร์ด phpBB
โดย aninthana พฤ 10 ต.ค. 2019 6:46 pm บอร์ด Wordpress user Guide Knowledge
0
40
พฤ 10 ต.ค. 2019 6:46 pm โดย aninthana
ทำป้าย PopUp ด้วย Modal ใน Bootstrap เวอร์ชั่น 4
โดย jamepiyawat พฤ 10 ต.ค. 2019 5:20 pm บอร์ด Booststap Knowledge
0
35
พฤ 10 ต.ค. 2019 5:20 pm โดย jamepiyawat
ทำยังไงถึงจะไม่ให้แสดงเลข ID หน้า Alias ได้ครับ
โดย jamepiyawat พฤ 10 ต.ค. 2019 4:03 pm บอร์ด Joomla Development
1
30
พฤ 10 ต.ค. 2019 6:02 pm โดย tsukasaz
ทำไมผมถึงดึงข้อมูลชื่อหมวดหมู่ออกมาแสดงหน้าตั้งค่า module ไม่ได้ครับ
โดย jamepiyawat พฤ 10 ต.ค. 2019 3:47 pm บอร์ด Joomla Development
2
38
พฤ 10 ต.ค. 2019 6:36 pm โดย jamepiyawat
ตัวเลขด้านหน้าข้อความที่เราตั้ง Alias คืออะไรครับ
โดย jamepiyawat พฤ 10 ต.ค. 2019 11:36 am บอร์ด Joomla Development
5
41
พฤ 10 ต.ค. 2019 2:46 pm โดย mindphp
แก้ปัญหา Error Ignoring file '50unattended-upgrades.ucf-old' in directory บน Ubunto 16.04 ติดตั้ง apt-get
โดย mindphp พฤ 10 ต.ค. 2019 5:42 am บอร์ด Linux - Web Server
0
20
พฤ 10 ต.ค. 2019 5:42 am โดย mindphp
Q - สอบถามวิธี Upload file html ไปยัง web service โดยใช้คำสั่ง curl ใน PHP
โดย birdkritsna พ 09 ต.ค. 2019 3:42 pm บอร์ด Programming - PHP
6
104
พฤ 10 ต.ค. 2019 2:07 pm โดย birdkritsna
10 เเหล่งช๊อปปิ้งใรเชียงรายที่ต้องไปให้ได้
โดย nemo413 พ 09 ต.ค. 2019 1:04 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
34
พ 09 ต.ค. 2019 1:04 pm โดย nemo413
สอบถามครับ อยากได้ url ของลิงค์ ให้มาแสดงในช่อง ต้องทำยังไงครับ
โดย chatee supasand พ 09 ต.ค. 2019 12:22 pm บอร์ด Programming - C/C++ & java & Python
6
67
พ 09 ต.ค. 2019 1:41 pm โดย chatee supasand
Microsoft Word สามารถ แปลงไฟล์เสียง ให้เป็นข้อความได้แล้วใน Office 365
โดย chatee supasand พ 09 ต.ค. 2019 11:32 am บอร์ด Microsoft Office Knowledge & line & Etc
0
30
พ 09 ต.ค. 2019 11:32 am โดย chatee supasand
สอบถามการเขียนโค้ด กรอกข้อมูลหน้าแรก แล้วให้กดส่ง ไปยังหน้าที่สองครับผม
โดย Jakkrit Saengngoenon อ 08 ต.ค. 2019 1:40 pm บอร์ด Programming - PHP
1
55
อ 08 ต.ค. 2019 1:50 pm โดย mindphp
ขอสอบถามเกี่ยวกับ license ของ ฟอนต์ ไทยสารบรรณ (TH Sarabun PSK)
โดย Anonymous อ 08 ต.ค. 2019 8:03 am บอร์ด Programming - PHP
0
42
อ 08 ต.ค. 2019 8:03 am โดย บุคคลทั่วไป
การส่ง parameters ไปกับการ Request แบบ Get ด้วย curl
โดย mindphp จ 07 ต.ค. 2019 12:12 am บอร์ด PHP Knowledge
0
84
จ 07 ต.ค. 2019 12:12 am โดย mindphp
Q สอบถามลองเขียน php webservice ด้วย nuSoap แล้วขึ้น Error ครับ
โดย birdkritsna ส 05 ต.ค. 2019 5:37 pm บอร์ด Programming - PHP
10
182
พฤ 10 ต.ค. 2019 10:29 am โดย birdkritsna
ทำยังไงถึงปุ่มจะอยู่ระดับเดียวกันครับ
โดย jamepiyawat ส 05 ต.ค. 2019 3:08 pm บอร์ด HTML CSS
6
124
ส 05 ต.ค. 2019 4:48 pm โดย jamepiyawat
Microsoft Surface Neo อีกหนึ่งผลิตภันฑ์แท็บเล็ตหน้าจอคู่ของ Microsoft
โดย chatee supasand ส 05 ต.ค. 2019 2:33 pm บอร์ด Microsoft Office Knowledge & line & Etc
0
49
ส 05 ต.ค. 2019 2:33 pm โดย chatee supasand