"TypeError: toggleTask is not a function" in react.js
"TypeError: toggleTask is not a function" in react.js
我在 React.js 开始了我的第一个项目,我正在按照 youtube 上的教程学习一些基础知识。我马上就解决了我的问题,但是这次我从昨天开始就什么也做不了了。
我正在显示下面的代码,有什么问题吗?为什么会出现该错误?谢谢。
这是App.js 代码:
import React, { useState, useRef, useEffect } from "react";
import Tasklist from "./Tasklist";
import { v4 as uuidv4 } from 'uuid';
const LOCAL_STORAGE_KEY = 'taskApp.tasks'
function App() {
const [tasks, setTasks] = useState ([])
const taskNameRef = useRef()
useEffect(() => {
const storedTasks = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY))
if (storedTasks) setTasks(storedTasks)
}, [])
useEffect(() => {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify (tasks))
}, [tasks])
function toggleTask(id) {
const newTasks = [...tasks]
const task = newTasks.find(task => task.id === id)
task.complete = !task.complete
setTasks()(newTasks)
}
function handleAddTask(e){
const name = taskNameRef.current.value
if (name === '') return
setTasks(prevTasks => {
return [...prevTasks, {id: uuidv4, name: name, complete: false}]
})
taskNameRef.current.value = null
}
return (
<>
<Tasklist tasks={tasks} toggleTask={toggleTask} />
<input ref={taskNameRef} type="text"/>
<button onClick={handleAddTask}>Add task</button>
<button>Clear completed</button>
<div>0 tasks left.</div>
</>
)
}
export default App;
这是 Task.js 代码,问题从这里开始:
import React from 'react'
export default function Task({ task, toggleTask }) {
function handelTaskClick() {
toggleTask(task.id)
}
return (
<div>
<label>
<input type='checkbox' checked={task.complete} onChange={handelTaskClick} ></input>
{task.name}
</label>
</div>
)
}
Tasklist.js 代码:
import React from 'react'
import Task from './Task'
export default function Tasklist({ tasks, toggleTasks }) {
return (
tasks.map(task => {
return <Task key={task.id} toggleTasks={toggleTasks} task={task} />
})
)
}
toggleTask
被传递给 TaskList
,但 TaskLists
不会解构它,而是解构 toggleTasks
prop,带有一个“s”。 TaskList
然后将 toggleTasks
传递到 Task
,在那里它( 正确地 )尝试解构 toggleTask
.
一致地命名传递的 toggleTask
prop.
<Tasklist tasks={tasks} toggleTask={toggleTask} />
...
function Tasklist ({ tasks, toggleTask }) {
return (
tasks.map(task => {
return <Task key={task.id} toggleTask={toggleTask} task={task} />
})
)
}
...
function Task ({ task, toggleTask }) {
function handelTaskClick() {
toggleTask(task.id);
}
return (
<div>
<label>
<input type='checkbox' checked={task.complete} onChange={handelTaskClick} />
{task.name}
</label>
</div>
)
}
我在 React.js 开始了我的第一个项目,我正在按照 youtube 上的教程学习一些基础知识。我马上就解决了我的问题,但是这次我从昨天开始就什么也做不了了。
我正在显示下面的代码,有什么问题吗?为什么会出现该错误?谢谢。
这是App.js 代码:
import React, { useState, useRef, useEffect } from "react";
import Tasklist from "./Tasklist";
import { v4 as uuidv4 } from 'uuid';
const LOCAL_STORAGE_KEY = 'taskApp.tasks'
function App() {
const [tasks, setTasks] = useState ([])
const taskNameRef = useRef()
useEffect(() => {
const storedTasks = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY))
if (storedTasks) setTasks(storedTasks)
}, [])
useEffect(() => {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify (tasks))
}, [tasks])
function toggleTask(id) {
const newTasks = [...tasks]
const task = newTasks.find(task => task.id === id)
task.complete = !task.complete
setTasks()(newTasks)
}
function handleAddTask(e){
const name = taskNameRef.current.value
if (name === '') return
setTasks(prevTasks => {
return [...prevTasks, {id: uuidv4, name: name, complete: false}]
})
taskNameRef.current.value = null
}
return (
<>
<Tasklist tasks={tasks} toggleTask={toggleTask} />
<input ref={taskNameRef} type="text"/>
<button onClick={handleAddTask}>Add task</button>
<button>Clear completed</button>
<div>0 tasks left.</div>
</>
)
}
export default App;
这是 Task.js 代码,问题从这里开始:
import React from 'react'
export default function Task({ task, toggleTask }) {
function handelTaskClick() {
toggleTask(task.id)
}
return (
<div>
<label>
<input type='checkbox' checked={task.complete} onChange={handelTaskClick} ></input>
{task.name}
</label>
</div>
)
}
Tasklist.js 代码:
import React from 'react'
import Task from './Task'
export default function Tasklist({ tasks, toggleTasks }) {
return (
tasks.map(task => {
return <Task key={task.id} toggleTasks={toggleTasks} task={task} />
})
)
}
toggleTask
被传递给 TaskList
,但 TaskLists
不会解构它,而是解构 toggleTasks
prop,带有一个“s”。 TaskList
然后将 toggleTasks
传递到 Task
,在那里它( 正确地 )尝试解构 toggleTask
.
一致地命名传递的 toggleTask
prop.
<Tasklist tasks={tasks} toggleTask={toggleTask} />
...
function Tasklist ({ tasks, toggleTask }) {
return (
tasks.map(task => {
return <Task key={task.id} toggleTask={toggleTask} task={task} />
})
)
}
...
function Task ({ task, toggleTask }) {
function handelTaskClick() {
toggleTask(task.id);
}
return (
<div>
<label>
<input type='checkbox' checked={task.complete} onChange={handelTaskClick} />
{task.name}
</label>
</div>
)
}