+-
如何在React中更新useReducer状态?

我试图从localStorage中获取项目并将其传递给useReducer状态。

当我从一个按钮切换到另一个按钮状态不更新。我的 initialState 确实更新了,但 states 不更新

我的 initialStatesstates 在console.log上,这两个值都不同。states 始终存储所选按钮Genid项的前值和 initialStates 存储选择按钮Genid项的当前选择值,但主要问题是没有更新到useReducer状态部分。

const Played = ( {Genid} ) => {
    console.log("Played page ")
    console.log("*************************************************")
    console.log(Genid)
    console.log(JSON.parse(localStorage.getItem(Genid)))

    const initialState = {
        DATA: JSON.parse(localStorage.getItem(Genid)) || [],
        isFetching:  localStorage.getItem(Genid) ? true : false,
        hasError: false,
    }
    console.log(initialState);


    const [states, dispatch] = useReducer(reducer, initialState)
    console.log(states)
1
投票

所以你的代码中的问题很简单,初始状态在reducer中没有被填充,因为最初的displayid是未定义的,然后设置为 ditto

之所以有这种行为,是因为在 Veritcal 组成部分,你 setDisplayId 而该效果在初始渲染后运行,此时未定义的displayId已经被该函数使用。Horizontal 组成部分

现在,你的代码也有其他问题。你在更新sessionStorage时使用了 response.data.payload 但没有钥匙 payloadresponse.data

另外 Movement 组件是映射在 state.data 但那是一个对象。相反,你需要在 state.data.abilities

修改了以下代码片段

移动.js

const Movement = ({ states }) => {
  console.log(states);
  return (
    <div>
      {states.data &&
        states.data.abilities.map(ability => <div>{ability.ability.name}</div>)}
    </div>
  );
};

export default Movement;

横向.js

  console.log(displayid);
  const initialState = {
    // data: displayid? JSON.parse(sessionStorage.getItem(displayid)): [],
    // isFetching: displayid && sessionStorage.getItem(displayid) ? true : false,
    // hasError: false
  };

  const [states, dispatch] = useReducer(reducer, initialState);
  // console.log(states);
  useEffect(() => {
    if (displayid && !sessionStorage.getItem(displayid)) {
      console.log(displayid);
      axios
        .get(`https://pokeapi.co/api/v2/pokemon/${displayid}/`)
        .then(response => {
          console.log(response);
          console.log(response.data);
          dispatch({
            type: "First",
            payload: response.data
          });
          console.log(response.data);
          sessionStorage.setItem(displayid, JSON.stringify(response.data));
        })
        .catch(error => {
          console.log(error);
          dispatch({
            type: "Second"
          });
        });
    } else if (displayid && sessionStorage.getItem(displayid)) {
      // populate data from localStorage
      const localData = {
        data: JSON.parse(sessionStorage.getItem(displayid)) || [],
        isFetching: sessionStorage.getItem(displayid) ? true : false,
        hasError: false
      };
      dispatch({ type: "POPULATE", payload: localData });
    }
  }, [displayid]);

工作演示