【发布时间】:2020-06-04 19:09:32
【问题描述】:
我将上下文用于各种组件的状态,在这种情况下,选中了哪个复选框,并且正在使用该组件来改变该组件的状态。但是,只需单击一个复选框,所有四个组件(复选框)都会重新呈现。在挂钩和改变上下文时如何防止这种重新渲染?谢谢。
index.tsx:
import * as React from "react";
import ReactDOM from "react-dom";
import { ContextProvider, useMyContext } from "./context";
import "./styles.css";
const Checkbox: React.FC<{ id: number }> = ({ id }) => {
React.useEffect(() => console.log(`Checkbox ${id} Render`));
const { setValue, value } = useMyContext();
return (
<input
onClick={() => setValue(id)}
checked={id === value}
type="checkbox"
/>
);
};
const Container: React.FC = () => {
React.useEffect(() => console.log("Container Render"));
return (
<div>
{[0, 1, 2, 3].map(id => (
<Checkbox id={id} />
))}
</div>
);
};
const App: React.FC = () => {
return (
<ContextProvider>
<Container />
</ContextProvider>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
context.tsx:
import * as React from "react";
interface ContextState {
setValue: (id: number) => void;
value: number;
}
const initialContextState: ContextState = {
setValue: () => {},
value: 0
};
const Context = React.createContext<ContextState>(initialContextState);
export const ContextProvider: React.FC = (props: object) => {
const [value, setValue] = React.useState<number>(0);
return (
<Context.Provider
value={{
setValue,
value
}}
{...props}
/>
);
};
export const useMyContext = (): ContextState => React.useContext(Context);
【问题讨论】:
-
请在问题中输入minimal reproducible example。
-
请花一点时间来真正阅读我发布的内容。这是一个链接,而不是 MRE。
-
@jonrsharpe 更新谢谢
标签: html reactjs typescript