【问题标题】:React useEffect not triggered反应useEffect未触发
【发布时间】:2021-03-05 12:11:36
【问题描述】:

我的 useEffect 代码如下所示:

  useEffect(() => {
    if (user) {
      setBalance(user.user_balance);
      console.log("user.user_balance");

      console.log(user.user_balance);
    }
  }, [user]);

完整代码:https://pastebin.com/CP6sLNQZ

useEffect 应该在每次用户(user_balance)在数据库中更新但没有被触发时触发。 User 是一个 props,它是从 redux 传递给组件的。

更新余额的动作在这里:

import axios from "axios";
import { returnErrors } from "./errorActions";
import { UPDATE_BALANCE_SUCCESS } from "./types";

//update balance
export const updateBalance = ({ email, user_balance }) => (dispatch) => {
  // Headers
  const config = {
    headers: {
      "Content-Type": "application/json",
    },
  };

  // Request body
  const body = JSON.stringify({ email, user_balance });

  axios
    .post("/api/users/updatebalance", body, config)
    .then((res) =>
      dispatch({
        type: UPDATE_BALANCE_SUCCESS,
        payload: { email, user_balance },
      })
    )
    .catch((err) =>
      dispatch(returnErrors(err.response.data, err.response.status))
    );
};

减速器:

import { UPDATE_BALANCE_SUCCESS } from "../actions/types";

const initalState = {
  email: null,
  user_balance: null,
};

export default function (state = initialState, action) {
  switch (action.type) {
    case UPDATE_BALANCE_SUCCESS:
      return {
        ...state,
        email: action.payload.email,
        user_balance: action.payload.user_balance,
      };
  }
}

还有终点:

// @route       POST api/users/updatebalance
// @description Update user balance
// @access      Public
router.post("/updatebalance", (req, res) => {
  const { email, user_balance } = req.body;

  User.findOneAndUpdate(
    { email },
    { $inc: { user_balance: user_balance } },
    function (err, result) {
      if (err) {
        res.send(err);
      } else {
        res.send(result);
      }
    }
  );
});

还有 auth 的来源:

这是 auth reducer:https://pastebin.com/upHdvtiF

这些是行动:https://pastebin.com/Ajp7S1Yi

这是终点:https://pastebin.com/NwCHCitY

我有一个登录和注册页面,一旦用户注册,就会创建身份验证。在操作链接中,您可以看到登录和注册操作。

【问题讨论】:

  • 如果你使用 auth 作为依赖呢?
  • @SomeoneSpecial 即使将身份验证用作依赖项,它也不会被触发。
  • 既然你使用的是redux,为什么你将user作为props传递,而不是使用react-redux中的useSelector钩子直接访问它?此外,您不要将 user 作为详细代码中的道具传递给子组件。
  • 首先删除用户重复。决定是否要将用户数据保留在 auth 或另一个用户状态,但不能同时保留。然后更新您的减速器和操作以反映您的决定。最后,你的用户映射到 props 的状态应该从包含用户数据的精确 reducer 状态中提取用户。

标签: reactjs react-redux react-hooks


【解决方案1】:

我认为你必须添加用户层

const initalState = {
  user: {
     email: null,
     user_balance: null,
  }
};

和减速器

export default function (state = initialState, action) {
  switch (action.type) {
    case UPDATE_BALANCE_SUCCESS:
      return {
        ...state,
        user: {
           ...state.user,
           email: action.payload.email,
           user_balance: action.payload.user_balance,
        }
      };
    }
 }

【讨论】:

  • 谢谢,但这并没有真正改变任何事情。 UseEffect 仍然不会检测到用户何时更新。
  • 不可能,那么可能有多个 redux store 适合你。如果你能准备一个codepen就更好了
猜你喜欢
  • 2021-08-29
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2020-04-06
  • 2020-04-23
  • 2020-09-07
  • 2021-04-25
相关资源
最近更新 更多