【问题标题】:How to dispatch response data from api in react redux?如何在 react redux 中从 api 发送响应数据?
【发布时间】:2023-02-21 17:51:42
【问题描述】:

当用户登录时,我可以获得以下 Json 数据。

杰森

{
    "hubs": [
        "111.com",
        "222.com",
        "333.com",
}

下面的代码部分

  console.log(response.data.hubs[0])
  console.log(response.data.hubs[1])
  console.log(response.data.hubs[2])

我可以看到这样的网址

"111.com", "222.com", "333.com",

在控制台中。

但是,我使用 dispatch、stores 和 useSelector,我得到了这样的错误。

我不知道为什么会出现错误。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

登录.js

const Login = () => {

  const history = useHistory();
  const dispatch = useDispatch();
  const [cookies, setCookie] = useCookies();
  const { register, handleSubmit, watch, errors } = useForm();

  const getJwt = async (data) =>{

        const email_encoded = btoa(data.email)
        const password_encoded = btoa(data.password)
        await axios.get('xxx.com', {
          auth: {
            username: data.email,
            password: data.password,
          }
          })
        .then(function (response) {
          console.log("logged in!");
          setCookie('accesstoken', response.data.token, { path: '/' }, { httpOnly: true });
          setCookie('refreshtoken', response.data.refresh_token, { path: '/' }, { httpOnly: true });
          console.log(response.data.hubs[0])
          console.log(response.data.hubs[1])
          console.log(response.data.hubs[2])
          dispatch(setMCUHouse(response.data.hubs[0]));
          dispatch(setMCUCondo(response.data.hubs[1]));
          dispatch(setMCUOffice(response.data.hubs[2]));
        })
        .catch(err => {
            console.log("miss");
            alert("Email or Password is wrong!");
        });
      };

  return (
    <>
            <form onSubmit={handleSubmit(getJwt)}>
              <input placeholder='Email Address' className='form-control login_form' {...register('email')} />
              <div className="login_password_section">
                <input placeholder='Password' className='form-control login_form'  />
                <span
                    onClick={togglePassword}
                    role="presentation"
                    className="password_reveal"
                    >
                </span>
              </div>
            </form>

    </>

  );
}
export default Login;

商店/mcu.js

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  mcuhouse: '',
  mcucondo: '',
  mcuoffice: '',
};

const slice = createSlice({
  name: "mcu",
  initialState,
  reducers: {

    setMCUHouse: (state, action) => {
      return Object.assign({}, state, { mcuhouse: action.payload })
    },
    setMCUCondo: (state, action) => {
      return Object.assign({}, state, { mcucondo: action.payload })
    },
    setMCUOffice: (state, action) => {
      return Object.assign({}, state, { mcuoffice: action.payload })
    },

  }
});

export default slice.reducer;

export const { setMCUHouse, setMCUCondo, setMCUOffice,  } = slice.actions;

DiscoverCondo.js

  const url = useSelector(state => state.mcu.mcucondo);
  console.log(url)

【问题讨论】:

  • 我没有看到任何明显的问题。认为你可以创建一个跑步codesandbox 重现我们可以现场检查的问题的演示?
  • 问题出现由这条线引起:const url = useSelector(state =&gt; state.mcu.mcucondo);你没有包含完整的DiscoverCondo文件代码,所以我们无法判断第 46 行是什么).您能否edit 帖子分享更完整的minimal reproducible example,其中包括DiscoverCondo 并显示您如何配置商店,即如何将 reducer 组合起来形成状态树?
  • 谢谢你的评论。第 46 行是 const url = useSelector(state => state.mcu.mcucondo);
  • 那么state.mcu似乎是未定义的。你能分享一下你是如何组合减速器和配置商店的吗?
  • 如果我误解了什么,对不起,你的意思是 setMCUCondo: (state, action) => { return Object.assign({}, state, { mcucondo: action.payload }) },?

标签: reactjs json redux


【解决方案1】:

根据RTK document

你应该像这样设置configureStore()

应用程序/store.js

import { configureStore } from '@reduxjs/toolkit';
import mcuReducer from '...';
export const store = configureStore({
  reducer: {
    mcu: mcuReducer,
  },
});
// ...

【讨论】:

  • 这只是一种预感,还是您在 OP 的帖子中看到了一些表明他们如何设置/配置 Redux 商店的内容? OP 默认导出 mcuReducer,所以我认为您的代码在创建存储减速器时会遇到 import * as mcuReducer from '...'; 的问题。
  • @DrewReese 没有足够的证据,所以我不得不猜测。首先,OP 显示错误消息,它说没有mcu.mcucondo。其次,OP 的 redux 动作代码在我看来还不错。所以,我猜 OP 可能没有正确配置商店。
  • 如果没有足够的证据、细节或上下文,那么帖子/问题就无法真正回答。
  • 我只是提出一种可能性,如果与答案无关,我会删除它。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多