最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Use of useEffect with useLocation - Stack Overflow

programmeradmin2浏览0评论

I want to know what is the biggest difference between using (or not) useEffect to update useLocation.

I usually find people set useLocation inside useEffect to update the state whenever the URL's path changes, but I found I don't need to do this to have the location to be updated.

const NavBar = () => {
  const location = useLocation();
  const [currentPath, setCurrentPath] = useState('')

  const location = useLocation();
  console.log('pathname:', location.pathname)

   useEffect(() => {
     setCurrentPath(location.pathname);
   }, [location]);

console.log('currentPath:', currentPath)
...
}
Returns
pathname: /results:Cancer
currentPath: /results:Cancer

I mean, the only difference I find is that with useEffect the return will happen after the ponent mounts. I'm trying to understand the best practices to bee a better programmer.

I want to know what is the biggest difference between using (or not) useEffect to update useLocation.

I usually find people set useLocation inside useEffect to update the state whenever the URL's path changes, but I found I don't need to do this to have the location to be updated.

const NavBar = () => {
  const location = useLocation();
  const [currentPath, setCurrentPath] = useState('')

  const location = useLocation();
  console.log('pathname:', location.pathname)

   useEffect(() => {
     setCurrentPath(location.pathname);
   }, [location]);

console.log('currentPath:', currentPath)
...
}
Returns
pathname: /results:Cancer
currentPath: /results:Cancer

I mean, the only difference I find is that with useEffect the return will happen after the ponent mounts. I'm trying to understand the best practices to bee a better programmer.

Share Improve this question edited Dec 22, 2020 at 20:28 Or Assayag 6,35613 gold badges72 silver badges109 bronze badges asked Dec 22, 2020 at 18:00 Jonathan SandlerJonathan Sandler 3353 silver badges17 bronze badges 0
Add a ment  | 

1 Answer 1

Reset to default 8

The reason for useEffect here is because you're setting a state within the effect. If you remove the useEffect and just do:

const location = useLocation();
const [currentPath, setCurrentPath] = useState('');

setCurrentPath(location.pathname);

You'll probably see this error:

Too many re-renders. React limits the number of renders to prevent an infinite loop.

This is because the setCurrentPath runs on every render and it causes a new render hence the infinite loop.

useEffect allows you to opt-out of doing something when the deps hasn't changed. Here the setCurrentPath is only called when location is changed.

But a broader point is that you generally don't need to "cache" the location state inside your ponent's state. It's already a state within the useLocation hook. Just read it and use it, don't store it.

发布评论

评论列表(0)

  1. 暂无评论