【问题标题】:React Router v4 Redirect Passing State from Search to ResultsReact Router v4 将传递状态从搜索重定向到结果
【发布时间】:2017-06-12 23:30:27
【问题描述】:

有一个搜索组件,当有效负载返回时,它会重定向到结果组件。希望该结果组件使用React Router v4 Redirect 显示通过的搜索状态。我在文档中的假设是使用state: { referrer: currentLocation } 可以传递一个对象。

搜索

export default class Search extends Component{
  constructor(props){
    super(props);
      this.state = {
        searchValue: '',
        results:[]
      }
    this.handleKeyPress = this.handleKeyPress.bind(this);
  }

  handleKeyPress = (e) => {
    let searchParam = e.target.value;
    if (e.key === 'Enter'){
      axios
        .get(URL+searchParam)
        .then((response) => {
          this.setState({results: response.data});
        });
    }
  };

  render(){
    return(
      <div>
        <input
          ref="search"
          type="text"
          placeholder="Search"
          onKeyPress={this.handleKeyPress.bind(this)}
        />
        {this.state.results.length > 0 &&
          <Redirect to={{
            pathname: '/results',
            state: { results: this.state.results }
          }} />
        }
      </div>
    );
  }
}

结果

export default class Results extends Component{
  constructor(props){
    super(props);
    this.state = {
      results:[] // <<<<<< Not sure if this needs set
    }
  } 
  render(){
    console.log('SEARCH RESULTS STATE', this.state); // <<<< this either returns undefined or just an empty array depending if initial state is set
    return(
      <div>
        <h1>Search Results</h1>
      </div>
    );
  }
}

除非我没有正确阅读,否则问题似乎是当重定向发生时,没有任何东西被传递到结果组件中。

如果输入值并成功重定向,则会发生搜索状态返回 Object {searchValue: "", results: Array(1)} 但是搜索结果状态返回 Object {results: Array(0)}undefined,具体取决于初始状态设置。

还在结果中尝试了不同的组件生命周期,但无法以这种方式获取任何传递的数据。我认为componentWillRecieveProps(nextProps, nextState){} 可能能够获取一些传递的数据,并且可以通过这些方式设置状态。

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    在主类组件的 render() 方法的开头,您必须编写以下代码:

    if (isLoggedIn){
        return <Redirect to={{
          pathname: '/anyPath',
          state: { stateName: this.state.anyState}
        }} />;
    }
    

    在与路由/anyPath 关联的组件中,您必须提取传递的状态调用this.props.location.state.stateName。在您的确切情况下,您应该在结果类中调用this.props.location.state.results。您可以从 Results 类中删除构造方法。

    isLoggedIn 可能是另一种状态,您可以首先在主组件的构造函数 Method 中将其设置为 false。然后isLoggedIn 可以在您的用户单击按钮时设置为 true,因此您会将您的应用重定向到另一个具有首选状态的路由。

    【讨论】:

    • 如何以编程方式执行此操作,例如使用useHistory
    • 如果我们在重定向中使用状态?那么我们要在哪里提取它以在组件中使用?我们应该如何使用它?
    • RohanDevaki 和@Buts 很抱歉,但我在 3 年前回答了这个问题。有关它的更多信息,请参阅文档。
    【解决方案2】:

    看起来该对象已通过,但它嵌套在 location.state 中并且看起来不够深。

    【讨论】:

    • 您能否详细说明您找到的解决方案。
    • 自从看到这个已经有一段时间了,我无法再访问代码库或应用程序了。我认为让事情更清楚的是,我正在寻找的是 location.state,但我没有深入到那个对象中寻找我需要的东西。
    猜你喜欢
    • 2019-07-24
    • 2018-01-29
    • 1970-01-01
    • 2018-02-28
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多