有一个简单的工作,只是不这样做,但我失去了我的头脑,为什么它不工作。
这是我的完整代码
import type { NextPage } from 'next'
import React, { useState } from 'react'
import { Stack, Input, Button, ListItem, UnorderedList, Checkbox } from '@chakra-ui/react'
type Todo = {
text: string,
complete: boolean,
id: number
}
const Todo: NextPage = () => {
let id = 1
const [todo, setTodo] = useState<Todo>({ text: '', complete: false, id: 36})
const [completed, setComplete] = useState([false, false])
const [todoList, updateList] = useState<Todo[]>([
{ text: 'Master NextJS', complete: false, id: 12 },
{ text: 'Become a Software Developer', complete: false, id: 72 }
])
const handleChange = (event) => setTodo(prev => ({...prev, text: event.target.value}))
const values = todo.text
const updateCheck = (event, id) => {
updateList(todos => {
todos[todoList.findIndex(x => x.id == id)].complete = true
return todos
})
}
const addTodo = () => {
if (todo.text == ''){
alert('You need to set some text')
return
}
updateList(prev => ([...prev, todo])),
setTodo(prev => ({...prev, text: ''}))
alert("New todo set!")
}
return (
<>
<div className='rounded-md p-5 bordered border-2'>
<Input variant='filled' className="w-full" onChange={handleChange} value={todo.text} placeholder="Enter what you need to do..."/>
<p>{values}</p>
<Button colorScheme='teal' variant='outline' py={3} onClick={addTodo}>Add todo</Button>
<ul>
{todoList.map(todo => {
return (
<li>
<Checkbox key={todo.id} onChange={(e) => updateCheck(e, todo.id)} isDisabled={todo.complete}>{todo.text}</Checkbox>
</li>
)
})}
</ul>
</div>
</>
)
}
export default Todo
字符串
我正在用chakra ui创建一个todo应用程序,每当用户选中复选框时,todo应该被禁用。
Todos本身是一个对象数组(名为todoList),具有以下类型:
type Todo = {
id: number
text: string
complete: boolean
}
型
使用'useState'钩子存储在state中。我的updateList钩子的代码如下:
const updateCheck = (event, id) => {
updateList(todos => {
todos[todoList.findIndex(x => x.id == id)].complete = true
return todos
})
}
型
每当我在这个函数之后检查complete
字段的值时,它都是true。但是在选中复选框之后,它并没有禁用,只是允许我继续选中和取消选中复选框。
但是
每当我在todo输入框中输入时,代码 does 工作(如,所有选中的todos禁用)。这告诉我复选框的“取消更改”功能有问题。但每当我在该功能中放入警报时,它就会触发,并且它成功地将complete字段更改为true?
我真的很烦,我想睡一觉。谢谢你的帮助
1条答案
按热度按时间1yjd4xko1#
组件可能没有被重新渲染,因为你的状态变化返回了它传入的同一个数组。你也不应该改变数组中的对象。相反,创建一个新的。
字符串