【问题标题】:ReactJS: Uncaught TypeError: this.setState is not a functionReactJS:未捕获的 TypeError:this.setState 不是函数
【发布时间】:2023-04-09 09:43:01
【问题描述】:

在运行我的应用程序时,当尝试使用某些表单值更新状态时,会出现以下错误消息:
“未捕获的 TypeError:this.setState 不是函数”

LoginForm.onChange
src/components/forms/LoginForm.js:21
  18 | }
  19 | 
  20 | onChange = e => {
> 21 |     this.setState({
     | ^  22 |         data: { ...this.state.data, [e.target.name]: e.target.value }
  23 |     });
  24 | }

在构造函数中添加了对 onChange 的绑定(以前不存在),但这并不能解决问题。 this.onChange = this.onChange.bind(this);

我正在使用:反应:“^16.8.6”

这是组件代码:

import React from "react";
import { Form, Button } from "semantic-ui-react";
import Validator from "validator";
import InlineError from "../messages/InlineError"

class LoginForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: {
                email: "",
                password: ""
            },
            loading: false,
            errors: {}
        };
        this.onChange = this.onChange.bind(this);
    }

    onChange = e => {
        this.setState({
            data: { ...this.state.data, [e.target.name]: e.target.value }
        });
    }

    onSubmit = () => {
        const errors = this.validate(this.state.data);
        this.setState = ({ errors });
    };

    validate = (data) => {
        const errors = {};
        if (!Validator.isEmail(data.email)) errors.email = "Invalid email."
        if (!data.password) errors.password = "Cannot be blank.";

        return errors;
    };

    render() {
        const { data, errors } = this.state;
        return (
            <Form onSubmit={this.onSubmit}>
                <Form.Field>
                    <label htmlFor="email">Email</label>
                    <input
                        type="email"
                        id="email"
                        name="email"
                        placeholder="me@example.com"
                        value={data.email}
                        onChange={this.onChange}
                    />

                </Form.Field>
                {errors.email && <InlineError text={errors.email} />}
                <Form.Field>
                    <label htmlFor="password">Password</label>
                    <input
                        type="password"
                        id="password"
                        name="password"
                        placeholder="Enter your password"
                        value={data.password}
                        onChange={this.onChange}
                    />
                    {errors.password && <InlineError text={errors.password} />}

                </Form.Field>

                <Button primary>Login</Button>
            </Form>
        );
    }
}


export default LoginForm;

【问题讨论】:

  • this.onChange = this.onChange.bind(this); 你不需要这样做
  • this.setState = ({ errors }); 这会覆盖您的onSubmit 中的setState 函数。
  • 同意@EmileBergeron
  • @EmileBergeron 是对的。我想这是我这边的设计问题。谢谢,这让我很生气。我可能需要弄清楚如何处理。
  • 我还按照@DerekPollard 的建议删除了该行。非常感谢你

标签: javascript reactjs


【解决方案1】:

除了 onChange 处理程序很小之外,代码一切正常 修改你的 onChange 处理程序

onChange = e => {
  const target = e.target;
  const name = target.name;
  this.setState({
     ...this.state,
     data: {
        ...this.state.data,
        [name]: target.value
     }
  });
 };

抱歉我忽略了onSubmit应该是这样的

 onSubmit = () => {
  const errors = this.validate(this.state.data);
  this.setState({ errors });
};

这应该可以工作!

确保组件看起来像这样

import React from "react";
import { Form, Button } from "semantic-ui-react";
import Validator from "validator";
import InlineError from "../messages/InlineError";

class LoginForm extends React.Component {
   constructor(props) {
      super(props);
      this.state = {
         data: {
            email: "",
            password: ""
         },
         loading: false,
         errors: {}
      };
   }

   onChange = e => {
      const target = e.target;
      const name = target.name;
      this.setState({
         ...this.state,
         data: {
            ...this.state.data,
            [name]: target.value
         }
      });
   };

   onSubmit = () => {
      const errors = this.validate(this.state.data);
      this.setState({ errors });
   };

   validate = data => {
      const errors = {};
      if (!Validator.isEmail(data.email)) errors.email = "Invalid email.";
      if (!data.password) errors.password = "Cannot be blank.";

      return errors;
   };

   render() {
      const { data, errors } = this.state;
      return (
         <Form onSubmit={this.onSubmit}>
            <Form.Field>
               <label htmlFor="email">Email</label>
               <input
                  type="email"
                  id="email"
                  name="email"
                  placeholder="me@example.com"
                  value={data.email}
                  onChange={this.onChange}
               />
            </Form.Field>
            {errors.email && <InlineError text={errors.email} />}
            <Form.Field>
               <label htmlFor="password">Password</label>
               <input
                  type="password"
                  id="password"
                  name="password"
                  placeholder="Enter your password"
                  value={data.password}
                  onChange={this.onChange}
               />
               {errors.password && <InlineError text={errors.password} />}
            </Form.Field>

            <Button primary>Login</Button>
         </Form>
      );
   }
}

export default LoginForm;

【讨论】:

  • 仅供参考,这并不能解决问题。仍然得到同样的错误。
  • 我已在答案中添加了更新的登录组件供您参考!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2020-08-06
  • 2018-01-02
相关资源
最近更新 更多