我使用了REACT和REDUX,API返回数据.在useDispatch中写入的数据将如何在其他组件中使用.

如何在所有组件中提供customerId.我创建了一个调用API的代码,并返回数据作为响应.我还造了一个减速器.不确定如何做到这一点,以便customerId将是可用的.

const test = () => {
  const [sessionInfo, setsessionInfo] = useState(useSelector(state => state.app.DataReducer.sessionDetails));

  const uDispatch = useDispatch();

  useEffect(() => {
    sessionInformation();

    async function sessionInformation() {
      const session_ID = '5f9f0de7-c7b3-3029'

      console.log("sessionInformaiton: " + session_ID)

      await SessionInformationService({ sessionId: session_ID })
        .then((result) => {
          console.log("Result: " + JSON.stringify(result));

          if (result.data !== undefined) {
            setsessionInfo(result.data);
          }
        });
    }

    uDispatch(types.updateData({
      sessionDetails: {
        customerId: sessionInfo.customerId,
          firstName: sessionInfo.customerfirstName,
          lastName: sessionInfo.customerlastName,
          fullName: sessionInfo.customerfullName,
        }
      })
    );
  }, []);

  return (
    <>

    </>
  )
};

export default test;

减速机

import * as types from './action';

export const initialState = {
  sessionDetails: {
    customerId: '',
    customerfirstName: '',
    customerlastName: '',
    customerfullName: ''
  }
}

const Data减速机 = (state = initialState, action) => {
  switch (action.type) {
    case types.UPDATE_DATA:
      const output = action.payload;

      if (output.sessionDetails) {
        state.sessionDetails = output.sessionDetails;
      }

      return {
        ...state,
      }
      break;

    default:
      return state;
  }
}

export default Data减速机;

Action.js

export const UPDATE_DATA = 'UPDATE_DATA';

export const updateData = payload => ({
  type: UPDATE_DATA,
  payload
});

推荐答案

首先要解决的问题是减缩函数中的状态Mutations .

state.sessionDetails = output.sessionDetails;改变当前状态对象.浅复制先前状态引用then覆盖属性.有关更多详细信息,请参见Immutable Update Patterns.

const dataReducer = (state = initialState, action) => {
  switch (action.type) {
    case types.UPDATE_DATA:
      const { sessionDetails } = action.payload;

      if (sessionDetails) {
        return {
          ...state,
          sessionDetails: {
            ...state.sessionDetails,
            ...sessionDetails,
          }
        };
      }

      return state;

    default:
      return state;
  }
};

第二个问题是Test组件没有正确管理获取数据和更新存储.它在sessionInfo本地状态变量中缓存来自redux的sessionDetails状态的副本,但useEffect同时获取会话数据and,调度updateData操作,该updateData操作只是将未更新的sesstionInfo本地状态发送回存储.实际上,Redux状态不会使用填充的数据进行更新.

不需要本地的sessionInfo状态,useEffect挂钩并直接获取和发送数据.

React组件也使用PascalCase名称,test不是有效Reaction组件,但Test是.重命名该功能组件.

const Test = () => {
  const dispatch = useDispatch();

  useEffect(() => {
    const sessionInformation = async () => {
      const sessionId = '5f9f0de7-c7b3-3029';

      console.log("sessionInformaiton: ", sessionId);

      try {
        const { data } = await SessionInformationService({ sessionId });

        console.log("Result: ", { data });

        if (data) {
          const userData = {
            sessionDetails: {
              customerId: data.customerId,
              firstName: data.customerfirstName,
              lastName: data.customerlastName,
              fullName: data.customerfullName,
            }
          };

          dispatch(types.updateData(userData));
        }
      } catch (error) {
        // handle any errors, if necessary, or ignore, your call
      }
    };
 
    sessionInformation();
  }, []);

  return (
    <>
      ...
    </>
  );
};

export default Test;

使用useSelector挂钩访问状态. Select 器功能遵循由减法器组合而成的状态 struct .

示例:

import { useSelector } from 'react-redux';

...

const SomeComponent = () => {
  const { customerId } = useSelector(
    state => state.app.DataReducer.sessionDetails
  );

  ...
};

Javascript相关问答推荐

通过实现regex逻辑自定义数据表搜索

具有相同参数的JS类

django无法解析余数:[0] from carray[0]'

被CSS优先级所迷惑

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

拖放仅通过 Select 上传

JQuery. show()工作,但. hide()不工作

我们如何从一个行动中分派行动

将本机导航路由react 到导航栏中未列出的屏幕?

如何从调整大小/zoom 的SVG路径定义新的d属性?""

使用LocaleCompare()进行排序时,首先使用大写字母

如何在 cypress 中使用静态嵌套循环

优化Google Sheet脚本以将下拉菜单和公式添加到多行

从页面到应用程序(NextJS):REST.STATUS不是一个函数

为什么延迟在我的laravel项目中不起作用?

如何找到带有特定文本和测试ID的div?

如何在尚未创建的鼠标悬停事件上访问和着色div?

Django模板中未加载JavaScript函数

如何处理不带参数的redux thunk payloadCreator回调函数?

检测带有委托的元素内部的点击,以及元素何时按其类名被选中