如何更改数组状态容器中的对象属性? React Hooks 使用状态

Posted

技术标签:

【中文标题】如何更改数组状态容器中的对象属性? React Hooks 使用状态【英文标题】:How to change an object property in an array state container?? React Hooks useState 【发布时间】:2021-06-04 16:36:38 【问题描述】:

我是 React 初学者并尝试制作一个简单的 Todo 应用程序。该应用可以添加、删除所有任务或仅删除一项。

组件 Todo Form 包含一个输入和两个按钮,第一个用于添加任务,最后一个用于删除所有任务。因此,当添加任务时,输入的当前值被推送到另一个称为帖子的状态。然后帖子的状态被共享为另一个名为“TodoList”的组件中的一个属性,该组件显示帖子(数组)的列表显示。

待办事项表单组件

import React ,useState from 'react'
import TodoList from './TodoList'

function TodoForm() 
    const initialState = 
        id:"",
        description:"",
        status:""
    

    const [task, setTask] = useState(initialState)
    const [posts, setPosts] = useState([])

    const handleChange = (e) => 
        setTask(
            id:Date.now(),
            description:e.target.value,
            status:false
        )
    

    const dropArray = (e) => 
        e.preventDefault()
        let confirm = window.confirm("Do you want erase all Tasks?")
        if (confirm)
            setPosts([])
        
    
    
    const handleSubmit = (e) =>
        e.preventDefault()
        if(task.description !== "")
        setPosts([...posts , task])
        console.log('Post Rendering Array', posts)
      else 
        alert("The type box is empty!!")
    
        setTask(
            id:'',
            description:'',
            status:false
        )
    

    return (
        <div>
            <h1>What's the plan for Today</h1>
            <form onSubmit=handleSubmit>
                <input 
                    type="text"
                    value=task.description
                    onChange=handleChange
                    placeholder='Type a Message'
                />
                <button>
                    Add Task
                </button>
                <button onClick=dropArray>
                    Drop Task
                </button>
            </form>
            <TodoList posts=posts setPosts=setPosts/>
        </div>
    )


export default TodoForm

所以,我希望当有人按下复选框输入时,属性“状态”更改为真/假。当尝试使用 setPosts 更改状态时,我更改了所有数组而不是我选择的对象子对象。

TodoList 组件

import React from 'react'

function TodoList(props) 
    const posts = props.posts

    const deleteTask = (id) => 
        const filteredTask = posts.filter(task => task.id !== id)
        const removeTask = props.setPosts(filteredTask)
    

    const changeStatus = (post) =>
        // deleteTask(post.id)
        const status = 
            id: post.id,
            description:post.description,
            status: !post.status
        

        props.setPosts([status])

        // props.setPosts([status])

        console.log(post)
    

    return (
        <div>
            <ol>
                posts.map(post =>
                return (
                    <li key=post.id>
                        <textarea readOnly value=post.description/>
                        <input type="checkbox" onChange=()=>changeStatus(post) checked=post.status/>
                        <button onClick=()=>deleteTask(post.id)>X</button>
                        <button>+</button>
                    </li>
                )
            )
            </ol>
        </div>
    )


export default TodoList

【问题讨论】:

setPosts(s =&gt; s.map(x =&gt; x.id === post.id ? ..new object... : x)) 【参考方案1】:

您应该在changeStatus 中找到并更改确切的项目:

  const changeStatus = post => 
    props.setPosts(prev => prev.map(
      item => item.id === post.id 
        ? ...item, status: !item.status
        : item
    ))
  

【讨论】:

以上是关于如何更改数组状态容器中的对象属性? React Hooks 使用状态的主要内容,如果未能解决你的问题,请参考以下文章

如何从 React Js 中的数组属性中删除单个对象?

从存储在 React 状态中的对象数组访问属性

反应数组的对象更改顺序的更改值

React Typescript 尝试更改数组对象的状态导致错误

无法访问 JavaScript 对象数组 (React.js) 中的属性

更改数组中的一个状态会导致在 React Hooks 中重新渲染整个循环生成的自定义组件