Приложение React Todo Я получаю ошибку при преобразовании компонентов класса в функциональные компоненты

#javascript #reactjs

#javascript #reactjs

Вопрос:

Прежде всего, заранее благодарю вас за помощь. При создании приложения Todo я выполнял операции добавления и удаления в функциональные компоненты, но я не мог создавать другие компоненты. Я был бы рад, если бы вы могли помочь.

TodoItem.js : (Я много пробовал, но не смог сделать его функциональным из-за ошибок.)

 class TodoItem extends Component {
  render() {
    const { id, title } = this.props.todo // I did not understand here what it does.

    return (
      <div>
        <p>
          <input
            type="checkbox"
            onChange={this.props.markComplete.bind(this, id)} // and here too
          />
          {""} {title}{" "}
          <button onClick={this.props.deleteTodo.bind(this, id)}>X </button>{" "}
        </p>{" "}
      </div>
    )
  }
}
  

Addtodo.js : (Я преобразовал его в функциональный, но в нем нет списка входных данных, которые я написал.)

 const Addtodo = () => {
  const [title, setTitle] = useState("")

  const onSubmit = (e) => {  // I made a mistake here, I don't know why there is a problem.
    e.preventDefault()
    setTitle("")
  }

  const onChange = (e) => setTitle(e.target.value)

  return (
    <form onSubmit={onSubmit}>
      <input
        type="text"
        onChange={onChange}
        value={title}
        placeholder="Add todo"
      />
      <input type="Submit" value="Submit" className="btn" />
    </form>
  )
}
  

App.js компонент: (Я смог сделать их функциональными. Я был бы рад, если вы сможете это проверить.)

 const App = () => {
  const [todos, setTodos] = useState([])

  useEffect(() => {
    axios
      .get("https://jsonplaceholder.typicode.com/todos")
      .then((res) => setTodos(res.data))
  }, [])

  const markComplete = (id) => {
    setTodos(
      todos.map((todo) => {
        if (todo.id === id) {
          todo.completed = !todo.completed
        }
        return todo
      })
    )
  }

  const deleteTodo = (id) => {
    axios
      .delete(`https://jsonplaceholder.typicode.com/todos/${id}`)
      .then((res) => setTodos([...todos.filter((todo) => todo.id !== id)]))
  }

  // Add Todo
  const Addtodo = (title) => {
    axios
      .post("https://jsonplaceholder.typicode.com/todos", {
        title,
        completed: false
      })
      .then((res) => setTodos([...todos, res.data]))
  }

  return (
    <div className="App">
      <div className="container"> 
        <Header />
        <AddTodo Addtodo={Addtodo} /> // I think I made a mistake here with the props.
        <Todo
          todos={todos}
          markComplete={markComplete}
          deleteTodo={deleteTodo}
        />{" "}
      </div>{" "}
    </div>
  )
}
  

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

1. Пожалуйста, опубликуйте ошибки, которые вы получаете

2. Возможно, вы могли бы увидеть этот пример приложения stackblitz.com/edit/react-upf3dz?file=src/TodoItem.js

Ответ №1:

Существует несоответствие между вашим определением компонента addTodo и последующим добавлением вашего компонента addTodo в DOM. В Addtodo.js , у вас есть сигнатура функции в виде:

 const Addtodo = () => {
  

Поэтому компонент Addtodo не ожидает, что в него будут переданы какие-либо реквизиты.

В App.js , вы пытаетесь добавить компонент в DOM с помощью:

 <AddTodo Addtodo={Addtodo} />
  

Итак, вы просите, чтобы компонент отображался с помощью prop с именем Addtodo, но, как указано ранее, в определении компонента он не ожидает получения каких-либо реквизитов.

Вам нужно решить, хотите ли вы / нужен компонент addTodo для получения реквизита.

Если вы хотите, чтобы он получал реквизит addTodo, вы можете изменить определение функции на:

 const Addtodo = ({ AddTodo }) => {
  

Кроме того, убедитесь, что при экспорте компонента Addtodo вы экспортируете его как экспорт по умолчанию, поскольку оболочка в настоящее время несовместима в вашем коде (определена как Addtodo, но пыталась отобразить как addTodo в App.js ). Однако, если это экспорт по умолчанию, это не имеет большого значения. Убедитесь, что ваш оператор импорта для addTodo такой же, как и при визуализации addTodo.

Чтобы быть явным, убедитесь, что у вас есть export default Addtodo в Addtodo.js Убедитесь, что оператор импорта для компонента add todo является тем же самым. Итак, если верхняя часть App.js говорит import AddTodo from './Addtodo' , что затем, когда вы визуализируете компонент позже в файле, это делается <AddTodo /> следующим образом . И если импорт был import Addtodo from './Addtodo' , то компонент отображается как <Addtodo> (оболочка должна быть согласованной)

Я прошу прощения, если это было не самое ясное объяснение, я не уверен, каковы фактические термины для некоторых вещей, на которые я ссылался, но я надеюсь, вы поняли, что я пытался сказать.

Ответ №2:

Вы можете удалить функцию onSubmit из элемента формы и использовать ее с помощью onClick в элементе button . Попробуйте. Я думаю, что это сработает.