【问题标题】:React - How to redirect to another component on Search?React - 如何重定向到搜索上的另一个组件?
【发布时间】:2019-03-07 18:26:57
【问题描述】:

所以我正在为学校开发一个应用程序,但我已经被一个问题困扰了两天。我正在构建一个从 TMDB 获取数据的搜索,并且一切正常。当我输入输入时,所有数据都会流入!但是,当我提交并尝试重定向到 /results 页面时,该页面链接到在定向到时显示 SearchResults 的组件,没有任何反应并且它停留在主页上......我尝试了 Redirect 但要么我使用不正确,或者在这种情况下我不应该使用它。这是我的搜索组件的代码,如果您能帮助我,我将不胜感激!:

import React, { Component, Redirect } from 'react';
import axios from 'axios';

class Search extends Component {
  state = {
    query: '',
    results: []
  };

  getInfo = () => {
    axios
      .get(
        `https://api.themoviedb.org/3/search/tv?api_key=6d9a91a4158b0a021d546ccd83d3f52e&language=en-US&query=${
          this.state.query
        }&page=1`
      )
      .then(({ data }) => {
        this.setState({
          results: data
        });
      });
  };

  handleInputChange = e => {
    e.preventDefault();
    this.setState(
      {
        query: this.search.value
      },
      () => {
        if (this.state.query && this.state.query.length > 1) {
          if (this.state.query.length % 2 === 0) {
            this.getInfo();
          }
        } else if (!this.state.query) {
        }
      }
    );
  };

  render() {
    return (
      <div>
        <form>
          <input
            className='search'
            placeholder='⌕'
            type='text'
            ref={input => (this.search = input)}
            onChange={this.handleInputChange}
          />
        </form>
        {this.state.results.length > 0 && (
          <Redirect
            to={{
              pathname: '/results',
              state: { results: this.state.results }
            }}
          />
        )}
      </div>
    );
  }
}

export default Search;

【问题讨论】:

  • AFAIK React.Redirect 不存在。

标签: javascript reactjs react-native react-router


【解决方案1】:

您可以使用withRouter 来注入历史道具,然后执行:history.push(“/results”)

代码如下所示:

import React, { Component, Redirect } from 'react';
import axios from 'axios';
import { withRouter } from "react-router";

class Search extends Component {
  state = {
    query: '',
    results: []
  };

  componentDidUpdate(prevProps, prevState) {
  const { history } = this.props;
  if (prevState.results !== this.state.results) {
    history.push('/results');
  }
  }

  getInfo = () => {
    axios
      .get(
        `https://api.themoviedb.org/3/search/tv?api_key=6d9a91a4158b0a021d546ccd83d3f52e&language=en-US&query=${
          this.state.query
        }&page=1`
      )
      .then(({ data }) => {
        this.setState({
          results: data
        });
      });
  };

  handleInputChange = e => {
    e.preventDefault();
    this.setState(
      {
        query: this.search.value
      },
      () => {
        if (this.state.query && this.state.query.length > 1) {
          if (this.state.query.length % 2 === 0) {
            this.getInfo();
          }
        } else if (!this.state.query) {
        }
      }
    );
  };

  render() {
    return (
      <div>
        <form>
          <input
            className='search'
            placeholder='⌕'
            type='text'
            ref={input => (this.search = input)}
            onChange={this.handleInputChange}
          />
        </form>
      </div>
    );
  }
}

export default withRouter(Search);

这样你就以编程方式导航,使用来自 react 路由器历史的 push 方法。

您可以在此处阅读有关 withRouter HOC 的更多信息:https://reacttraining.com/react-router/web/api/withRouter

【讨论】:

  • 出于某种原因,该方法也不适用于我。也许这就是我设置应用程序的方式......我必须向某人展示 Github 存储库,看看他们是否能找到任何错误。这很奇怪哈哈
  • @JavontayMcelroy 不工作是什么意思?显示控制台错误或告诉我发生了什么。我们缺少一些东西?
  • 好吧,我猜“技术上”它正在工作,它没有记录任何错误,但是,/results 没有被推送到 URL 的末尾。它确实从 localhost:3000 到 localhost:3000/?每当我按回车...
  • @JavontayMcelroy 你在那个视图中有任何按钮吗?尝试向他们添加道具 type='button'
  • 哥们你太棒了!!谢谢!!上帝,我永远不会想出这个解决方案!谢谢!
【解决方案2】:

您是否使用 React Router 进行路由?您需要更改您的网址吗?没有太多需要这样的东西。将某人发送到 /results 只是老派,除非您要执行类似 /results?q=pulp&amp;amp;piction 之类的操作,以便有人可以刷新或直接链接到结果。

对于这样的事情,只需显示你的结果组件

{this.state.results.length && (
  <SearchResults results={this.state.results} />
)}

如果您正在使用路由器并且需要使用学校项目学校的路径,您的老师将满足愚蠢的业务需求,并提供有关您正在使用的更多信息。

【讨论】:

  • 我会试试你的解决方案。我不需要路径,只是被告知使用它哈哈。
  • 因此,传递到 SearchResults 中的信息只是显示在搜索字段下,而不是将 Home 组件切换到 SearchResults 组件。 :(
【解决方案3】:

“重定向”组件位于“react-router-dom”包中。 使用这种方法:

import { Redirect } from "react-router-dom";
import React, { Component } from 'react';

class Search extends Component {
//...

render() {

    const { results } = this.state
    const { props } = this.props

    return (results.length > 0 ? <Redirect
        to={{
            pathname: "/results",
            state: {
                results: results,
                from: props.location
            }
        }}
    /> : <form>
            <input
                className='search'
                placeholder='⌕'
                type='text'
                ref={input => (this.search = input)}
                onChange={this.handleInputChange}
            />
        </form>
    )
}

}

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2018-01-13
    • 2022-01-24
    • 2021-08-12
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多