【问题标题】:How does useLocation hook from react-router-dom work?react-router-dom 中的 useLocation 钩子如何工作?
【发布时间】:2021-06-23 01:02:22
【问题描述】:

我有一个父组件,它呈现两个子组件。父级使用 useLocation 从 location.search 读取查询参数。孩子们有逻辑向 url 添加一些查询参数。所以一旦一个孩子完成了它的渲染,它会在 url 中添加一个查询参数,但是父级中的 useLocation 的值只有来自第二个孩子的查询参数。第一个孩子所做的更新似乎已被覆盖。

const Parent = () => {
  const location = useLocation();

  useEffect(() => {
    console.log(location.search)
  }, [location.search]);
  
  return (
    <div>
      <Child1 />
      <Child2 />
    </div>
  )
}
const Child1 = () => {
  const {search} = useLocation();
  const {push} = useHistory();
  useEffect(() => {
    // modify query parameter here
    const query = queryParams.parse(search);
    query.lang = 'en';
    push({
      search: queryParams.stringify(query)
    });
  }, [])

  return (<div>Child1</div>)
}
const Child2 = () => {
  const {search} = useLocation();
  const {push} = useHistory();
  useEffect(() => {
    // modify query parameter here
    const query = queryParams.parse(search);
    query.q = 'sample';
    push({
      search: queryParams.stringify(query)
    });
  }, [])

  return (<div>Child2</div>)
}

我希望第一个孩子将 url 更新为 ?lang=en,第二个孩子将其更新为 ?lang=en&amp;q=sample。但是发生的情况是第一个孩子将其更新为?lang=en,第二个孩子将其更新为?q=sample。即使他们都使用 useLocation 钩子,他们也不知道彼此的变化。并且父母总是只有第二个孩子的更新。 这里有什么错误?另外,有没有推荐的方法来做这样的事情?对我有用的解决方案是在孩子的 useEffect 中使用window.location.search,这样当第二个孩子正在渲染时,它就会知道第一个孩子所做的 URL 更改。 useLocation 挂钩未检测到此更改。我想真正了解这个钩子的工作原理。任何帮助表示赞赏。谢谢:)

【问题讨论】:

    标签: reactjs react-hooks react-router-dom


    【解决方案1】:

    这是我要做的:

    我有这些进口:

    import { useLocation, useHistory } from "react-router-dom";
    import queryString from "query-string";
    

    Child

    const Child = () => {
      const { search, pathname } = useLocation();
      const { push } = useHistory();
    
      // assume you want to add `lang` to query param
      useEffect(() => {
        const query = queryString.parse(search);
        query.lang = "en";
    
        push({ pathname, search: queryString.stringify(query) });
      }, [search]);
    
      return <div>Child</div>;
    };
    

    Parent

    const Parent = () => {
      const { search, pathname } = useLocation();
    
      useEffect(() => {
        const query = queryString.parse(search);
        console.log(query.lang);
      }, [search]);
    
      return (
        <div>
          <Child />
        </div>
      );
    };
    

    【讨论】:

    • 感谢您的回复。当只有一个孩子时,这就是我实际上正在做的事情和工作。我已更新问题以包含我所面临问题的更多详细信息。抱歉,首先问题不完整。
    • 您可能需要添加search 作为子useEffect 依赖,不确定它是否会修复您的错误,尚未测试。
    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2021-12-14
    • 2021-10-19
    • 2020-09-21
    • 2021-04-08
    • 2023-01-09
    相关资源
    最近更新 更多