Сервис быстрых ответов от искусственного интеллекта
Вопрос пользователя:
Ответ нейросети:
import { TodoModel } from '../models/TodoModel';
type Action = { type: 'ADD_TODO', text: string } | { type: 'DELETE_TODO', id: number };
const todoReducer = (todos: TodoModel[], action: Action): TodoModel[] => {
switch (action.type) {
case 'ADD_TODO':
return [
...todos,
{
id: Math.floor(Math.random() * 1000),
text: action.text
}
];
case 'DELETE_TODO':
return todos.filter(todo => todo.id !== action.id);
default:
return todos;
}
};
export default todoReducer;
import './styles.css'
import { TodoInput } from '../components/TodoInput/TodoInput';
import { TodoList } from '../components/TodoList/TodoList';
import { TodoModel } from '../models/TodoModel';
import { useReducer } from 'react';
import todoReducer from '../reducers/todoReducer';
const initialTodos: TodoModel[] = [
{
id: Math.floor(Math.random() * 1000),
text: 'Полить цветы'
},
{
id: Math.floor(Math.random() * 1000),
text: 'Погулять с собакой'
},
{
id: Math.floor(Math.random() * 1000),
text: 'Прочитать книгу'
}
]
export const App = () => {
const [todos, dispatch] = useReducer(todoReducer, initialTodos);
return (
<div className='container'>
<div className='inner'>
<TodoInput dispatch={dispatch} />
<TodoList todos={todos} dispatch={dispatch} />
</div>
</div>
)
}
import './styles.css'
import { TodoModel } from '../../models/TodoModel';
import { ChangeEvent, FormEvent, useState } from 'react';
interface TodoInputProps {
dispatch: React.Dispatch<{ type: 'ADD_TODO', text: string }>;
}
export const TodoInput = ({ dispatch }: TodoInputProps) => {
const [todoText, setTodoText] = useState<string>('');
const onInputChange = (e: ChangeEvent<HTMLInputElement>) => {
setTodoText(e.target.value);
};
const onAddTodo = (e: FormEvent) => {
e.preventDefault()
if (todoText !== '') {
dispatch({ type: 'ADD_TODO', text: todoText });
setTodoText('');
}
}
return (
<form onSubmit={onAddTodo} className='todo-form'>
<input
type='text'
className='todo-input'
placeholder='Введите todo...'
onChange={onInputChange}
value={todoText}
/>
<button type='submit' className='todo-submit-button'>
Добавить
</button>
</form>
)
}
import { TodoModel } from '../../models/TodoModel';
import { TodoItem } from '../TodoItem/TodoItem';
import './styles.css';
interface TodoListProps {
todos: TodoModel[],
dispatch: React.Dispatch<{ type: 'ADD_TODO', text: string } | { type: 'DELETE_TODO', id: number }>;
}
export const TodoList = ({ todos, dispatch }: TodoListProps) => {
return (
<ul className='list'>
{todos.map((todo: TodoModel) =>
<TodoItem
key={todo.id}
todo={todo}
dispatch={dispatch}
/>
)}
</ul>
)
}
import { TodoModel } from '../../models/TodoModel';
interface TodoItemProps {
todo: TodoModel,
dispatch: React.Dispatch<{ type: 'ADD_TODO', text: string } | { type: 'DELETE_TODO', id: number }>;
}
export const TodoItem = ({ todo, dispatch }: TodoItemProps) => {
const { id, text } = todo;
const onDeleteTodo = () => {
dispatch({ type: 'DELETE_TODO', id: id });
}
return (
<li className='todo-item'>
<div>
{text}
</div>
<button className='todo-delete-button' onClick={onDeleteTodo}>
удалить
</button>
</li>
)
}
Теперь логика работы с состоянием todos вынесена в редьюсер todoReducer, а компоненты используют хук useReducer для управления состоянием.
Напишите нам, если в вопросе есть ваши персональные данные (yasnoponyatno24@yandex.ru)
Обратите внимание: ответы, предоставляемые искусственным интеллектом, могут не всегда быть точными. Не рассчитывайте на них в критически важных областях, таких как медицина, юриспруденция, финансы или в вопросах, связанных с безопасностью. Для важных решений всегда обращайтесь к квалифицированным специалистам. Администрация сайта не несет ответственности за контент, сгенерированный автоматически.