无法重定向到搜索结果页面

时间:2019-07-16 23:35:58

标签: reactjs react-router

我的英语不好,所以可能很难解释我的意图。

我正在使用React,React路由器,Apollo客户端, 在生产版本中,当我单击搜索按钮时,由于出现错误消息而出现错误,因此无法重定向以呈现结果组件  错误:已超过最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,可能会发生这种情况。 React限制了嵌套更新的数量,以防止无限循环。

首先,我尝试不使用useEffect。如上所述,它会发生错误。

第二,我尝试使用useEffect挂钩,将重定向状态更改为false。并更改网址。但不呈现结果组件。 useEffect(()=> {setRedirect(false)},[重定向])

最后,我尝试制作另一个react应用来测试这种情况,而无需使用阿波罗和一些用于生产版本中干净代码的自定义组件。我在开发版本中尝试过。它完美无误地工作

// search-bar.js
function SearchBar(props) {
  // keywords for searching books
  const [keywords, setKeywords] = useState('');
  // search option
  const [option, setOption] = useState('All');
  // determine to redirect or not
  const [redirect, setRedirect] = useState(false);

  return (
    <>
      <div className="nav-search">
        <form
          role="search"
          onSubmit={ e => {
            e.preventDefault();
            setRedirect(true);
          }}
          className="form-search"
        >

          <NotRequiredInput
            type="search"
            label="Search keywords: "
            id="keywords"
            value={keywords}
            onChange={e => {
              setKeywords(e.target.value);
            }}
          />

          // it map the list's items to option
          <SelectBoxWithoutNone
            label="Search option: "
            id="search-option"
            value={option}
            onChange={e => {
              setOption(e.target.value);
            }}
            list={['All', 'Title', 'Author']}
          />

          <SubmitButton label="Search" />
        </form>
      </div>
      { redirect && <Redirect to={`/search?o=${option}&k=${keywords}`} /> }
    </>
  );
}

// app.js
<Query>
  {({loading, data}) => {
    if (loading)
    return (
      <Header>
      <NavBar>
      <main>
        <Suspense>
          <Switch>
            <Route exact path="/" component={HomePage} />
            <Route path="/search" render={props => <SearchResult {...props}/>}
    )
  }}
  // app.js looks like this with many route component.
  // also using React.lazy for code splitting

// search-result.js
function SearchResult (props) {
  const parsed = queryString.parse(props.location.search);
  const option = parsed.o;
  const keywords = parsed.k;

  return (
    <div className="div-search-result">
      <p>{option}</p>
      <p>{keywords}</p>
    </div>
  );
}

我希望它可以渲染结果组件(带有或不带有钩子) 但是如上所述,它发生了错误

更新:当我尝试直接在url路径上键入一些查询参数时,它可以工作。

0 个答案:

没有答案