Реагируйте на визуализацию [объект объекта] при использовании useReducer вместо JSX

#javascript #reactjs #react-hooks #use-reducer

Вопрос:

Итак, сегодня я изучал свой курс React на Udemy и наткнулся на ошибку, при которой приложение react отображает [object Object] вместо JSX (которое должно быть пустым полем ввода), кроме того, поскольку поле ввода имеет метод onChange, входное значение также не может измениться. Вот изображение приложения, а также код, приведенный ниже:-

введите описание изображения здесь

  import React, { useState, useEffect, useReducer } from "react";  import Card from "../UI/Card/Card"; import classes from "./Login.module.css"; import Button from "../UI/Button/Button";  const emailReducer = (state, action) =gt; {  if(action.type === 'USER_INPUT'){  return {value: action.value, isValid: action.value.includes('@')};  }  if(action.type === 'INPUT_BLUR'){  return {value: state.value, isValid: state.value.includes('@')};  }  return { value: '', isValid: false }; };  const Login = (props) =gt; {  // const [enteredEmail, setEnteredEmail] = useState("");  // const [emailIsValid, setEmailIsValid] = useState();  const [enteredPassword, setEnteredPassword] = useState("");  const [passwordIsValid, setPasswordIsValid] = useState();  const [formIsValid, setFormIsValid] = useState(false);   const [emailState, dispatchEmail] = useReducer(emailReducer, {  value: '',  isValid: false  });   useEffect(() =gt; {  console.log("EFFECT RUNNING");   return () =gt; {  console.log("EFFECT CLEANUP");  };  }, []);   const emailChangeHandler = (event) =gt; {  dispatchEmail({type: 'USER_INPUT', value: event.target.value});   setFormIsValid(  emailState.isValid amp;amp; enteredPassword.trim().length gt; 6  );  };   const passwordChangeHandler = (event) =gt; {  setEnteredPassword(event.target.value);   setFormIsValid(  emailState.isValid amp;amp; event.target.value.trim().length gt; 6  );  };   const validateEmailHandler = () =gt; {  dispatchEmail({type: 'INPUT_BLUR'});  };   const validatePasswordHandler = () =gt; {  setPasswordIsValid(enteredPassword.trim().length gt; 6);  };   const submitHandler = (event) =gt; {  event.preventDefault();  props.onLogin(emailState.value, enteredPassword);  };   return (  lt;Card className={classes.login}gt;  lt;form onSubmit={submitHandler}gt;  lt;div  className={`${classes.control} ${  emailState.isValid === false ? classes.invalid : ""  }`}  gt;  lt;label htmlFor="email"gt;E-Maillt;/labelgt;  lt;input  id="email"  value={emailState}  onChange={emailChangeHandler}  onBlur={validateEmailHandler}  /gt;  lt;/divgt;  lt;div  className={`${classes.control} ${  passwordIsValid === false ? classes.invalid : ""  }`}  gt;  lt;label htmlFor="password"gt;Passwordlt;/labelgt;  lt;input  type="password"  id="password"  value={enteredPassword}  onChange={passwordChangeHandler}  onBlur={validatePasswordHandler}  /gt;  lt;/divgt;  lt;div className={classes.actions}gt;  lt;Button type="submit" className={classes.btn} disabled={!formIsValid}gt;  Login  lt;/Buttongt;  lt;/divgt;  lt;/formgt;  lt;/Cardgt;  ); };  export default Login;    

Ответ №1:

Ваш emailState объект имеет следующую форму:

 { value: string, isValid: boolean }  

Поэтому в поле ввода вам нужно использовать value атрибут:

 lt;input  id="email"  value={emailState.value}  onChange={emailChangeHandler}  onBlur={validateEmailHandler}  /gt;  

Ответ №2:

Вы передаете весь emailState объект на вход, когда вам, вероятно, нужно вложенное value свойство. Вы можете перейти emailState.value к value реквизиту ввода или заранее разрушить состояние и передать value напрямую.

 const [{ isValid, value }, dispatchEmail] = useReducer(emailReducer, {  value: '',  isValid: false });  ...  lt;input  id="email"  value={value}  onChange={emailChangeHandler}  onBlur={validateEmailHandler} /gt;