我具有以下组件,该组件在完成动画后具有重定向路线,如下所示:
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
成功安装后。
我实际上需要发生的事情:
<Redirect>
至/coffee
我想念什么?
答案 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 = () => {
...