微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TypeError:无法读取React js中未定义的属性“名称”

如何解决TypeError:无法读取React js中未定义的属性“名称”

我是新来的反应者。问题是当我在map函数中传递数组对象时,它引发以下错误

这里是我定义数组对象的构造函数

constructor() {
    super();
    this.state = {
      data: [
        {
          name: "",completed: false,},],checkValue: false,};
  }

现在我想知道实际的问题是来自handleChange和handleSubmit函数,因为我不知道在这里确切写些什么

handleChange = (e) => {
    e.preventDefault();

    this.setState({ name: e.target.value });
  };

  handleSubmit = (e) => {
    e.preventDefault();

    this.setState({
      data: [...this.state.data,this.state.data.name],});
    e.target.reset();
  }; 

这是我映射列表项和CheckBox删除按钮的映射功能(我只是在将输入保存到列表项的数组中时遇到麻烦,这些CheckBox和Delete按钮运行得很好)

render() {
    return (
      <Fragment>
        <h1 className="display-1 text-center" style={{ color: "#f7c6c6" }}>
          todos
        </h1>
        <form className="todo-form" onSubmit={this.handleSubmit}>
          <label className="label" onClick={this.handleCheck}>
            ^
          </label>
          <input
            autoFocus
            type="text"
            onChange={this.handleChange}
            className="new-todo shadow-lg p-3 mb-5 bg-white"
            placeholder="What needs to be done?"
          />
          <ul className="list-group">
            {this.state.data.map((data,index) => {
              return (
                <div key={"todo-" + index} className="div-list">
                  <input
                    className="check"
                    onChange={this.handleCheckChange}
                    type="checkBox"
                    style={{
                      cursor: "pointer",}}
                    defaultChecked={this.state.data.completed}
                  />
                  <li
                    className="list-group-item disabled w-50 p-3 mx-auto"
                    style={{
                      textdecoration:
                        this.state.data.completed && "line-through",}}
                  >
                    {data.name}
                  </li>
                  <button
                    onClick={() => this.handleDelete(index)}
                    type="button"
                    className="close"
                    aria-label="Close"
                  >
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
              );
            })}
          </ul>
          {this.state.data.length > 0 && (
            <display noOfTodos={this.state.data.length} />
          )}
          {this.state.checkValue && <Clear />}
        </form>
      </Fragment>

我知道上面的代码是不完整的,因为我只想知道如何在列表组中显示名称元素,而没有别的,所以只需忽略其余代码

提前谢谢!

主页组件

import React,{ Component,Fragment } from "react";
import Clear from "./clear";
import display from "./display";

class MainPage extends Component {
  constructor() {
    super();
    this.state = {
      data: [
        {
          name: "",};
  }

  handleChange = (e) => {
    e.preventDefault();

    this.setState({ name: e.target.value });
  };

  handleSubmit = (e) => {
    e.preventDefault();

    this.setState({
      data: [...this.state.data,{ name: e.target.value,completed: false }],});
    e.target.reset();
  };

  handleDelete = (index) => {
    const newList = [...this.state.data];
    newList.splice(index,1);

    this.setState({ data: newList });
  };

  handleCheck = (e) => {
    e.preventDefault();
  };

  handleCheckChange = () => {
    const { checkValue } = this.state;

    this.setState({ checkValue: !checkValue });
  };

  render() {
    return (
      <Fragment>
        <h1 className="display-1 text-center" style={{ color: "#f7c6c6" }}>
          todos
        </h1>
        <form className="todo-form" onSubmit={this.handleSubmit}>
          <label className="label" onClick={this.handleCheck}>
            ^
          </label>
          <input
            autoFocus
            type="text"
            onChange={this.handleChange}
            className="new-todo shadow-lg p-3 mb-5 bg-white"
            placeholder="What needs to be done?"
          />
          <ul className="list-group">
            {this.state.data.map((data,}}
                  >
                    {data.name}
                  </li>
                  <button
                    onClick={() => this.handleDelete(index)}
                    type="button"
                    className="close"
                    aria-label="Close"
                  >
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
              );
            })}
          </ul>
          {this.state.data.length > 0 && (
            <display noOfTodos={this.state.data.length} />
          )}
          {this.state.checkValue && <Clear />}
        </form>
      </Fragment>
    );
  }
}

export default MainPage;

显示组件

import React,{ Component } from "react";

class display extends Component {
  render() {
    return (
      <div>
        <p className="para">{this.props.noOfTodos} items left</p>
        <button type="button" className=" all btn btn-light p-1 mr-3">
          All
        </button>
        <button type="button" className=" act btn btn-light p-1 mr-3">
          Active
        </button>
        <button type="button" className=" comp btn btn-light p-1">
          Completed
        </button>
      </div>
    );
  }
}

export default display;

清除组件

import React,{ Component } from "react";

class Clear extends Component {
  render() {
    return (
      <button type="button" className="clr btn btn-light p-1">
        Clear completed
      </button>
    );
  }
}

export default Clear;

解决方法

基本上,您在做错什么是错误地访问数据数组和错误地设置状态。我已经修复了那两个部分。 您的MainPage组件代码应该是这样的...

import React,{ Component,Fragment } from "react";
import Clear from "./clear";
import Display from "./display";

class MainPage extends Component {
  constructor() {
    super();
    this.state = {
      data: [
        {
          name: "first todo",completed: false
        }
      ],checkValue: false
    };
  }

  handleChange = (e) => {
    e.preventDefault();

    this.setState({ name: e.target.value });
  };

  handleSubmit = (e) => {
    e.preventDefault();
    this.setState({
      data: [
        ...this.state.data,{
          name: this.state.name,completed: false
        }
      ]
    });
    e.target.reset();
  };

  handleDelete = (index) => {
    const newList = [...this.state.data];
    newList.splice(index,1);
    this.setState({ data: newList });
  };

  handleCheck = (e) => {
    e.preventDefault();
  };

  handleCheckChange = () => {
    const { checkValue } = this.state;

    this.setState({ checkValue: !checkValue });
  };

  render() {
    console.log(this.state.data);
    return (
      <Fragment>
        <h1 className="display-1 text-center" style={{ color: "#f7c6c6" }}>
          todos
        </h1>
        <form className="todo-form" onSubmit={this.handleSubmit}>
          <label className="label" onClick={this.handleCheck}>
            ^
          </label>
          <input
            autoFocus
            type="text"
            onChange={this.handleChange}
            className="new-todo shadow-lg p-3 mb-5 bg-white"
            placeholder="What needs to be done?"
          />
          <ul className="list-group">
            {this.state.data.map((data,index) => {
              return (
                <div key={"todo-" + index} className="div-list">
                  <input
                    className="check"
                    onChange={this.handleCheckChange}
                    type="checkbox"
                    style={{
                      cursor: "pointer"
                    }}
                    defaultChecked={this.state.data.completed}
                  />
                  <li
                    className="list-group-item disabled w-50 p-3 mx-auto"
                    style={{
                      textDecoration:
                        this.state.data.completed && "line-through"
                    }}
                  >
                    {data.name}
                  </li>
                  <button
                    onClick={() => this.handleDelete(index)}
                    type="button"
                    className="close"
                    aria-label="Close"
                  >
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
              );
            })}
          </ul>
          {this.state.data.length > 0 && (
            <Display noOfTodos={this.state.data.length} />
          )}
          {this.state.checkValue && <Clear />}
        </form>
      </Fragment>
    );
  }
}

export default MainPage;

您可以在CodeSandbox中检查它。 https://codesandbox.io/s/happy-snow-dqbbc?file=/src/MainPage.js:0-3021

,

尝试:

 data: [...this.state.data,this.state.data[0].name]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。