【发布时间】:2019-06-26 18:42:48
【问题描述】:
如果this.state.number 等于数组中的数字,则触发此函数时会出现问题。
delay = async () => {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
await sleep(1000);
return <Redirect to="/dashboard" />
}
错误
Invariant Violation:对象作为 React 子对象无效(发现: [对象承诺])。如果你打算渲染一组孩子, 改为使用数组。
Home.js
import React, {Component} from 'react';
import {Redirect} from "react-router-dom";
import Grid from '@material-ui/core/Grid';
import './App.css';
import { withRouter } from 'react-router-dom'
class Home extends Component {
state = {
number: "",
numbers: ["111-111-1112, 111-111-1111, 111-111-1116, 111-111-1118"]
};
onChange = e => {
e.preventDefault();
this.setState({
number: e.target.value
});
};
delay = async () => {
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
await sleep(1000);
return <Redirect to="/dashboard" />
}
validate = myNum => this.state.numbers.find(num => num === myNum);
render(){
const validatedNumber = (
<div>
<span style={{ color: "green" }}>Activated ✅ </span>
{this.delay()}
</div>
);
return (
<div className="main">
<Grid container >
<Grid item sm={8} md={12} >
<input
type="text"
placeholder="Validate Number"
value={this.state.number}
onChange={this.onChange}
/>
<h2>
{this.validate(this.state.number) ? (
validatedNumber
) : (
<div>Not in the system</div>
)}
</h2>
</Grid>
</Grid>
</div>
);
}
}
export default Home;
【问题讨论】:
-
你不能“兑现”承诺。您应该在 return/jsx 之外调用该方法,而不是那样做。定时器完成时设置一个状态变量。并从该状态变量呈现重定向
-
或者您可以在超时结束时以编程方式重定向。
-
@AvinKavish 是的,但由于操作使用
react-router-dom,因此约定是呈现重定向。两者都可以工作:) -
约翰你能提供一个答案来说明你会怎么做吗?
标签: reactjs