I'm trying to complete my first todo-app in next js 13 using typescript but whenever I try to add a task in my task list I get the error given below
Unhandled Runtime Error
TypeError: tasks.map is not a function.
I have prvided the code from page.tsx file below:
"use client"
import "./globals.css";
import { Button, Flex, ListItem, UnorderedList, Text, Input } from "@chakra-ui/react";
import { useState } from "react";
export default function Home() {
const [tasks, setTasks] = useState(["1", "2", "3"]);
const [Item, setItem] = useState("");
function removeItem(taskName){
setTasks(
tasks.filter((task) => {
return task!= taskName;
})
);
}
function AddItem(taskName){
if(Item!="" && !tasks.includes(Item));
let temp=tasks
temp.push(Item);
setTasks(Item);
setItem("");
}
return (
<Flex
justifyContent="center"
alignItems="center"
width="100%"
height="100%"
flexDirection="column"
>
<UnorderedList>
{tasks.map((task) => {
return (
<ListItem key={task.index}>
{task}
<Button
ml={10}
onClick={() => {
removeItem(task);
}}>
Remove Item
</Button>
</ListItem>
)
})}
</UnorderedList>
<Input
placeContent="item name"
value={Item}
onChange={(e) => {
setItem(e.target.value);
}}>
</Input>
<Button onClick={AddItem}>
Add Item
</Button>
</Flex>
)
}
CodePudding user response:
Update the function AddItem
to recreate the tasks
array using the spread operator instead:
function AddItem(taskName){
if(Item!="" && !tasks.includes(Item));
let temp=[...tasks]
temp.push(Item);
setTasks(Item);
setItem("");
}
CodePudding user response:
You are setting tasks
to an individual item here:
setTasks(Item);
I imagine you want temp
here instead of Item
:
setTasks(temp);
If item
is anything other than an array the map function will not be valid and throw an error.
Also, in your AddItem
function, you're mutating state and your if
statment isn't actually wrapping anything so I would just rewrite the whole thing to the following:
function AddItem(taskName) {
if (Item != '' && !tasks.includes(Item)) {
setTasks([...tasks, Item]);
setItem('');
}
}
I'm assuming you have plans for taskName
.
Hope this helps.