过渡后无法反应<Redirect>

时间:2019-08-16 23:43:09

标签: javascript reactjs

我具有以下组件,该组件在完成动画后具有重定向路线,如下所示:

Menus.jsx

class Menus extends Component{
  constructor (props) {
    super(props);
    this.state = { 
        select: 'espresso',      
        isLoading: false,
        redirect: false
    };

  gotoCoffee = () => {
    this.setState({isLoading:true})
    setTimeout(()=>{
      this.setState({isLoading:false,redirect:true})
    },5000)  //Replace this time with your animation time
  }

  renderCoffee = () => {
    if (this.state.redirect) {
      return (<Redirect to={`/coffee/${this.state.select}`} />)
    }
  }

  render(){
    return (
      <div>
        <h1 className="title is-1"><font color="#C86428">Menu</font></h1>
        <hr/><br/>
        <div>
           {this.state.isLoading && <Brewing />}
           {this.renderCoffee()}
          <div onClick={this.gotoCoffee} 
               style={{textDecoration:'underline',cursor:'pointer'}}>
              <strong><font color="#C86428">{this.state.coffees[0]}</font></strong></div>
        </div>
      </div>
    );       
  }
}

export default withRouter(Menus);

动画名为onCLick

Brewing.jsx

import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';
import './css/mug.css'

class Brewing extends Component {
    constructor (props) {
    super(props);
  };
    render() {
        return (
            <div>
              <div className="cup">
                <div className="coffee"></div>
              </div>
              <div className="smoke"></div>
            </div>
        );
    }
}

export default withRouter(Brewing);  

这里是重定向的路由组件:

Coffee.jsx

class Coffees extends Component{
  constructor (props) {
    super(props);
    this.state = {
        select:'',
        template:''
    };
  };
  componentDidMount() {
    if (this.props.isAuthenticated) {
      this.getCoffee();
    }
  };
  getCoffee(event) {
    //const {userId} = this.props
    const options = {
      url: `${process.env.REACT_APP_WEB_SERVICE_URL}/coffee/espresso`,
      method: 'get',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${window.localStorage.authToken}`
      }
    };
    return axios(options)
    .then((res) => {
      console.log(res.data.data)
      this.setState({
        template: res.data.data[0].content
      })
    })    
    .catch((error) => { console.log(error); });
  };

    render(){
        var __html = this.state.template;
        var template = { __html: __html };

        return (
           <div id="parent">
           <h1 className="title is-1"><font color="#C86428">{this.state.select} playlist</font></h1>
            <hr/><br/>
            <div dangerouslySetInnerHTML={template}/>
          </div>
        );
    }
}

export default withRouter(Coffees);

但是 Menus.jsx 中的<Redirect>无法正常工作。...在浏览器中更改了url,但没有任何反应;仅当我刷新浏览器/coffee成功安装后。


  

我实际上需要发生的事情:

  1. 渲染菜单
  2. 点击链接
  3. 点击可渲染动画
  4. 动画制作完成后5秒钟后,
  5. <Redirect>/coffee

我想念什么?

4 个答案:

答案 0 :(得分:6)

当您说网址在浏览器中更改但没有任何反应时;仅在刷新浏览器/coffee成功安装后。

这可能是您的Routes的问题。

redirect到路径/coffee/${this.state.select}时,应该有Route处理此路径。

<Route path="/coffee/:select?" render={() => ( <Coffees isAuthenticated={true}/> )}/>

注意:请注意将exact道具添加到Route中。添加exact属性时,这意味着您的路径应与所有提供的参数完全匹配。

答案 1 :(得分:1)

您还需要在getCoffee函数中调用componentDidUpdate函数。

  componentDidMount() {
    if (this.props.isAuthenticated) {
      this.getCoffee();
    }
  };
  componentDidUpdate() {
    if (this.props.isAuthenticated) {
      this.getCoffee();
    }
  };

答案 2 :(得分:1)

您的重定向应该在render()内。

render(){
    if(this.state.redirect) {
        return(<Redirect to={`/coffee/${this.state.select}`} />)
    } else {
        return ( 
            <div>
               ...your component
            </div> ); 
    }
}

请注意,这种方式不需要使用renderCoffee()函数。

我在移动设备上,因此无法测试它是否有效。让我知道这是否适合您。

答案 3 :(得分:1)

您的Menu组件构造函数似乎没有右括号。

...

class Menus extends Component{
  constructor (props) {
    super(props);
    this.state = { 
        select: 'espresso',      
        isLoading: false,
        redirect: false
    };
  } // did you miss this?

gotoCoffee = () => {

...