如何更新/添加新数据以响应功能组件对象?

Posted

技术标签:

【中文标题】如何更新/添加新数据以响应功能组件对象?【英文标题】:How to update/add new data to react functional component object? 【发布时间】:2021-12-27 13:34:21 【问题描述】:

我正在尝试创建一个函数来更新反应功能组件中的对象。 我想做的是:

const [content, setContent] = useState();
const applyContent = (num: number, key: string, val: string) => 
  if (content[num] === undefined) 
    content[num] = ;
  
  content[num][key] = val;
  setNewContent(newInput);
;

但我不断收到一条错误消息,指出内容没有 num 属性, 在 vanilla JS 中它可以工作,我缺少什么让它与反应功能组件一起工作?

【问题讨论】:

您没有指定预期的 type 内容,因此它被推断为没有属性的对象。使用 `useState. 的generic 类型参数。 【参考方案1】:

content 是一个只读值。你不能直接改变它。仅用于显示数据或将此数据复制到另一个帮助器值。

setContent 是一个设置内容的函数。

设置数据有两种方式

setContent(value) <-- set directly 
setContent(prevState => 
    return 
        ...prevState,
        ...value
    
)

在第二个示例中,您将使用以前的值,复制它,然后用新值覆盖它。如果您只更新对象或数组的一部分,这很有用。

如果您使用的是深度嵌套的对象,浅拷贝可能还不够,您可能需要先对内容值进行深度拷贝。如果不是,则使用 prevState 示例仅更新该内容的一部分

const [content, setContent] = useState();

const applyContent = (num:number,key:string,val:string) => 
const newContent = ...content // Shallow copy content
    if (content[num] === undefined) 
      //content[num] = ; <-- you cant directly change content. content is a readOnly value
    newContent[num] = 
    
    
    newContent[num][key] = val;
    //setNewContent(newInput);
      setContent(newContent) // <-- use "setContent" to change "content" value
  

【讨论】:

【参考方案2】:

组件状态的设置器拼写错误。看看下面的代码。

import React,  useState  from 'react';
import './style.css';

export default function App() 
  const [content, setContent] = useState();

  const applyContent = (num, key, val) => 
    //gets the appropriate inputs
    let updatedContent = content;
    let value = ;
    value[key] = val;

    updatedContent[num] = value; //this inserts a new object if not present ot updates the existing one.

    setContent( ...updatedContent );
  ;

  return (
    <div>
      <h1>Click buttons to change content</h1>
      <p>JSON.stringify(content)</p>
      <button onClick=(e) => applyContent(0, 'a', 'b')>Add</button>
      <button onClick=(e) => applyContent(1, 'c', 'd')>Add</button>
      <button onClick=(e) => applyContent(0, 'e', 'f')>Add</button>
    </div>
  );

【讨论】:

以上是关于如何更新/添加新数据以响应功能组件对象?的主要内容,如果未能解决你的问题,请参考以下文章

无法以角度更新子组件属性

如何从 React 中的子组件更新父组件(功能)

如何从存储中更新 React Native 功能组件状态

.NET 8新预览版本使用 Blazor 组件进行服务器端呈现

如何在 React 组件中向 Apollo 客户端添加新的授权标头?

如何安装 Storybook 以响应原生?