【问题标题】:How to change the route according to the value of a field如何根据字段的值更改路由
【发布时间】:2019-08-14 13:08:37
【问题描述】:

我正在尝试在具有多个页面的应用程序中创建一个搜索页面,我使用 react router v5。

我的问题如下,我想在文本字段为空时返回上一页,否则如果输入字段中有条目,我想返回搜索页面('/search')

提前感谢您的帮助和回答。

所以我使用 goBack 和 push 道具。 但是即使字段为空也不能返回上一页

我的组件 Routes.js

 const Routes = (props) => {
    return (
       <div>
          <Route exact path="/" component={Home} />
          <Route
             exact
             path='/search'
             component={() => <Search query={props.text} />}
          />
          <Route path="/film/:id" component={MovieDetail} />  
          <Route path="/FavorisList" component={WatchList} />
          <Route path="/search/:search" component={Search} />
          <Route path="*" component={NotFound} />  
       </div>

  )}

我的组件 SearchBar.js

  class SearchBar extends React.Component {
      constructor(props) {
         super(props);

         this.state = {
            inputValue:'',
         };

       }

      handleChange = (event) => {

          if(event.target.value === '') {
              this.props.history.goBack()
              return;
          }

          if(event.target.value.length){
             this.props.history.push("/search")
             this.search(event.target.value)
          }
       }

       search = (query) => {
           //search results retrieved with redux 
           this.props.applyInitialResult(query, 1)
       }

       render() {
          return (
            <div>
               <input
                   type="text"
                   value={this.state.inputValue}
                   placeholder="Search movie..."
                   className={style.field}
                   onChange={this.handleChange.bind(this)}
               />  
            </div>
          );
        }


       export default SearchBar;

组件 App.js

       class App extends React.Component {
          render(){
              return (
                 <div>
                    <BrowserRouter>
                       <NavBar />
                       <Routes/>
                    </BrowserRouter>
                 </div>
              );
           }
        }

        export default App;

【问题讨论】:

  • 你有什么错误吗?
  • 不,我没有错误消息,我有意外的行为,如果我输入一个字符,则返回完成,但是当我输入更长的术语(如“不可能完成的任务”)时,返回不再完成.
  • 我在您的路线中没有看到对 SearchBar 的任何引用。您的应用程序中是否使用了SearchBar 组件?
  • 我的搜索栏已集成在我的导航栏中,如果有帮助,我会使用 App 组件更新我的帖子

标签: reactjs


【解决方案1】:

我认为问题在于您在每次更改事件时将新条目推送到 history。所以如果你例如输入 3 个字符,然后将 3 个相同的条目推送到 history 堆栈。因此,当您随后调用 history.goBack 时,它会重定向到历史堆栈中的上一个条目,在您的情况下为 /search(因此您保留在当前页面上)。

您可以将历史堆栈视为包含条目的数组 - 当您输入 3 个字符时,该数组将如下所示: ['/someInitialPath', '/search', '/search', '/search'] 调用goBack 会重定向到历史堆栈中的上一个路径,因此如果您现在调用goBack,您会得到指向当前页面的/search 路径的路径,因此您看不到任何变化。在这种情况下,如果您调用 goBack 3 次,您将被重定向到 /someInitialPath

解决方案是仅在第一个 change 事件上调用 history.push。您可以在state 中添加附加字段,指示是否首次调用handleChange。像这样的:

class SearchBar extends React.Component {
     constructor(props) {
         super(props);

         this.state = {
            inputValue:'',
            initialChange: true
         };

      }

      handleChange = (event) => {

          if(event.target.value === '') {
              this.props.history.goBack()
              this.setState({ initialChange: true }) // clear flag after redirect
              return;
          }

          if(event.target.value.length && this.state.initialChange){
             this.setState({
               initialChange: false
             }, () => {
               this.props.history.push("/search")
               this.search(event.target.value)
             })

          }
       }
    ... 
}

【讨论】:

  • 是的,我认为您是对的,但是如何防止在每次更改事件时更改此页面。如果这可以帮助你,我想重现 netflix 为他们的搜索系统所做的事情,我不知道 react router 是否是最好的解决方案。
  • 我已经用解决方案草稿更新了答案。 React-router 是不错的选择,实际上您的问题不是由这个库或其他库引起的,因此使用 react-router 或任何其他路由库都没有关系。但是 react-router 是最流行的库。详细的解决方案可能更复杂,但这取决于其他要求。但我确实希望我的回答能解决您的问题。
  • 您好,我刚刚尝试了您的解决方案,第一次成功,但是由于我想进行新的搜索,所以我没有返回搜索页面。
  • 我刚刚更新了改进版本(添加了清除标志)。请试试这个。
  • 我已经投了票,我会为这个问题创建一个新帖子。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多