Reputation: 932
I'm getting the error "Too many re-renders..." above and I'm trying to figure out what's wrong with the code. Based on what I've seen in the Chrome console, it appears the error is in the third party libraries, not what i've written here. If I'm wrong, please let me know. Here are my dependencies: "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.2.0", "react-scripts": "4.0.3", "web-vitals": "^1.1.2"
App.js
import {useState} from 'react'
import Header from './components/Header'
import Tasks from "./components/Tasks";
const App = () => {
const [tasks, setTasks] = useState(
[
{
id: 1,
text: 'Doctor\'s appt',
day: 'Feb 5th at 2:30p',
reminder: true
},
{
id: 2,
text: 'Meeting at School',
day: 'Feb 6 at 1:30p',
reminder: true
},
{
id: 3,
text: 'Meeting at Church',
day: 'Feb 7 at 6:30p',
reminder: true
}
]
);
// Delete Task
const deleteTask = (id) => {
// console.log('delete', id)
//Takes in a function where for each task, filter the data where the task id is not
//equal the the id. This deletes tasks when the 'x' is clicked.
setTasks(tasks.filter((task) => task.id !== id))
}
//Toggle Reminder
const toggleReminder = (id) => {
setTasks(tasks.map((task) =>
task.id === id ? {...task, reminder: !task.reminder } : task
)
)
}
return(
<div className="container">
<Header />
{tasks.length >0 ? (
<Tasks tasks={tasks}
onDelete={deleteTask} onToggle={toggleReminder()} />
):(
'No Tasks to Show'
)}
</div>
)
}
export default App
Tasks.js
import Task from './Task'
const Tasks = ({tasks, onDelete, onToggle}) => {
return (
<>
{tasks.map((task) => (
<Task key={task.id} task={task}
onDelete={onDelete}
onToggle={onToggle}/>
))}
</>
)
};
export default Tasks
Task.js
import {FaTimes} from "react-icons/fa";
const Task = ({task, onDelete, onToggle}) => {
return (
<div
className={`task ${task.reminder && 'reminder'}`}
onDoubleClick={() => onToggle(task.id)}>
<h3>
{task.text}<FaTimes style={{color:'red', cursor:'pointer'}}
onClick={() => onDelete(task.id)}/>
</h3>
<p>{task.day}</p>
</div>
)
}
export default Task
Upvotes: 1
Views: 46
Reputation: 12787
Because you call toggleReminder
on render: onToggle={toggleReminder()}
. Just update like this:
onToggle={toggleReminder}
Upvotes: 3