使用上下文 API (React.js) 仅更改状态对象中的特定键

Posted

技术标签:

【中文标题】使用上下文 API (React.js) 仅更改状态对象中的特定键【英文标题】:Using context API (React.js) to change only a particular key in state object 【发布时间】:2021-06-08 10:45:31 【问题描述】:

我在响应中使用上下文 API 来管理状态。为此,我创建了一个文件 AppContext.js 在其中创建了上下文和提供程序:

import  useState, createContext  from "react";

export const AppContext = createContext();

export const AppProvider = (props) => 
   const [appdata, setAppdata] = useState(
      data1: "this is data1",
      data2: "this is data2",
   );

   return (
      <AppContext.Provider value=[appdata, setAppdata]>
         props.children
      </AppContext.Provider>
   );
;

我已经在应用的父组件中导入了这个 Provider,即 App.js。我还把 &lt;AppChild/&gt; 组件包装在了 Provider 中。

import AppChild from "./AppChild";
import  AppProvider  from "./AppContext";

const App = () => 
   return (
      <AppProvider>
         <div className="App">hello</div>
         <AppChild />
      </AppProvider>
   );
;

export default App;

现在从AppChild 组件,我只需要更新我的状态的data1 键。为此,我创建了一个带有onClick 的按钮,通过它我将更改我的状态。为此,我习惯于在 AppChild.js 中使用以下代码:

import  useContext  from "react";
import  AppContext  from "./AppContext";

const AppChild = () => 
   const [appdata, setAppdata] = useContext(AppContext);
   return (
      <div>
         <h3 style= color: "red" >Data for Appchild: appdata.data1</h3>
         <button
            onClick=() =>
               setAppdata((prev) => 
                  prev.data1 = "updated data1";
                  return prev;
               )
            
         >
            click to change
         </button>
      </div>
   );
;

export default AppChild;

但是当我点击按钮时,&lt;h3&gt; 块内的文本并没有改变。虽然当我通过将整个对象直接传递给setAppdata 来更改整个状态时,如下所示,

这样状态更新成功。为什么我只想更改data1 键的第一种方法不起作用?

【问题讨论】:

【参考方案1】:

您以错误的方式更新状态,因此它无法正常工作。这就是你应该更新状态的方式

<button
 onClick=() =>
   setAppdata((prevState) => (
     ...prevState,
     data1: "Your New Data"
        ))
      
    >
        click to change
      </button>     

【讨论】:

您的解决方案有效。但是你能说出我的方法有什么问题导致它停止工作吗?据我所知 setAppdata() 采用隐式函数。你直接使用了 ()=>("hello") 而我使用了 ()=>return "hello"。如果我没记错的话,两者在技术上是相同的。请解释... 您也在更新状态,但您正在直接修改state,这不会导致重新渲染。 read this 了解更多信息 哦,明白了!非常感谢!

以上是关于使用上下文 API (React.js) 仅更改状态对象中的特定键的主要内容,如果未能解决你的问题,请参考以下文章

React JS:在 API 调用成功后获取上下文数据

React js react-google-maps-api 更改颜色标记默认

无法在按钮单击 React.js 时重定向(使用上下文提供程序)

使用 React 管理多个 websocket

React JS - 如何将变量(参数)传递给 API URL?

如何使用 React 上下文 API?