reactjs 使用useState钩子从数组中的对象更新State

olmpazwi  于 12个月前  发布在  React
关注(0)|答案(1)|浏览(117)

有一个简单的工作,只是不这样做,但我失去了我的头脑,为什么它不工作。
这是我的完整代码

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?
我真的很烦,我想睡一觉。谢谢你的帮助

1yjd4xko

1yjd4xko1#

组件可能没有被重新渲染,因为你的状态变化返回了它传入的同一个数组。你也不应该改变数组中的对象。相反,创建一个新的。

const updateCheck = (event, id) => {
  updateList(todos =>
    todos.map(todo => todo.id != id ? todo : { ...todo, complete: true })
  )
}

字符串

相关问题