⊗jsrtPmFmsII 56 of 112 menu

การทำงานกับอินพุตใน React

การทำงานกับอินพุตใน React เกิดขึ้นโดยใช้ สเตต สำหรับแต่ละอินพุตจะมีการกำหนดสเตตของตัวเอง ซึ่งมี value ของอินพุตอยู่ภายใน

เรามาดูตัวอย่างกัน สมมติว่าเรามี อินพุต:

function App() { return <div> <input /> </div>; }

สมมติว่าเรามีสเตตด้วย:

function App() { const [value, setValue] = useState('text'); return <div> <input /> </div>; }

ลองผูกสเตตของเราเข้ากับแอตทริบิวต์ value ของอินพุต:

function App() { const [value, setValue] = useState('text'); return <div> <input value={value} /> </div>; }

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

อย่างไรก็ตาม สิ่งนี้ให้ผลข้างเคียงที่น่าสนใจ: ตอนนี้เมื่อรันโค้ดในเบราว์เซอร์ ไม่อาจ เปลี่ยนข้อความในอินพุตได้! ทำไม: เพราะ เมื่อป้อนข้อความลงในอินพุต สเตต value ไม่ได้เปลี่ยนแปลง ดังนั้นข้อความ ในอินพุตก็ไม่ควรเปลี่ยนแปลง

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

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

เริ่มแรก สำหรับสิ่งนี้จำเป็นต้องติดตั้งบนอินพุต เหตุการณ์ onChange:

function App() { const [value, setValue] = useState('text'); return <div> <input value={value} onChange={handleChange} /> </div>; }

เหตุการณ์นี้ใน React มีพฤติกรรมต่างออกไป เมื่อเทียบกับ JS ล้วนๆ ใน React มัน ทำงาน ทันทีเมื่ออินพุตเปลี่ยนแปลง นั่นคือ เมื่อป้อนหรือลบอักขระ

ทีนี้มาลองเพิ่มตัวจัดการเหตุการณ์ของเรา:

function App() { const [value, setValue] = useState('text'); function handleChange() { } return <div> <input value={value} onChange={handleChange} /> </div>; }

ในตัวจัดการนี้ เราต้องอ่านข้อความปัจจุบัน ของอินพุตและตั้งค่าให้เป็นสเตตโดยใช้ ฟังก์ชัน setValue

ปัญหาคือ this ของฟังก์ชันนี้ จะไม่ชี้ไปที่อินพุตของเรา - นี่คือ ลักษณะเฉพาะของ React เพื่อให้ได้องค์ประกอบ ที่เกิดเหตุการณ์ขึ้น เราจำเป็นต้อง ใช้ event.target:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { console.log(event.target); // ลิงก์ไปยังองค์ประกอบ DOM ของอินพุต } return <div> <input value={value} onChange={handleChange} /> </div>; }

ลองแสดงข้อความปัจจุบัน ของอินพุตโดยใช้ event.target:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { console.log(event.target.value); // ข้อความปัจจุบันของอินพุต } return <div> <input value={value} onChange={handleChange} /> </div>; }

และตอนนี้ลองบันทึกข้อความของอินพุตลงในสเตตของเรา:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { setValue(event.target.value); } return <div> <input value={value} onChange={handleChange} /> </div>; }

ตอนนี้เราสามารถป้อนข้อความลงในอินพุตได้แล้ว เมื่อ นั้น สเตต value จะมี ข้อความปัจจุบันของอินพุตอยู่เสมอ

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

function App() { const [value, setValue] = useState(''); function handleChange(event) { setValue(event.target.value); } return <div> <input value={value} onChange={handleChange} /> <p>ข้อความ: {value}</p> </div>; }

เราสามารถเขียนใหม่เป็นแบบกระชับมากขึ้น ด้วยฟังก์ชันลูกศรแบบไม่ระบุชื่อ:

function App() { const [value, setValue] = useState(''); return <div> <input value={value} onChange={event => setValue(event.target.value)} /> <p>ข้อความ: {value}</p> </div>; }

ดังนั้น สำหรับการทำงานของอินพุตใดๆ เราจำเป็น ต้องมีสิ่งต่อไปนี้: สร้างสเตตสำหรับ อินพุตนี้, ผูกสเตตเข้ากับแอตทริบิวต์ value ของอินพุต, ติดตั้งเหตุการณ์ onChange บนอินพุต, ในตัวจัดการเหตุการณ์ ให้เปลี่ยนสเตตของอินพุต เป็นข้อความของมัน

จำเป็นต้องดำเนินการเหล่านี้กับทุก อินพุต นั่นคือ หากคุณมีสองอินพุต, คุณจะมีสองสเตตและสองฟังก์ชันตัวจัดการ เหตุการณ์ onChange

สร้างอินพุตสองตัว ให้ข้อความของอินพุตแรก แสดงในย่อหน้าแรก และข้อความ ของอินพุตที่สอง - ในย่อหน้าที่สอง

ไทย
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣTürkmenTürkçeЎзбекOʻzbekTiếng Việt
เราใช้คุกกี้สำหรับการทำงานของเว็บไซต์ การวิเคราะห์ และการปรับเนื้อหาให้เหมาะสมส่วนบุคคล การประมวลผลข้อมูลเกิดขึ้นตาม นโยบายความเป็นส่วนตัว.
ยอมรับทั้งหมด ปรับแต่ง ปฏิเสธ