Contents

สร้างแบบฟอร์ม Next.js ที่ทันสมัยด้วย React Hook Form และ Material UI

Material UI (MUI) เป็นไลบรารีส่วนประกอบยอดนิยมที่ใช้ระบบ Material Design ของ Google มีส่วนประกอบ UI ที่สร้างไว้ล่วงหน้ามากมายที่คุณสามารถใช้เพื่อสร้างอินเทอร์เฟซที่ใช้งานได้และสวยงาม

แม้ว่าจะมีจุดประสงค์เพื่อใช้กับ React เป็นหลัก แต่ Archetype สามารถปรับเปลี่ยนได้และอาจขยายเพื่อรวมเฟรมเวิร์กเพิ่มเติมที่เป็นส่วนหนึ่งของระบบนิเวศ React ที่กว้างขึ้น เช่น Next.js

เริ่มต้นใช้งาน React Hook Form และ Material UI

React Hook Form เป็นไลบรารียอดนิยมที่ให้วิธีง่ายๆ ในการสร้าง จัดการ และตรวจสอบแบบฟอร์ม

ด้วยการผสานรวมองค์ประกอบและสไตล์ UI ของ Material UI’s คุณสามารถสร้างแบบฟอร์มที่ดูดีใช้งานง่าย และใช้การออกแบบที่สอดคล้องกันกับแอปพลิเคชัน Next.js ของคุณ

ในการเริ่มต้น คุณสามารถตั้งค่าสภาพแวดล้อมการพัฒนาในเครื่องสำหรับแอปพลิเคชัน Next.js ของคุณโดยสร้างโปรเจ็กต์ใหม่โดยใช้เฟรมเวิร์ก Next.js เพื่อดำเนินการดังกล่าว ขอแนะนำให้คุณดาวน์โหลดและติดตั้ง Next.js เวอร์ชันล่าสุด ซึ่งจะใช้ไดเร็กทอรี"App"เป็นฐาน

 npx create-next-app@latest next-project --app 

ถัดไป ติดตั้งแพ็คเกจเหล่านี้ในโครงการของคุณ:

 npm install react-hook-form @mui/material @mui/system @emotion/react @emotion/styled 

ภาพรวมของโครงสร้างจะถูกสร้างขึ้นในที่นี้ โดยครอบคลุมความซับซ้อนและลักษณะเฉพาะของโครงสร้างดังกล่าวในลักษณะที่มีคารมคมคาย

/th/images/next-js-form.jpg

ซอร์สโค้ดของโปรเจ็กต์ดังกล่าวสามารถเข้าถึงได้ผ่านที่เก็บ GitHub ที่เกี่ยวข้อง

การสร้างและจัดรูปแบบแบบฟอร์ม

React Hook Form นำเสนอยูทิลิตี้ที่มีประโยชน์มากมาย หนึ่งในนั้นคือ hook useForm ที่แพร่หลาย

แนวทางนี้อำนวยความสะดวกในการบริหารสถานะของแบบฟอร์ม การตรวจสอบอินพุต และการส่งโดยปรับปรุงองค์ประกอบหลักของการควบคุมแบบฟอร์ม ซึ่งจะช่วยเพิ่มประสิทธิภาพโดยรวมของกระบวนการดังกล่าว

ในการพัฒนาแบบฟอร์มโดยใช้ hook นี้ คุณจะต้องสร้างไฟล์ใหม่ภายในไดเรกทอรี “src/components” และกำหนดให้เป็น “form.js”

หากต้องการรวมการขึ้นต่อกันที่จำเป็นสำหรับไลบรารี React Hook Form และ Material-UI ในโปรเจ็กต์ของคุณ คุณต้องนำเข้าไลบรารีเหล่านี้ก่อนดังนี้:

 "use client"
import React, {useState} from 'react';
import { useForm } from 'react-hook-form';
import { TextField, Button as MuiButton, Alert } from '@mui/material';
import { styled } from '@mui/system'; 

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

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

ด้านล่างการนำเข้า ให้เพิ่มโค้ดนี้:

 const FormContainer = styled('div')({
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  justifyContent: 'center',
  height: '100vh',
});

const StyledForm = styled('form')({
  width: '80%',
  maxWidth: '400px',
  padding: '20px',
  borderRadius: '10px',
  border: '2px solid #1E3A8A',
  boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.2)',
  backgroundColor: '#ffffff',
  textAlign: 'center',
});

const StyledTextField = styled(TextField)({
  marginBottom: '16px',
  width: '100%',
}); 

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

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

ตอนนี้ กำหนดองค์ประกอบการทำงาน:

 export default function Form() {
  const { register, handleSubmit, formState: { errors } } = useForm();
  
  return (
    <>
      <FormContainer>
        <StyledForm>
          <StyledTextField
            label="Username"
            type="text"/>
          <StyledTextField
            label="Password"
            type="password"/>
          <MuiButton
             type="submit"
             variant="contained"
             color="primary"
             margin="5px"
           > Submit </MuiButton>
        </StyledForm>
      </FormContainer>
    </>
  );
} 

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

 import Form from 'src/components/Form'

export default function Home() {
  return (
    <main >
      <Form/>
    </main>
  )
} 

หากต้องการเริ่มต้นกระบวนการสร้างเว็บแอปพลิเคชัน ให้เปิดใช้งานเซิร์ฟเวอร์การพัฒนา ซึ่งจะสร้างอินเทอร์เฟซที่ใช้งานง่ายซึ่งมีช่องป้อนข้อความสองช่องและปุ่มคำสั่งภายในอินเทอร์เน็ตเบราว์เซอร์ที่คุณต้องการ

การตรวจสอบแบบฟอร์มการจัดการ

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

แน่นอน! นี่คือตัวอย่างวิธีที่คุณสามารถนำไปใช้ในองค์ประกอบ LoginForm โดยใช้ React hooks และ TypeScript:typescriptimport { useState } จาก’react’;interface LoginFormProps {}const LoginForm=({}: LoginFormProps)=> {const [formStatus, setFormStatus]=useState(’’);//เตรียมข้อมูลเบื้องต้น formStatus เป็น stringconst ว่าง const handleSubmit=(event: React.FormEvent )=> {event.preventDefault();if (!validateCredentials(usernameField.value,passwordField.value)) {alert(“Invalid username or password.” );return;}setFormStatus(‘ส่งแล้ว’);//กำหนดรูปแบบ

 const [formStatus, setFormStatus] = useState({ success: false, error: '' }); 

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

 const onSubmit = (data) => {
    if (data.username === 'testuser' && data.password === 'password123') {
        setFormStatus({ success: true, error: '' });
    } else {
        setFormStatus({ success: false, error: 'Invalid username or password' });
    }
}; 

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

 onClick={handleSubmit(onSubmit)} 

ความสำคัญของตัวแปรสถานะ formStatus อยู่ที่ความสามารถในการกำหนดลักษณะในการส่งความคิดเห็นไปยังผู้ใช้ปลายทาง ในกรณีที่ผู้ใช้ให้ข้อมูลการรับรองความถูกต้องที่ถูกต้อง ผู้ใช้อาจเลือกที่จะแสดงข้อความที่แสดงถึงความสำเร็จ นอกจากนี้ หากแอปพลิเคชันมีหน้าเพิ่มเติมภายในกรอบงาน Next.js การเปลี่ยนเส้นทางไปยังหน้าอื่นจะกลายเป็นตัวเลือกที่เป็นไปได้สำหรับผู้ใช้

สิ่งสำคัญคือต้องเสนอความคิดเห็นเชิงสร้างสรรค์เมื่อข้อมูลรับรองความถูกต้องไม่ถูกต้อง โชคดีที่ Material-UI มีส่วนประกอบผลตอบรับที่ยอดเยี่ยมซึ่งสามารถใช้ร่วมกับความสามารถในการเรนเดอร์แบบมีเงื่อนไขของ React เพื่อสื่อสารสถานะของกระบวนการส่งแบบฟอร์มให้กับผู้ใช้ ขึ้นอยู่กับค่าของตัวแปร formStatus

เพื่อใช้งานฟังก์ชันนี้ ให้แทรกโค้ดดังกล่าวไว้ใต้แท็กเปิด โดยตรง

 {formStatus.success ? (
    <Alert severity="success">Form submitted successfully</Alert>
) : formStatus.error ? (
    <Alert severity="error">{formStatus.error}</Alert>
) : null} 

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

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

แน่นอนว่า นี่คือตัวอย่างวิธีรวมส่วนประกอบ “StyledTextField” ในขณะเดียวกันก็รวมข้อมูลโค้ดที่ให้มาด้วย:javascriptimport React from’react’;import { TextField } from’@material-ui/core’;const MyUsername=()=> ( ป้อนชื่อผู้ใช้ของคุณด้านล่าง ไปข้างหน้าและรวมรหัสต่อไปนี้เป็นเสาในช่องชื่อผู้ใช้ );ส่งออก MyUsername เริ่มต้น;

 {...register('username', {
    required: 'Username required',
    pattern: {
        value:/^[a-zA-Z0-9_.-]*$/,
        message: 'Invalid characters used'
    },
    minLength: {
        value: 6,
        message: 'Username must be at least 6 characters'
    },
})} 

แน่นอน! นี่คือตัวอย่างวิธีที่คุณสามารถแก้ไขโค้ดเพื่อใช้ prop ใหม่ที่เรียกว่า addedObject:jsximport React from’react’;//other imports…const PasswordStyledTextField=({ addedObject })=> {//added propconst handleTextChange=(text)=> {//เหมือนกัน//…};return (