reactjs - React useReducer 没有从其他组件中获取新的调度值
问题描述
我正在尝试使用减速器来更新我正在构建的 React/Typescript 应用程序的进度条。我正在使用 useReducer 钩子。
我有一个进度条位于标题中,我试图“监听”减速器状态并使用为其提供的正确进度条值重新渲染。但目前,“订阅者”组件(可以这么说)没有获取更新的值。我知道值正在reducer 中更新和接收,因为当我在reducer 中注销操作时,我可以在它们中看到它。这是我的代码:
减速器:
import ProgressBarTitleEnum from '../lib/enums/progressBarTitleEnum';
export const UPDATE_PROGRESS_BAR = 'updateProgressBar';
export interface IProgressBarState {
name: string;
value: number;
}
interface IAction {
type: string;
payload: IProgressBarState;
}
export const initialState: IProgressBarState = {
name: ProgressBarTitleEnum.INVESTOR_PROFILE,
value: 0,
};
export const reducer = (state = initialState, action: IAction): IProgressBarState => {
switch (action.type) {
case UPDATE_PROGRESS_BAR:
return {
...initialState,
name: action.payload.name,
value: action.payload.value,
};
default:
return state;
}
};
export function updateProgressBarAction(progressBarPayload: IProgressBarState): IAction {
return {
type: UPDATE_PROGRESS_BAR,
payload: progressBarPayload,
};
}
分发动作的组件
import MainLayout from '../../components/layout/MainLayout';
import {
initialState as progressBarState,
reducer as progressBarReducer,
updateProgressBarAction,
} from '../../reducers/progressBarReducer';
import ProgressBarTitleEnum from '../../lib/enums/progressBarTitleEnum';
interface IStepsCompletedInterface {
investmentStyle: boolean;
investmentPeriod: boolean;
investmentRange: boolean;
investmentAmount: boolean;
}
export default function InvestorProfile(): JSX.Element {
const [progressBarStore, progressBarDispatch] = useReducer(progressBarReducer, progressBarState);
useEffect(() => {
progressBarDispatch(
updateProgressBarAction({
name: ProgressBarTitleEnum.INVESTOR_PROFILE,
value: 1,
}),
);
}, []);
而progressBar组件就是监听状态变化并相应渲染:
import { initialState as progressBarState, reducer as progressBarReducer } from '../../reducers/progressBarReducer';
// Can probably move it to react context
export default function ProgressBar(): JSX.Element {
const [progressBarStore, progressBarDispatch] = useReducer(progressBarReducer, progressBarState);
const isMobile = useMediaQuery({
query: `(max-device-width: ${mediaQueriesMap.get('mobile')}px)`,
});
console.log(progressBarStore);
const markUp = (
<div style={styles.container}>
{Array(4)
.fill(0)
.map((_, i) => {
let circleMarkup;
if (progressBarStore.value === i) {
circleMarkup = (
任何人都可以为什么在进度条组件中没有获取更新的状态?另外,我是否需要创建一个局部状态变量来保存更改并与进度条组件中的 useEffect 结合以导致渲染,还是 useReducer 导致重新渲染?谢谢
解决方案
推荐阅读
- python - “ValueError:无法将权重广播到值。在昏暗 1 处不匹配。” 在序列模型上使用自定义损失函数时
- android - 在android应用程序中显示所有网络响应
- unity3d - 编辑器中的 Unity 模糊和像素化精灵(无像素艺术)
- sql - 对于简单的乘法,Sqlite 更新表的速度真的很慢
- arrays - 从 XML 转换 XSLT 后,在 JSON 中正确表示集合数据
- python - 为什么这个 Plotly 图在 Y 轴和 X 轴上悬停?
- angular - 使用 Angular 匹配器进行路由会引发“考虑将函数表达式更改为导出函数”
- sql-server - 从字符串数据中获取 5 位邮政编码
- angular - 如何为调用服务的函数编写单元和/或 e2e 测试
- java - Eclipse EE 开发需要什么 JDK