该错误在我的地图函数中给出。
我正在遵循reactjs
教程,将值从一个组件的状态传递到另一个组件时,我一直遇到问题。
我正在使用axios.get()
连接到后端。
export default class Viewcustomer extends React.Component{
constructor(props) {
super(props)
this.state = {
Id:"",
name:"",
fax:"",
NIC: "",
type: "",
email: "",
website: "",
address: "",
phoneNo: "",
DOB: "",
note: "",
customer:[]
}
}
onChange = (e) => {
this.setState({[e.target.name]: e.target.value})
}
componentDidMount() {
axios.get(`http://localhost:5001/customer/view`)
.then(res => {
const customers = res.data;
this.setState({ customers });
})
}
render(){
return(
<table width="100%">
<tr>
<th>Id</th>
<th>name</th>
<th>fax</th>
<th>NIC</th>
<th>type</th>
<th>email</th>
<th>address</th>
<th>phoneNo</th>
<th>DOB</th>
<th>note</th>
</tr>
//Error raised by this line of code
{ this.state.customers.map(customer =>
<tr>
<td>{customer.Id}</td>
<td>{customer.name}</td>
<td>{customer.fax}</td>
<td>{customer.NIC}</td>
<td>{customer.type}</td>
<td>{customer.email}</td>
<td>{customer.address}</td>
<td>{customer.phoneNo}</td>
<td>{customer.DOB}</td>
<td>{customer.note}</td>
</tr>)}
</table>
)
}
}
修改
错误与标有引号的行有关,这是map()函数引发的问题,但是根本的问题是this.state.customers
是undefined
。
答案 0 :(得分:1)
this.state.customers.map(...
问题在于,this.state.customers
是在安装组件时设置的,并且仅在使用axios进行异步调用之后才设置。这意味着当第一次渲染组件时,尚未设置this.state.customers
。
可能的解决方案
要么在使用之前检查this.state.customers
是否存在,要么将其初始化为空数组。我注意到您正在将customer
(单数)初始化为一个空数组,这是拼写错误吗?
constructor(props) {
super(props)
this.state = {
Id:"",
name:"",
fax:"",
NIC: "",
type: "",
email: "",
website: "",
address: "",
phoneNo: "",
DOB: "",
note: "",
customers:[] // initialize customers, this.state.customers is now defined
}
}
答案 1 :(得分:1)
您应该知道的第一件事是componentDidMount
在render方法之后运行。因此,在第一个渲染中,您的customer
参数仍然是[]
,即使您在console.log()
中编写了一个简单的componentDidMount
,它也会在render方法之后运行。
通过运行以下代码,您可以了解正在发生的事情:
class Test extends React.Component {
constructor(props){
console.log('constructor')
}
render(){
console.log('render')
}
componentDidMount(){
console.log('componentDidMount')
}
}
结果将是这样的:
构造函数
渲染
componentDidMount
但是要解决您的问题,您应该在等待接收来自axios的响应时,显示一个微调器或类似的东西。您的组件可能是这样的:
export default class Viewcustomer extends React.Component{
constructor(props) {
super(props)
this.state = {
Id:"",
name:"",
fax:"",
NIC: "",
type: "",
email: "",
website: "",
address: "",
phoneNo: "",
DOB: "",
note: "",
customer:[]
}
}
onChange = (e) => {
this.setState({[e.target.name]: e.target.value})
}
componentDidMount() {
axios.get(`http://localhost:5001/customer/view`)
.then(res => {
const customers = res.data;
this.setState({ customers });
})
}
render(){
if(this.state.customers.length===0){
return(
<div>Loading...</div>
)
}
else{
return(
<table width="100%">
<tr>
<th>Id</th>
<th>name</th>
<th>fax</th>
<th>NIC</th>
<th>type</th>
<th>email</th>
<th>address</th>
<th>phoneNo</th>
<th>DOB</th>
<th>note</th>
</tr>
//Error raised by this line of code
{ this.state.customers.map(customer =>
<tr>
<td>{customer.Id}</td>
<td>{customer.name}</td>
<td>{customer.fax}</td>
<td>{customer.NIC}</td>
<td>{customer.type}</td>
<td>{customer.email}</td>
<td>{customer.address}</td>
<td>{customer.phoneNo}</td>
<td>{customer.DOB}</td>
<td>{customer.note}</td>
</tr>)}
</table>
)
}
}
}
如果有帮助,请给我投票:)
答案 2 :(得分:0)
您的问题是,在使用this.state.costumers
时,您的定义状态为customer
。
export default class Viewcustomer extends React.Component {
constructor(props) {
super(props)
this.state = {
Id: "",
name: "",
fax: "",
NIC: "",
type: "",
email: "",
website: "",
address: "",
phoneNo: "",
DOB: "",
note: "",
customers: []
}
}
onChange = (e) => {
this.setState(
{ [e.target.name]: e.target.value }
)
}
componentDidMount() {
axios.get(`http://localhost:5001/customer/view`)
.then(res => {
const customers = res.data;
this.setState({ customers });
})
}
render() {
const { costumers } = this.state:
return (
<table width="100%">
<tr>
<th>Id</th>
<th>name</th>
<th>fax</th>
<th>NIC</th>
<th>type</th>
<th>email</th>
<th>address</th>
<th>phoneNo</th>
<th>DOB</th>
<th>note</th>
</tr>
{customers.map(customer =>
<tr>
<td>{customer.Id}</td>
<td>{customer.name}</td>
<td>{customer.fax}</td>
<td>{customer.NIC}</td>
<td>{customer.type}</td>
<td>{customer.email}</td>
<td>{customer.address}</td>
<td>{customer.phoneNo}</td>
<td>{customer.DOB}</td>
<td>{customer.note}</td>
</tr>)}
</table>
)
}
}
这就是整个问题,因为当您将costumers
状态初始化为空数组时,map
方法将停止失败。希望这可以帮助。最好的祝福。
答案 3 :(得分:0)
如其他答案所述,this.state.customers
是undefined
抛出错误。这是因为最初在构造函数中您要初始化customer
而不是customers
,所以快速更改应该可以解决此问题。
我可以推荐您,因为您正在看教程,React Hooks是使用“无状态”(它们仍然保持状态)功能组件而不是类组件的非常强大且直观的方法。它们大大简化了组件的编码,并使处理状态变得更加容易。