未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)

Posted

技术标签:

【中文标题】未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)【英文标题】:Unhandled Rejection (TypeError): Cannot read properties of undefined (reading 'value') when working with useRef in React 【发布时间】:2021-11-22 09:25:16 【问题描述】:
import React from "react";
import  useRef  from "react";
import AuthButton from "../components/AuthButton";
import AuthContainer from "../components/AuthContainer";
import AuthInput from "../components/AuthInput";
import  signup  from "../firebase"

function Signup() 
  const emailRef = useRef();
  const passwordRef = useRef();
  const passwordConfirmRef = useRef();

  async function handleSignup() 
    await signup(emailRef.current.value, passwordRef.current.value);
  

  return (
    <AuthContainer>
      <AuthInput ref=emailRef placeholder="  email" />
      <AuthInput ref=passwordRef type="password" placeholder="  password" />
      <AuthInput ref=passwordConfirmRef type="password" placeholder="  confirm password" />
      <div className="flex justify-center text-lg text-gray-500 pt-2 pb-5">
        /* <AuthButton text="sign up" /> */
          <button onClick=handleSignup>
        
          <div className="p-1 rounded-full bg-gray-200 hover:bg-gray-300 bg-opacity-50 text-center h-8 w-20">
            sign up
          </div>
        
    </button>
      </div>
    </AuthContainer>
  );


export default Signup;

以上是 Web 应用程序注册页面的组件,我正在关注此视频,使用 refs 和 firebase 使用按钮来更新数据库:https://www.youtube.com/watch?v=_Kv965pA-j8

但是,每当我单击该按钮时,都会出现以下错误: 未处理的拒绝(TypeError):无法读取未定义的属性(读取“值”)

handleSignup
  11 |  const passwordConfirmRef = useRef();
  12 | 
  13 |  async function handleSignup() 
> 14 |    await signup(emailRef.current.value, passwordRef.current.value);
     | ^  15 |  
  16 | 
  17 |  return (
View compiled
▶ 19 stack frames were collapsed.

我该如何解决这个问题?我最初的计划有一个单独的按钮组件,但那不起作用,所以现在我只是想让所有东西都在同一个组件中工作。

验证输入代码:

import React from 'react'
import  useRef  from "react";

const AuthInput = (props) => 
    return (
        <div className='pt-2 pb-2 px-20 mx-auto my-auto'>
            <input
                className="rounded-lg focus:outline-none text-lg placeholder-gray-500"
                type=props.type
                ref = props.ref
                placeholder=props.placeholder
                // later figure out how to automatically indent the placeholder text and the inputted text
            />
            
        </div>
    )


export default AuthInput

【问题讨论】:

Refs 必须只设置为 DOM 元素,但您将其设置为 AuthInput 组件道具。分享AuthInput代码 @VitaliyRayets 我编辑了问题以包含 AuthInput 代码! 【参考方案1】:

如果您想将父引用扔给子组件,您必须在子组件中使用forwardRef。 Docs

正确的AuthInput 组件示例:

import  forwardRef  from "react";
const AuthInput = forwardRef(( ...otherProps , ref) => 
  return (
    <div className="pt-2 pb-2 px-20 mx-auto my-auto">
      <input
        className="rounded-lg focus:outline-none text-lg placeholder-gray-500"
        type=otherProps.type
        ref=ref
        placeholder=otherProps.placeholder
        // later figure out how to automatically indent the placeholder text and the inputted text
      />
    </div>
  );
);

export default AuthInput;

【讨论】:

谢谢,这解决了我的问题!!我可以问一下 ... 在 otherProps 之前做了什么吗? Rest parameter ... 语法允许函数接受不定数量的参数作为数组

以上是关于未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)的主要内容,如果未能解决你的问题,请参考以下文章

未处理的承诺拒绝:TypeError:网络请求在expo react native 中失败

react-native 错误:[未处理的承诺拒绝:错误:获取 Expo 令牌时遇到错误:TypeError:网络请求失败。]

未处理的承诺拒绝:TypeError:网络请求失败 - 在 React Native / Expo 中将 Base64(视频/mp4)转换为 Blob

未处理的拒绝(TypeError):api.getUser 不是函数

未处理的拒绝(TypeError):无法读取未定义的属性“映射”? (反应火力基地)

Axios 承诺处理 - 在 react-native 中获取“可能的未处理承诺拒绝 - 类型错误:网络请求失败”