【问题标题】:Uncaught TypeError: Cannot read properties of undefined (reading 'length') while setting the state未捕获的类型错误:在设置状态时无法读取未定义的属性(读取“长度”)
【发布时间】:2021-11-10 16:09:51
【问题描述】:
Uncaught TypeError: Cannot read properties of undefined (reading 'length') 
Error is showing in react-dom-development.js file
[1]: https://i.stack.imgur.com/6a8tF.png
[2]: https://i.stack.imgur.com/Cn3EP.png

每当我从子组件调用父组件的方法电子邮件处理程序以设置状态时,我都会收到上述错误

父组件

const loginStates = (
    function states() {
        return {
            email: '',
            password: ''
        }
    }
)
    const LoginContainer = () => {
    const [state, setState] = useState(loginStates);

    const onChangeEmailHandler = (event) => {
        setState(prevState => {
            return { ...prevState, email: event.target.value }
        });
    }

    return (
        <div>
            <LoginComponent
                onChangeEmailHandler={onChangeEmailHandler}
            />
        </div>
    )
}

子组件

const LoginComponent = props => {
    const classes = styles();
    const { onChangeEmailHandler } = props;
    const [isSignUpPage, setIsSignUpPage] = useState(false);

    return (
        <React.Fragment>
            <TextField 
              type='text' name='email' id='email' value={state.email}
              onChange={(event) =>onChangeEmailHandler(event)}
            />
        </React.Fragment>
    )
}

【问题讨论】:

    标签: reactjs react-hooks state use-state


    【解决方案1】:

    我已经找到了这个错误的原因,它的出现是因为:

    index.js 文件中缺少

    标签,只要我用
    包装组件 它开始工作了。

    //In index.js file
    ReactDOM.render(
    <Provider store={store}>
      <React.StrictMode>
        <App />
      </React.StrictMode>
    </Provider>,
    document.getElementById('root')
    );
    

    【讨论】:

      【解决方案2】:

      我无法重现您的错误,但是我对您的代码进行了一些更改以使其正常工作,事实证明,为了在 useState 挂钩中传递一个函数,您需要传递一个返回函数的高阶函数想要的,可以查看完整说明here

      父组件

      import LoginComponent from "./child";
      import React, { useState } from "react";
      
      const loginState = function states() {
        return {
          email: "",
          password: ""
        };
      };
      
      const LoginContainer = () => {
        const [state, setState] = useState(() => loginState);
      
        const onChangeEmailHandler = (email) => {
          const cur = state();
          setState(() => () => ({ ...cur, email }));
        };
      
        return (
          <div>
            <LoginComponent
              onChangeEmailHandler={onChangeEmailHandler}
              email={state().email} // You need to pass the email here to display it on rerender.
            />
          </div>
        );
      };
      
      export default LoginContainer;
      

      子组件

      import React from "react";
      
      const LoginComponent = (props) => {
        // const classes = styles();
        const { onChangeEmailHandler } = props;
        // const [isSignUpPage, setIsSignUpPage] = useState(false);
      
        return (
          <React.Fragment>
            <input
              type="text"
              name="email"
              id="email"
              value={props.email} // recieve the email from the props passed from parent.
              onChange={(event) => onChangeEmailHandler(event.target.value)}
            />
          </React.Fragment>
        );
      };
      
      export default LoginComponent;
      

      你可以查看我的沙盒here

      【讨论】:

      • 在 const cur = state(); 处显示“TypeError: state is not a function”我尝试使用 const cur= state;但它导致我出现同样的错误,只是惊讶于它在代码沙箱中的工作方式
      • 这个错误最初出现在沙箱中,直到我传递了一个更高阶的函数而不是直接传递函数。无论如何,你已经开始工作了,恭喜。
      【解决方案3】:

      不要传入函数作为状态,传入对象...

      const initialLoginState = {
                  email: '',
                  password: ''
              }
          
          const LoginContainer = () => {
          const [state, setState] = useState(initialLoginState);
      

      【讨论】:

      • 我试过了,但同样的错误,我不确定这里出了什么问题。
      猜你喜欢
      • 2022-01-01
      • 2022-07-07
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多