React typescript useContext 不会在更改时触发重新渲染
React typescript useContext not triggering re-render on change
我正在尝试使用 useContext 更改对象,但它没有触发。屏幕上的对象不会改变。如果我单击另一个按钮,它会同时触发它们。代码如下面的代码所示。
https://codesandbox.io/s/vpr9msmaicih7-lnkzr
*提供商
import React, { FC, useState, createContext, ReactNode } from "react";
import { Data } from "./type";
type ContextType = {
text: string;
setText: (text: string) => void;
data: Data | undefined;
setData: (data: Data) => void;
};
type Props = {
children: ReactNode;
};
const AuthContext = createContext<ContextType>({} as ContextType);
const AuthProvider: FC<Props> = ({ children }: Props) => {
const [text, setText] = useState<string>("default");
const [data, setData] = useState<Data | undefined>({} as Data);
const value = {
text,
setText,
data,
setData
};
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};
export { AuthProvider, AuthContext };
*页数
<button
onClick={() => {
if (data) {
let obj = data;
obj.id = "1001";
obj.date = new Date().toString();
setData(obj);
}
}}
>
Change Object Not working
</button>
export default function App() {
return (
<AuthProvider>
<Page />
</AuthProvider>
);
}
export interface Data {
id: string;
date: string;
}
我不确定我在这里做错了什么。
任何帮助都会有用。
所以当你说 let obj = data
时,你实际上是在直接改变状态。 obj
现在只是对 data
的引用。然后当你设置 setData(obj)
时,react 不知道状态变量已经改变了,因为你已经改变了它。您可能想要做的是复制一份。您可以使用扩展运算符 {...data}
来做到这一点。然后使用 setData
:
<button
onClick={() => {
if (data) {
let obj = {...data};
obj.id = "1001";
obj.date = new Date().toString();
setData(obj);
}
}}
>
Change Object Not working
</button>
我正在尝试使用 useContext 更改对象,但它没有触发。屏幕上的对象不会改变。如果我单击另一个按钮,它会同时触发它们。代码如下面的代码所示。 https://codesandbox.io/s/vpr9msmaicih7-lnkzr
*提供商
import React, { FC, useState, createContext, ReactNode } from "react";
import { Data } from "./type";
type ContextType = {
text: string;
setText: (text: string) => void;
data: Data | undefined;
setData: (data: Data) => void;
};
type Props = {
children: ReactNode;
};
const AuthContext = createContext<ContextType>({} as ContextType);
const AuthProvider: FC<Props> = ({ children }: Props) => {
const [text, setText] = useState<string>("default");
const [data, setData] = useState<Data | undefined>({} as Data);
const value = {
text,
setText,
data,
setData
};
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};
export { AuthProvider, AuthContext };
*页数
<button
onClick={() => {
if (data) {
let obj = data;
obj.id = "1001";
obj.date = new Date().toString();
setData(obj);
}
}}
>
Change Object Not working
</button>
export default function App() {
return (
<AuthProvider>
<Page />
</AuthProvider>
);
}
export interface Data {
id: string;
date: string;
}
我不确定我在这里做错了什么。 任何帮助都会有用。
所以当你说 let obj = data
时,你实际上是在直接改变状态。 obj
现在只是对 data
的引用。然后当你设置 setData(obj)
时,react 不知道状态变量已经改变了,因为你已经改变了它。您可能想要做的是复制一份。您可以使用扩展运算符 {...data}
来做到这一点。然后使用 setData
:
<button
onClick={() => {
if (data) {
let obj = {...data};
obj.id = "1001";
obj.date = new Date().toString();
setData(obj);
}
}}
>
Change Object Not working
</button>