#reactjs
Вопрос:
Я создаю приложение для списка дел в React. Он правильно считывает поле ввода из состояния, но когда я добавил файл, который считывает всю информацию с входных данных и выводит ее в виде нового div с именем элемента задачи, он выдает ошибку — «Ошибка типа: не удается уничтожить свойство»имя «»реквизит.задача», поскольку оно не определено».
import React, {useState} from 'react';
import './App.css';
import {Container, Row, Col} from 'react-bootstrap';
import AddForm from './components/AddForm';
import TodoList from './components/TodoList';
function App() {
const [todos, addTodos] = useState([]);
const addTodoHandler = todo => addTodos([...todos, todo]);
return (
<Container fluid>
<Row>
<h1>Todo list</h1>
<Col>
<TodoList todos={todos} />
</Col>
<Col>
<AddForm addTodoHandler={addTodoHandler}/>
</Col>
</Row>
</Container>
);
}
export default App;
import React from 'react';
const TodoList = (props) => {
const {name} = props.todo;
return (
<div>
<div>{name} </div>
<button>Delete</button>
</div>
);
}
export default TodoList;
import React from "react";
import { Button } from "react-bootstrap";
class AddForm extends React.Component {
state = {
name: "",
};
add = (e) => {
e.preventDefault();
if (this.state.name === "") {
alert("Todo cannot be empty");
return;
}
this.props.addTodoHandler(this.state);
alert(this.state.name)
this.setState({ name: "" });
};
render(){
return (
<div>
<h2>Add Todo</h2>
<form onSubmit={this.add}>
<input
type="text"
name="todo"
value={this.state.name}
onChange={(e) => this.setState({ name: e.target.value })}
/>
<Button type="submit">Add</Button>
</form>
</div>
);
}
};
export default AddForm;
Комментарии:
1.
const {name} = props.todo;
не должно бытьconst {name} = props.todos;
?2. да, спасибо. Теперь это работает
Ответ №1:
Как указано в комментариях, вам нужно исправить инструкцию деструктурирования, чтобы использовать правильный prop (todos вместо todo).
Но у вас есть дополнительная проблема в том, что ваш <TodoList>
компонент не настроен для отображения списка. Вы передаете его todos
как реквизит массива <TodoList>
, но <TodoList>
используете его как отдельный объект. Вам также нужно будет это исправить. Если вы хотите, чтобы список отображался, вам нужно будет повторить его. Что-то вроде этого:
import React from 'react';
const TodoList = (props) => {
const list = props.todos || [];
return list.map(item =>
<div>
<div>{item.name} </div>
<button>Delete</button>
</div>
);
}
export default TodoList;
Обратите внимание, что это также проверяет, что props.todos не определен, и если это так, присваивает списку пустой массив, чтобы визуализация имела значение и не завершалась сбоем.