【发布时间】:2021-11-23 22:17:32
【问题描述】:
我对 react 和 javascript 非常陌生,但我正在尝试构建一个简单的 ToDo 应用程序。在我想从文件中读取数据并在屏幕上显示该数据之前,这并不复杂。问题是我不知道如何创建一个新的 Todo 对象以将其作为参数传递给 addTodo 函数。谢谢大家,希望你们能帮助我!!
这里放代码(请看-loadFromFile-函数,有问题的地方:
import React, { useState } from 'react';
import TodoForm from './TodoForm';
import Todo from './Todo';
import data from './data/data.json'
function TodoList() {
const [todos, setTodos] = useState([]);
const loadFromFile = data.map( ( data) => {
const newTodo = addTodo(new Todo(data.id,data.text));
return ( {newTodo} )});
const addTodo = todo => {
if (!todo.text || /^\s*$/.test(todo.text)) {
return;
}
const newTodos = [todo, ...todos];
setTodos(newTodos);
console.log(...todos);
};
const updateTodo = (todoId, newValue) => {
if (!newValue.text || /^\s*$/.test(newValue.text)) {
return;
}
setTodos(prev => prev.map(item => (item.id === todoId ? newValue : item)));
};
const removeTodo = id => {
const removedArr = [...todos].filter(todo => todo.id !== id);
setTodos(removedArr);
};
const completeTodo = id => {
let updatedTodos = todos.map(todo => {
if (todo.id === id) {
todo.isComplete = !todo.isComplete;
}
return todo;
});
setTodos(updatedTodos);
};
return (
<>
<TodoForm onSubmit={addTodo} />
{loadFromFile}
<Todo
todos={todos}
completeTodo={completeTodo}
removeTodo={removeTodo}
updateTodo={updateTodo}
/>
</>
);
}
export default TodoList;
我想创建 Todo 对象的新实例。我尝试了很多次,许多不同的形式,但仍然不起作用。我有一个来自 data.json 文件的 id 和一个文本。我想用这两个值创建 Todo 对象的实例。但是怎么做呢?
import React, { useState } from 'react';
import TodoForm from './TodoForm';
import EditIcon from '@material-ui/icons/Edit';
import DeleteIcon from '@material-ui/icons/Delete';
const Todo = ({ todos, completeTodo, removeTodo, updateTodo }) => {
const [edit, setEdit] = useState({
id: null,
value: ''
});
const submitUpdate = value => {
updateTodo(edit.id, value);
setEdit({
id: null,
value: ''
});
};
if (edit.id) {
return <TodoForm edit={edit} onSubmit={submitUpdate} />;
}
return todos.map((todo, index) => (
<div
className={todo.isComplete ? 'todo-row complete' : 'todo-row'}
key={index}
>
<p> <div key={todo.id} onClick={() => completeTodo(todo.id)}>
{todo.text}
</div>
</p>
<div className='icons'>
<DeleteIcon fontSize="small"
onClick={() => removeTodo(todo.id)}
className='delete-icon'
/>
<EditIcon
onClick={() => setEdit({ id: todo.id, value: todo.text })}
className='edit-icon'
/>
</div>
</div>
));
};
export default Todo;
import React, { useState, useEffect, useRef } from 'react';
import { Fab, IconButton } from "@material-ui/core";
import AddIcon from '@material-ui/icons/Add';
function TodoForm(props) {
const [input, setInput] = useState(props.edit ? props.edit.value : '');
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
});
const handleChange = e => {
setInput(e.target.value);
};
const handleSubmit = e => {
e.preventDefault();
props.onSubmit({
id: Math.floor(Math.random() * 10000),
text: input
});
setInput('');
};
return (
<form onSubmit={handleSubmit} className='todo-form'>
{props.edit ? (
<>
<textarea cols="10"
placeholder='Update item'
value={input}
onChange={handleChange}
name='text'
ref={inputRef}
className='todo-input edit'
/>
<button onClick={handleSubmit} className='todo-button edit'>
Save
</button>
</>
) : (
<>
<input
placeholder='Add item'
value={input}
onChange={handleChange}
name='text'
className='todo-input'
ref={inputRef}
/>
<Fab color="primary" aria-label="add">
< AddIcon onClick={handleSubmit} fontSize="small" />
</Fab>
</>
)}
</form>
);
}
export default TodoForm;
【问题讨论】:
-
该问题缺乏明确的问题陈述。不知道是什么问题。代码很庞大,无法调试。见stackoverflow.com/help/how-to-ask
-
您的
todo对象似乎是至少具有id、text、value和isComplete属性的对象。你还需要什么?TodoForm调用addTodo并传递一个 todo 对象是做什么的? -
我想创建 Todo 对象的新实例。我尝试了很多次,许多不同的形式,但仍然不起作用。我有一个来自 data.json 文件的 id 和一个文本。我想用这两个值创建 Todo 对象的实例。但是怎么做呢?
-
创建对象字面量是微不足道的,即
{ id: 123, text: 'the todo text' }。请更新您的问题以包含所有相关代码,即请包含您尝试创建和添加待办事项对象的代码。 -
刚刚用代码的最后一部分更新了我的问题。这就是我所拥有的,请告诉我如何将 data.json 文件中的值显示为一个待办事项(就像通过添加按钮添加的待办事项一样)
标签: javascript reactjs react-native react-hooks frontend