【发布时间】:2022-01-13 07:30:31
【问题描述】:
给定以下 React Context Provider。一个简单的 Counter 类,有 2 个方法,存储在 React 上下文中。
import { createContext, useContext } from "react";
class Counter {
public count: number = 0;
getCount = () => {
return this.count;
};
incrementCount = () => {
this.count = this.count + 1;
};
}
type CounterContextType = {
counter: Counter;
};
const defaults: CounterContextType = {
counter: new Counter()
};
const CounterContext = createContext<CounterContextType>(defaults);
export const CounterProvider: React.FC = ({ children }) => {
const counter = new Counter();
return (
<CounterContext.Provider
value={{
counter
}}
>
{children}
</CounterContext.Provider>
);
};
export const useCounter = () => {
return useContext(CounterContext);
};
我想监听Counter 实例的count 属性的变化。
这是我尝试过的:
import { useMemo } from "react";
import { CounterProvider, useCounter } from "./CounterProvider";
const DisplayWithMethod = () => {
const { counter } = useCounter();
return <div>Method: {counter.getCount()}</div>;
};
const DisplayWithProperty = () => {
const { counter } = useCounter();
return <div>Prop: {counter.count}</div>;
};
const DisplayWithMemo = () => {
const { counter } = useCounter();
const val = useMemo(() => counter.count, [counter.count]);
return <div>Memo: {val}</div>;
};
const Button = () => {
const { counter } = useCounter();
return <button onClick={counter.incrementCount}>Increment</button>;
};
export default function App() {
return (
<CounterProvider>
<DisplayWithMethod />
<DisplayWithProperty />
<DisplayWithMemo />
<Button />
</CounterProvider>
);
}
这些都不起作用,因为计数器实例永远不会改变,因此不会触发重新渲染。关于如何在保持Counter 的类结构的同时完成这项工作的任何想法。
【问题讨论】:
-
你好,我假设你给出了一个非常简单的复制。我的建议是,让您的 Counter 类 可订阅,使用 forceUpdate 函数订阅(从 useState 或 useReducer 获取)。所以当你的 Counter 更新一个值时,它会触发订阅者并强制响应重新渲染
标签: javascript reactjs typescript