gpt4 book ai didi

javascript - react useContext 不触发重新渲染

转载 作者:行者123 更新时间:2023-12-04 10:27:29 26 4
gpt4 key购买 nike

我在子组件中有一个按钮 AddMore.js它在列表中添加了更多项目,但它不会重新呈现呈现该列表的其他子组件 Pig.js .我认为我的设置会起作用,因为我使用 NextJS 框架以类似的方式设置了上下文和提供程序。 Here's the source code, using codesandbox ,或者你可以看看下面的代码。

应用程序.js

import React, { useState } from "react";

import "./App.css";

import PigContext from "./store/PigContext";

import Pig from "./Pig";
import AddMore from "./AddMore";

function App() {
const [data, setData] = useState([
{ pig: "oink" },
{ pig: "bork" },
{ pig: "oinkoink" }
]);

return (
<div className="App">
<header className="App-header">
<PigContext.Provider value={{ data, setData }}>
<Pig />
<AddMore />
</PigContext.Provider>
</header>
</div>
);
}

export default App;


pig 上下文.js

import { createContext } from "react";

const PigContext = createContext(undefined);

export default PigContext;

pig .js

import React, { useContext } from "react";

import PigContext from "./store/PigContext";

const Pig = () => {
const { data } = useContext(PigContext);

return (
<div>
{data.map(({ pig }, idx) => (
<div key={idx}>{pig}</div>
))}
</div>
);
};

export default Pig;

添加更多.js

import React, { useContext } from "react";
import PigContext from "./store/PigContext";

export default function AddMore() {
const { setData } = useContext(PigContext);

return (
<div>
<button
onClick={() =>
setData(prev => {
prev.push({ pig: "zoink" });
console.log(prev);
return prev;
})
}
>
add pig question
</button>
</div>
);
}

最佳答案

您正在通过调用 push 来改变状态对象,您应该返回一个新数组,以便更新组件。

添加更多.js:

...
<button
onClick={() =>
setData(prev => (
[...prev, ({ pig: "zoink" })]
))
}
>
...

关于javascript - react useContext 不触发重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60572306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com