Предотвращение пустой отправки в React

#reactjs

#reactjs

Вопрос:

Как бы я мог помешать кому-либо ничего не добавлять в мой список дел?

AppTodo.JS

 import React, { Component } from "react";
import PropTypes from "prop-types";
export class AddTodo extends Component {
  state = {
    title: ""
  };

  onSubmit = e => {
    e.preventDefault();
    if (this.state.addTodo === "") {
      alert("??");
    } else {
      this.props.addTodo(this.state.title);
      this.setState({ title: "" });
    }
  };

  onChange = e => this.setState({ title: e.target.value });

  render() {
    return (
      <form onSubmit={this.onSubmit} stlye={{ display: "flex" }}>
        <input
          type="text"
          name="title"
          style={{ flex: "10", padding: "5px" }}
          placeholder="Add Things Todo..."
          value={this.state.title}
          onChange={this.onChange}
        />
        <input
          type="submit"
          value="Submit"
          className="btn"
          style={{ flex: "1" }}
        />
      </form>
    );
  }
}

// Prop Types
AddTodo.propTypes = {
  addTodo: PropTypes.func.isRequired
};

export default AddTodo;
  

Я новичок в React, просто делаю это ради удовольствия и потратил несколько часов, пытаясь заставить условные выражения работать в методе onSumbit и даже в методе render (), но, похоже, ничего не получается.

Заранее спасибо.

Ответ №1:

У вас нет addTodo переменной в вашем состоянии, но у вас есть title переменная.

Измените this.state.addTodo === "" на this.state.title === "" , и это будет работать так, как ожидалось.

 class AddTodo extends React.Component {
  state = {
    title: ""
  };

  onSubmit = e => {
    e.preventDefault();
    if (this.state.title === "") {
      alert("??");
    } else {
      this.props.addTodo(this.state.title);
      this.setState({ title: "" });
    }
  };

  onChange = e => this.setState({ title: e.target.value });

  render() {
    return (
      <form onSubmit={this.onSubmit} stlye={{ display: "flex" }}>
        <input
          type="text"
          name="title"
          style={{ flex: "10", padding: "5px" }}
          placeholder="Add Things Todo..."
          value={this.state.title}
          onChange={this.onChange}
        />
        <input
          type="submit"
          value="Submit"
          className="btn"
          style={{ flex: "1" }}
        />
      </form>
    );
  }
}

ReactDOM.render(
  <AddTodo addTodo={todo => console.log(`Added todo: ${todo}`)} />,
  document.getElementById("root")
);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>  

Комментарии:

1. Это сработало 1, однако я хотел бы концептуально понять, почему это работает именно таким образом. Я думаю, что понимаю это, я работал над этим вчера поздно вечером и понял, что вы сказали об отсутствии этой конкретной переменной. Поскольку отправка заменит заголовок: в массиве, если вы установите title = » » ( пустая строка), он проверит, является ли строка пустой, и вернет ошибку?

2. @KingAlmond У вас была опечатка в вашем коде, addTodo не существует в вашем состоянии. При отправке формы вам вместо этого нужно проверить, является ли title пустой строкой, которая является переменной состояния, используемой для сохранения входного значения. Отправка title вернет значение в пустую строку только в том случае, title если оно отличается от пустой строки.