当前位置: 首页 > 知识库问答 >
问题:

从react router v4中的redux操作重定向

督劲
2023-03-14

我在应用程序中使用了react router v4进行路由。在主页中,有一个表单。当用户填写表单并点击submit按钮时,操作将被调度(ShowResultToFar),并应重定向到结果页面,该页面不是主页中的子页面,而是一个从上到下具有不同UI的不同页面。

我试图这样做,但行动没有分派只有路由已经过渡,但显示相同的主页,而不是新页面(结果)

index.js

ReactDOM.render(
  <Provider store={createStoreWithMiddleware(reducers)}>
    <ConnectedIntlProvider>
      <Router>
        <App />
      </Router>
    </ConnectedIntlProvider>
  </Provider>
  , document.querySelector('.app'));

app.js

render() {
  return (
      <div className="container-fluid">
        <Nav
          showModal={(e) => this.showModal(e)}
          hideModal={() => this.hideModal()}
          show={this.state.show}
          onHide={() => this.hideModal()}
        />
          <Banner />
          <Media />
          <Footer />
        </div>
        );
}

form.js(它是横幅的子组件,是应用程序的子组件)

onSubmit = (e) => {
  e.preventDefault();
  const originwithCountry = e.target.Origen.value;
  const originwithCity = originwithCountry.split(', ')[0];
  const cityFrom = base64.encode(originwithCity);
  const startDate = (new Date(e.target.startDate.value).getTime() / 1000);
  this.props.showResultofCar(cityFrom, cityTo, startDate);
  this.context.router.transitionTo('/result');
  }

render() {
  const { focusedInput } = this.state;
  const { intl } = this.props;
  return (
    <div className="form-box text-center">
      <div className="container">
        <form className="form-inline" onSubmit={this.onSubmit}>
          <div className="form-group">
            <Field
              name='Origen'
              component={renderGeoSuggestField}
            />
          </div>
          <div className="form-group">
            <Field
              name="daterange"
              onFocusChange={this.onFocusChange}
            />
          </div>
          <Link to="/result">
          <button type="submit" className="btn btn-default buscar">
            { intl.formatMessage({ id: 'buscar.text' })}
          </button>
        </Link>
        </form>
      </div>
    </div>
  );
}

result-parent.js

class ResultParent extends Component {
  render() {
    return (
      <div className="result-page">
        <Match pattern='/result' component={Result} />
      </div>
    );
  }
}

result.js

class Result extends Component {
render() {
  return (
    <div className="result-page">
      <ResultNav />
      <Filtering />
      <Results />
    </div>
  );
}
}

actions/index.js

export function showResultofCar(cityFrom, cityTo, date) {
  return (dispatch) => {
    dispatch({ type: 'CAR_FETCH_START' });
    const token = localStorage.getItem('token');
    console.log('date', date);
    return axios.get(`${API_URL}/car/{"cityFrom":"${cityFrom}","cityTo":"${cityTo}","date":${date}}.json/null/${token}`)
      .then((response) => {
        console.log('response is', response);
        dispatch({ type: 'CAR_FETCH_SUCCESS', payload: response.data });
      })
      .catch((err) => {
        dispatch({ type: 'CAR_FETCH_FAILURE', payload: err });
      });
  };
}

我的方法行不通。现在如何使用react router v4内部操作重定向?

此外,我不希望结果显示在应用程序组件(父),因为结果页面将完全不同,有自己的导航栏,过滤和结果选项。

注意:已使用React路由器v4

共有1个答案

佴英奕
2023-03-14

您可以做的是在您的App.js中创建一个重定向处理程序:

constructor(props) {
  super(props);
  this.handleRedirect = this.handleRedirect.bind(this);
  this.handleSubmitForm = this.handleSubmitForm.bind(this);
}

handleRedirect() {
  this.props.push('/result');
}

handleSubmitForm(cityFrom, cityTo, startDate) {
  this.props.showResultofCar(cityFrom, cityTo, startDate, this.handleRedirect);
}
...

并通过道具为表单组件提供可操作的SubmitForm。这样,您就不必将表单组件连接到Redux分派操作。

在ShowResultToFar操作中,您现在可以在promise成功时调用此重定向处理程序:

export function showResultofCar(cityFrom, cityTo, date, redirectOnSuccess) {
  ...
    .then((response) => {
      // console.log('response is', response);
      dispatch({ type: 'CAR_FETCH_SUCCESS', payload: response.data });
      redirectOnSuccess();
    })
  ...
}

我知道这可能不是最干净的方法,但它会为你工作。

 类似资料:
  • 问题内容: Redux thunk成功调度某些动作后,是否可以从动作创建者那里返回承诺/信号,并解决? 考虑以下动作创建者: 当Redux分派POST_SUCCESS或POST_ERROR操作时,我想在调用 doPost 操作创建者后 在组件中 异步调用某些函数。一种解决方案是将回调传递给动作创建者本身,但这会使代码混乱并且难以掌握和维护。我也可以在while循环中轮询Redux状态,但是那样效率

  • 我是一个新的反应,但我已经工作了很多年的Vue。当我需要等待一个动作完成时,我现在被困在一个区域。在操作完成后,我必须进行另一个操作调用或在那里执行一些操作。但它不会等待操作完成并开始执行下面的代码。 方法: 从其中调度操作的方法: 现在,在上面的代码中,重定向并不是在等待调度完成。我试过这个,但它不起作用:

  • 从研究中,我发现thunk是一种工具,您可以使用它将动作链接在一起和/或处理回调、异步动作和副作用。 我无法理解thunk中间件指南。他们总是引用store.dispatch(就像大多数关于redux的教程一样),但我从未真正调用调度,也从未访问过商店,所以我不确定如何实现他们提出的任何建议。(我假设这是因为我在反应中使用mapDispatchToProps......这在我的动作创建者文件中不是

  • 问题内容: 我注意到以下代码将用户重定向到项目内的URL, 然而,以下内容已按预期正确重定向,但需要http://或https:// 我希望重定向始终重定向到指 问题答案: 你可以通过两种方式来实现。 第一: 第二:

  • 我一辈子都不能让我的一个动作叫减速机。我已经在这个应用程序中编写了多个其他动作和减法器,效果非常好。 它是筛选函数的开始。我有一个文本输入字段,在这里我不断跟踪输入字段的状态,并将字段值分配给redux操作。我有一个控制台。记录操作内部,该操作会正确记录每次按键。 我似乎不能理解的是,为什么减速器不是在每个按键调用。我已经尝试了减速器内的多个console.log,但是没有一个被键盘记录下来。 第