typescript 如果useLocation()-state为null,我如何在不加载页面的情况下导航离开?

avkwfej4  于 2023-01-18  发布在  TypeScript
关注(0)|答案(2)|浏览(266)

我的React项目将数据从一个组件传递到FoodDetails,这是可行的,但我希望它在useLocationlocationstate属性为空时导航离开。
代码:

const FoodDetails = () => {
  const navigate = useNavigate();
  const location = useLocation();

  if (location.state === null) {
    navigate("/")
  }

  const food = location.state.food;

  return (
    <div className='FoodDetails'>
      <div className="FoodDetailsName">{food.name}</div>
    </div>
  )
}

export default FoodDetails

它进入if,但它 * 忽略 * navigate("/")。我在它后面放了一个return,return工作,所以它只是忽略了导航。
为什么它会忽略它,我该如何修复它?

i7uq4tfw

i7uq4tfw1#

你需要把navigate("/")放在useEffect里面,类似于:

const FoodDetails = () => {
  const navigate = useNavigate();
  const location = useLocation();

  const locationState = location.state;

  useEffect(() => {
    if(locationState === null){
      navigate("/");
    }
  }, [locationState]);

  const food = location.state.food;

  return (
    <div className='FoodDetails'>
      <div className="FoodDetailsName">{food.name}</div>
    </div>
  );
}

export default FoodDetails;

useEffect的回调函数将在每次其依赖项数组中的某个内容发生更改时运行。在本例中为locationState。请注意,在useEffect之前解构依赖项是一个好主意。

qmb5sa22

qmb5sa222#

navigate函数发出一个命令式导航操作,当前的实现是作为一个 * 无意的 * 副作用调用的。虽然您 * 可以 * 使用useEffect钩子来调用navigate作为一个 * 有意的 * 副作用,但组件仍然会先呈现 * 然后 * 调用useEffect钩子回调。您将立即看到返回的JSX。
我建议有条件地呈现Navigate组件,它将在初始呈现周期中发出一个声明性导航操作,其他食物细节JSX将没有机会呈现。
在任何一种情况下,FoodDetails组件和路由/页面都将被加载/呈现。这只是一种减轻呈现不希望用户看到的瞬时UI的方法。
示例:

import { Navigate } from 'react-router-dom';

const FoodDetails = () => {
  const { state } = useLocation();
  const { food } = state || {};

  if (!food) {
    return <Navigate to="/" />;
  }

  return (
    <div className='FoodDetails'>
      <div className="FoodDetailsName">{food.name}</div>
    </div>
  );
};

export default FoodDetails;

相关问题