我遇到了这个测试问题,我不知道如何用 settimeout 测试组件。有人建议如何使用 settimeout 测试以下组件?非常感谢
import React, { PropTypes, Component } from 'react';
import styles from '../../../css/notification.css';
export default class Notification extends Component {
static propTypes = {
tagMetaUpdate: PropTypes.shape({
submitUpdatedTagDataSuccessful: PropTypes.bool
}),
actions: PropTypes.shape({
resetUpdatedTagDataSuccessfulFlag: PropTypes.func
})
};
constructor(props) {
super(props);
this.state = {
showMessage: true
};
}
hideMessage(actions) {
this.timer = setTimeout(() => {
this.state.showMessage = false;
actions.resetUpdatedTagDataSuccessfulFlag();
this.forceUpdate();
}, 3000);
}
render() {
const { tagMetaUpdate, actions } = this.props;
const output = (tagMetaUpdate.submitUpdatedTagDataSuccessful && this.state.showMessage) ?
<div className={styles.notification}>Tag meta data successfully edited.</div> : null;
if (this.props.tagMetaUpdate.submitUpdatedTagDataSuccessful) {
this.hideMessage(actions); // HERE IS THE BIT BLOCKING ME
}else {
this.state.showMessage = true;
}
return <div>{output}</div>;
}
}
答案 0 :(得分:2)
答案 1 :(得分:1)
直接改变国家通常是不明智的。尝试使用this.setState({})
,当您调用setState时,不需要this.forceUpdate。 React会自行更新您的组件。
此外,尝试使用render方法仅执行渲染。没有变异的状态和所有这些。
如果您直接在渲染方法中执行this.setState({ showMessage: true })
,则会抱怨它 - 它是不允许的。
React提供了一个名为componentWillRecieveProps
和componentWillUpdate
的生命周期钩子方法。您可以使用它们检查道具是否已更改,然后相应地执行setState。
componentWillReceiveProps(nextProps){
if(!_.isEqual(nextProps, this.props) {
if(nextProps.tagMetaUpdate.submitUpdatedTagDataSuccessful){
this.setState({ showMessage: true })
this.timer = setTimeout(() => {
this.setState({ showMessage: false })
actions.resetUpdatedTagDataSuccessfulFlag()
}, 3000)
}
}
}
请注意:
这些只是用法建议。你能告诉我更多关于你用于单元测试的框架吗?如果它开玩笑,我可以帮助一下。