React-Redux UI 错误。图像更新滞后

我正在构建 MERN 电子商务应用程序,并且在从 Redux Store 中提取数据时遇到了一个奇怪的 UI 错误。从一个产品页面切换到另一个页面后,会显示并更新旧产品图像。如您所见:https://imgur.com/iU9TxJr

在那里你可以看到减速器的代码:

export const productDetailsReducer = (

  state = { product: { reviews: [] } },

  action

) => {

  switch (action.type) {

    case PRODUCT_DETAILS_REQUEST:

      return { loading: true, ...state };

    case PRODUCT_DETAILS_SUCCESS:

      return { loading: false, product: action.payload };

    case PRODUCT_DETAILS_FAIL:

      return { loading: false, error: action.payload };

    default:

      return state;

  }

};

还有行动代码:


export const listProductDetails = (id) => async (dispatch) => {

  try {

    dispatch({ type: PRODUCT_DETAILS_REQUEST });


    const { data } = await axios.get(`/api/products/${id}`);


    dispatch({

      type: PRODUCT_DETAILS_SUCCESS,

      payload: data,

    });

  } catch (error) {

    dispatch({

      type: PRODUCT_DETAILS_FAIL,

      payload:

        error.response && error.response.data.message

          ? error.response.data.message

          : error.message,

    });

  }

};

最后,有组件的代码,我将 redux 存储带入页面


const ProductPage = ({ match }) => {

  const dispatch = useDispatch();


  const productDetails = useSelector((state) => state.productDetails);

  const { loading, error, product } = productDetails;


  useEffect(() => {

    dispatch(listProductDetails(match.params.id));

  }, [dispatch, match]);


  console.log(product);


  return (

    <>

      {loading ? (

        <Loader />

      ) : error ? (

        <Message variant="danger">{error}</Message>

      ) : (

        <Row>

          <Col md={8}>

            <Image src={product.image} alt={product.name} fluid />

          </Col>

...rest of component's code....

我知道甚至最好不要将 redux 用于单个产品,但我正在使用这个项目进行练习,而且我有点被困在这个项目上。


慕斯王
浏览 128回答 1
1回答

MMMHUHU

您需要做的是在离开详情页面时清除所选商品。您可以使用 的返回函数来做到这一点useEffect。所以可能是这样的:useEffect(() => {&nbsp; dispatch(listProductDetails(match.params.id));&nbsp;&nbsp;&nbsp; return () => {&nbsp; &nbsp; dispatch(clearSelectedProduct());&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; }}, [dispatch, match]);并添加相应的 action 和 reducer 更改..case CLEAR_SELECTED_PRODUCT:&nbsp; return { loading: false, product: { reviews: [] } };&nbsp;这样,当您到达产品详情页面时,之前的产品总是被清除。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript