>  Q&A  >  본문

양식을 처리하기 위한 대체 지원 드릴링(역방향, 하위에서 상위로) 방식에 대응

<p>저는 React를 처음 접했고 실습 프로젝트를 통해 이를 배우고 있습니다. 저는 현재 양식 처리 및 유효성 검사 작업을 하고 있습니다. 저는 SPA에서 React Router의 Form 구성 요소를 사용하고 있으며 양식 내부에는 레이블 입력과 오류 메시지를 렌더링하는 FormGroup 요소가 있습니다. 또한 FormGroup 구성 요소 내에서 자체 입력 구성 요소를 사용하여 양식에 사용되는 입력의 논리와 상태 관리를 분리합니다. </p> <p>그래서 샘플 로그인 페이지에 Form 구성 요소와 FormGroup 구성 요소를 다음과 같이 배치했습니다. </p> <p><em>pages/Login.js</em></p> <pre class="brush:js;toolbar:false;">'react'에서 { useState } 가져오기; import { Link, Form, useNavigate, useSubmit } from 'react-router-dom'; '../comComponents/UI/FormGroup'에서 FormGroup을 가져옵니다. '../comComponents/UI/Button'에서 버튼 가져오기; '../comComponents/UI/Card'에서 카드를 가져옵니다. import './Login.scss'; 함수 로그인페이지() { const Navigate = useNavigate(); const 제출 = useSubmit(); const [isLoginValid, setIsLoginValid] = useState(false); const [isPasswordValid, setIsPasswordValid] = useState(false); var 재설정LoginInput = null; var 재설정PasswordInput = null; isFormValid = false로 둡니다. if(isLoginValid && isPasswordValid) { isFormValid = true; } 함수 formSubmitHandler(이벤트) { event.preventDefault(); if(!isFormValid) { 반품; } 재설정로그인입력(); ResetPasswordInput(); 제출(event.currentTarget); } 함수 loginValidityChangeHandler(isValid) { setIsLoginValid(isValid); } 함수 비밀번호ValidityChangeHandler(isValid) { setIsPasswordValid(isValid); } 함수 ResetLoginInputHandler(reset) { ResetLoginInput = 재설정; } 함수 재설정PasswordInputHandler(재설정) { ResetPasswordInput = 재설정; } 함수 스위치ToSignupHandler() { 탐색('/가입'); } 반품 ( <div className="로그인"> <div className="login__logo"> 바둑컵 </div> <p className="login__description"> 바둑컵 계정에 로그인하세요 </p> <카드 테두리> <Form onSubmit={formSubmitHandler}> <양식그룹 id="로그인" label="사용자 이름 또는 이메일 주소" inputProps={{ 유형: "텍스트", 이름: "로그인", 유효성: (값) => { 값 = value.trim(); if(!값) { return [false, '사용자 이름이나 이메일 주소가 필요합니다.'] } else if(값.길이 < 3 || 값.길이 > 30) { return [false, '사용자 이름 또는 이메일 주소는 최소 3자 이상 최대 30자여야 합니다.']; } 또 다른 { return [참, null]; } }, onValidityChange: loginValidityChangeHandler, onReset: 재설정LoginInputHandler }} /> <양식그룹 id="비밀번호" label="비밀번호" sideLabelElement={ <링크="/password-reset"> 비밀번호를 잊으 셨나요? </링크> } inputProps={{ 유형: "비밀번호", 이름: "비밀번호", 유효성: (값) => { 값 = value.trim(); if(!값) { return [false, '비밀번호가 필요합니다.'] } else if(값.길이 < 4 || 값.길이 > 1024) { return [false, '비밀번호는 4자 이상, 최대 1024자여야 합니다.']; } 또 다른 { return [참, null]; } }, onValidityChange: 비밀번호 유효성 변경 핸들러, onReset: 재설정PasswordInputHandler }}/> <div className="text-center"> <버튼 클래스명="w-100" type="제출"> 로그인 </버튼> <span className="login__or"> 또는 </스팬> <버튼 클래스명="w-100" onClick={switchToSignupHandler}> 가입하기 </버튼> </div> </양식> </카드> </div> ); } 기본 로그인 페이지 내보내기; </pre> <p>위 코드에서 볼 수 있듯이 FormGroup 구성 요소를 사용하고 <code>onValidityChange</code> 및 <code>onReset</code> 속성을 전달하여 <code>isValid< /코드의 업데이트된 값> 양식 제출 등 이후 입력 내용을 재설정하는 변경 및 재설정 기능 내 사용자 정의 후크 useInput을 사용하여 입력 구성 요소에 <code>isValid</code> 및 <code>reset</code> 값이 변경되면 isValid 값을 전달하고 FormGroup 구성 요소에 정의된 props를 사용하여 입력 구성 요소에서 재설정 함수를 전달합니다. 또한 로그인 페이지에서 <code>isLoginValid</code> 및 <code>isPasswordValid</code> 상태를 사용하여 하위 입력에서 전달된 업데이트된 <code>isValid</code> 요소. 그래서 입력 컴포넌트에 상태를 정의하고 props를 사용하여 이를 부모 컴포넌트에 전달하고 그 값을 해당 부모 컴포넌트에서 생성된 다른 상태에 저장했습니다. 진행되고 있는 소품 드릴링이 조금 불편했습니다. </p> <p>상태는 입력 구성 요소 내부에서 관리되며 다음과 같은 상태를 갖습니다. </p>
P粉419164700P粉419164700437일 전556

모든 응답(2)나는 대답할 것이다

  • P粉627136450

    P粉6271364502023-09-02 15:06:02

    React의 상태 관리에는 제어된 상태와 제어되지 않은 상태라는 두 가지 주요 사고 방식이 있습니다. 제어된 양식은 반응성을 제공하기 위해 어디에서나 값에 액세스할 수 있는 React 컨텍스트를 사용하여 제어할 수 있습니다. 그러나 제어된 입력은 특히 각 입력에서 전체 양식을 업데이트할 때 성능 문제를 일으킬 수 있습니다. 통제되지 않은 형태가 등장하는 곳입니다. 이 패러다임을 사용하면 모든 상태 관리는 상태 표시를 위한 브라우저의 기본 기능을 활용해야 합니다. 이 접근 방식의 주요 문제점은 양식의 React 측면을 잃어버리고 제출 시 양식 데이터를 수동으로 수집해야 하며 이에 대한 여러 참조를 유지하는 것이 지루할 수 있다는 것입니다.

    제어된 입력은 다음과 같습니다.

    으아악

    EDIT: @Arkellys가 지적했듯이 양식 데이터를 수집하기 위해 반드시 참조가 필요한 것은 아닙니다. 다음은 FormData

    을 사용한 예입니다.

    통제 불능:

    으아악

    두 가지 접근 방식 중 하나를 사용하여 다중 구성 요소 양식을 유지하는 것은 지루하다는 것이 두 예에서 명백하므로 양식 관리를 돕기 위해 라이브러리가 자주 사용됩니다. 저는 개인적으로 React Hook Form을 철저한 테스트를 거쳐 잘 관리되고 사용하기 쉬운 양식 라이브러리로 추천합니다. 최적의 성능을 위해 제어되지 않는 형식을 취하는 동시에 반응형 렌더링을 위한 단일 입력을 볼 수 있습니다.

    Redux, React context 또는 기타 상태 관리 시스템을 사용하든 올바르게 구현한다는 가정하에 일반적으로 성능 측면에서는 차이가 없습니다. flux 아키텍처가 마음에 든다면 반드시 Redux를 사용하세요. 하지만 대부분의 경우 React 컨텍스트는 성능이 뛰어나고 충분합니다.

    귀하의 useInput 自定义挂钩看起来是解决问题 react-hook-formreact-final-form 용감하지만 잘못된 코드 시도가 해결되었습니다. 이 추상화로 인해 불필요한 복잡성과 예측할 수 없는 부작용이 발생하고 있습니다. 또한 React에서 종종 안티 패턴이 되는 mirror props를 사용합니다.

    정말로 자신만의 양식 논리를 구현하고 싶다면(교육 목적이 아닌 한 권장하지 않음) 다음 지침을 따르세요.

    1. 가장 높은 공통 조상에서 단일 진실 소스를 유지하세요
    2. 상태 미러링 및 복사를 피하세요
    3. useMemouseRef를 사용하여 가능한 한 적게 다시 렌더링하세요

    회신하다
    0
  • P粉596191963

    P粉5961919632023-09-02 11:36:55

    이것은 Redux와 같은 게시-구독 라이브러리와 구성 요소 트리를 통한 상태 전파 사이를 결정하는 데 사용하는 간단한 측면입니다.

    두 구성요소가 상위-하위 관계를 갖고 최대 두 개의 가장자리가 서로 떨어져 있는 경우 하위 상태를 상위로 전파합니다.

    부모 -> child1-level1 -> child1-level2 ------ OK

    부모 -> child1-level1 ------ 확인

    부모 -> child1-level1 -> child1-level2 -> child1-level3 --> child1-level3에서 부모로 상태를 변경하기에는 이동이 너무 많습니다

    • 대화형 구성 요소 사이의 거리가 2개 이상의 가장자리인 경우 redux를 사용하세요
    • 형제 구성 요소, 즉 상위 구성 요소를 공유하고 서로 통신해야 하는 하위 구성 요소에 redux를 사용합니다(측면 패널에서 트리 항목을 선택하고 기본 구성 요소에서 선택한 항목의 세부 정보 표시)

    구현 이후

    • useInput이 과도한 리팩토링이라고 생각합니다. 입력 구성 요소는 입력 관련 작업, 더 나은 추상 유효성 검사 등을 관리하는 데 충분해야 합니다.
    • 양식 제출 시 모든 유효성 검사를 트리거할 수 있으며, 이 경우 제어된 입력이 필요하지 않습니다(양식의 onSubmit 이벤트에 유효성 검사 추가)
    • 그러나 양식에 너무 많은 필드(예: 5개 이상)가 포함되어 있고 제출하기 전에 필드의 유효성을 검사하려는 경우 입력 필드의 onBlur 이벤트를 사용하거나 디바운스 작업(예: lodash의 디바운스 작업)과 함께 onInput을 사용할 수 있습니다. 아니면 이렇게 구현하세요

    으아악

    회신하다
    0
  • 취소회신하다