为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2023-05-11 14:23:13
我正在构建 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 用于单个产品,但我正在使用这个项目进行练习,而且我有点被困在这个项目上。
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您需要做的是在离开详情页面时清除所选商品。您可以使用 的返回函数来做到这一点useEffect。所以可能是这样的:


useEffect(() => {

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

  

  return () => {

    dispatch(clearSelectedProduct());        

  }

}, [dispatch, match]);

并添加相应的 action 和 reducer 更改..


case CLEAR_SELECTED_PRODUCT:

  return { loading: false, product: { reviews: [] } }; 

这样,当您到达产品详情页面时,之前的产品总是被清除。


查看完整回答
反对 回复 2023-05-11
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信