เมื่อคุณเริ่มเขียนส่วนประกอบ React ครั้งแรก คุณอาจพบข้อผิดพลาดหลายอย่างพร้อมกัน ข้อผิดพลาดสองประการคือ "ไม่สามารถอ่านคุณสมบัติ 'setState' ของ undefined" และ "this.setState ไม่ใช่ฟังก์ชัน" บทความนี้จะพิจารณาสองสามวิธีในการขจัดข้อผิดพลาดเหล่านี้
ทำไม?
ข้อผิดพลาดเหล่านี้เกิดขึ้นเนื่องจากวิธีการที่คุณใช้หรือเรียกใช้ใน React Component ของคุณไม่ถูกผูกไว้อย่างถูกต้อง นี่คือตัวอย่างโค้ดที่จะทำให้เกิดข้อผิดพลาด (ซึ่งถือว่าคุณได้ตั้งค่าส่วนประกอบ React อย่างถูกต้อง):
import React from "react"; import "./styles.css"; class App extends React.Component { constructor(props) { super(props); this.state = { input: "" }; } handleChange(e) { this.setState({[e.target.name]: e.target.value}) } render() { console.log(this.state) return ( <div className="App"> <h1>Sample React Application</h1> <input name="input" onChange={this.handleChange} value={this.state.input} type="text" placeholder="Type here..."/> <input type="submit" /> </div> ); } } export default App;
เมื่อมองแวบแรก โค้ดก็ดูดี แต่ถ้าเรามองเข้าไปใกล้ๆ เราจะเห็นว่าเมธอด handleChange ไม่ได้ผูกกับคลาสแอป ดังนั้นคีย์เวิร์ด "นี้" จะอ้างอิงถึงหน้าต่างในอินสแตนซ์นี้ มาดูให้ละเอียดยิ่งขึ้น ให้เพิ่ม console.log(นี้) ให้กับทั้งบรรทัดแรกของเมธอด handleChange และจากนั้นไปที่บรรทัดแรกของการเรนเดอร์:
handleChange(e) { console.log(this, "change") this.setState({[e.target.name]: e.target.value}) }
render() { console.log(this, "render") return ( <div className="App"> <h1>Sample React Application</h1> <input name="input" onChange={this.handleChange} value={this.state.input} type="text" placeholder="Type here..."/> <input type="submit" /> </div> ); }
หากเราดูที่คอนโซลเมื่อเราโหลดแอปพลิเคชัน เราจะเห็นว่าคำหลัก "นี้" หมายถึงแอป หากเราพยายามใช้อินพุตของเรา เราได้รับข้อผิดพลาดบนหน้าจอ แต่ถ้าเราดูที่คอนโซล เราจะเห็นว่าคีย์เวิร์ด "นี้" ที่นั่นหมายถึง Window Object ไม่ใช่ App มีสองวิธีในการแก้ไขปัญหานี้:
1. ผูกวิธีการ
ภายใน Constructor หลังจาก state object ให้ป้อนบรรทัดนี้:
this.handleChange = this.handleChange.bind(this);
บรรทัดนี้จะผูกคีย์เวิร์ด "นี้" กับเมธอด handleChange เพื่อให้สามารถอ้างถึงคอมโพเนนต์ของแอปได้อย่างชัดเจนเมื่อเรียกใช้ handleChange มิฉะนั้น เมธอดจะไม่ทราบหรือเห็นส่วนประกอบที่คุณต้องการให้ใช้งาน
2. ฟังก์ชันลูกศร ES6
ใช้ไวยากรณ์ ES6 สำหรับฟังก์ชันลูกศรขนาดใหญ่ มันผูกคีย์เวิร์ด "นี้" กับเมธอดนั้นโดยอัตโนมัติ ดังนั้นคุณจึงไม่ต้องผูกมันในตัวสร้าง:
handleChange = (e) => { this.setState({[e.target.name]: e.target.value}) }
ที่นั่นคุณมีมัน! นั่นคือวิธีที่คุณกำจัดข้อผิดพลาด "this.setState" คือ "undefined" หรือ "not a function" เมื่อใช้โครงสร้างองค์ประกอบคลาสใน React หากคุณต้องการป้องกันข้อผิดพลาดเหล่านี้ในอนาคต ให้เปลี่ยนองค์ประกอบ React ของคุณเป็นการใช้ส่วนประกอบที่ใช้งานได้กับ React Hooks แทน!
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก