如何根据字段的值更改路由

IT技术 reactjs
2021-05-17 16:24:46

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

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

我预先感谢您的帮助和回答。

所以我使用了 goBack 和 push props。但是即使字段为空也无法返回上一页

我的组件 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;
1个回答

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

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

解决方案是history.push仅在第一个change事件调用您可以添加额外的字段来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)
             })

          }
       }
    ... 
}