javascript - 无法解构“e.target”的属性“名称”,因为它未定义
问题描述
我收到一些错误消息,说无法解构“e.target”的属性“名称”,因为它在 createform() 方法中未定义。我不明白为什么我会得到它,并且我已经突出显示了给我错误的行。
import React from 'react';
import { Card, Container, Row, Button, Form, Col } from 'react-bootstrap';
import Select from 'react-select';
class Items extends React.Component {
constructor(props) {
super(props);
this.state = {
itemNames: '',
formdata: [{itemname: '', quantity: '', rate: '', unit: ''}]
}
}
async handleItems() {
const url = '/ItemNames'
const res = await fetch(url, {
method: 'GET',
headers: {
'Content-Type' : 'application/json',
},
})
const json = await res.json()
let arr = []
for(let i = 0; i < json.length; i++) {
let obj = json[i].name
arr.push({label: obj})
}
await this.setState({itemNames: arr})
}
componentDidMount() {
this.handleItems()
}
handleChange(i, e) {
console.log(i)
console.log(e)
const {name, value} = e.target
let formdata = [...this.state.formdata]
formdata[i] = {...formdata[i], [name]: value}
this.setState({formdata})
}
handleAdd() {
this.setState(prevState => ({
formdata: [...prevState.formdata, {itemname: '', quantity: '', rate: '', unit: ''}]
}))
}
createform() {
return this.state.formdata.map((el, i) => (
<div key={i}>
<Card className='mb-2'>
<Card.Body>
<Row className='mb-2'>
<Col>
<Form.Group controlId="formBasicSize" className = 'form-group'>
<Form.Label style={{fontWeight:'bold'}}>Item {i+1}</Form.Label>
**<Select value={el.itemname} name='itemname' onChange={this.handleChange.bind(this, i)} placeholder="Enter a Item Name" type="text" required options = {this.state.itemNames}/> //Getting error here**
</Form.Group>
</Col>
<Col>
<Form.Group controlId="formBasicSize" className = 'form-group'>
<Form.Label style={{fontWeight:'bold'}}>Rate (in Rupees)</Form.Label>
<Form.Control value = {el.rate} name = 'rate' onChange={this.handleChange.bind(this, i)} type="text" placeholder="Enter a number"/>
</Form.Group>
</Col>
</Row>
<Row className='mb-2'>
<Col>
<Form.Group controlId="formBasicSize" className = 'form-group'>
<Form.Label style={{fontWeight:'bold'}}>Quantity</Form.Label>
<Form.Control value = {el.quantity} name = 'quantity' onChange={this.handleChange.bind(this, i)} required type="text" placeholder="Enter a number"/>
</Form.Group>
</Col>
<Col>
<Form.Group controlId="formBasicSize" className = 'form-group'>
<Form.Label style={{fontWeight:'bold'}}>Quantity Unit</Form.Label>
<Form.Control value = {el.unit} name = 'unit' onChange={this.handleChange.bind(this, i)} required type="text" placeholder="Enter"/>
</Form.Group>
</Col>
</Row>
<Row style={{justifyContent: 'center'}} className='mb-1'>
<Button variant="danger" size="sm" className="btn" onClick={this.handleRemove.bind(this, i)}>
Remove Item
</Button>
</Row>
</Card.Body>
</Card>
</div>
))
}
render() {
let { formdata } = this.state
return(
<Container>
<Form className = 'form'>
{this.createform()}
<Row className='mt-3 mb-2'>
<Col>
<Button variant="primary" className="btn" onClick={this.handleAdd.bind(this)}>
Add Item
</Button>
</Col>
</Row>
<Row className='mt-3 mb-2'>
<Col>
<Button variant="primary" className="btn" block onClick={this.handleSubmit}>
Submit
</Button>
</Col>
</Row>
</Form>
</Container>
)
}
}
export default {Items}
请让我知道为什么事件未定义,因为它在其他输入中起作用,但在我调用 handleChange 时在 Select 输入中不起作用
解决方案
我不熟悉这种语法:const {name, value} = e.target
您可能希望将代码包装在 if 语句中以避免错误:
if(e && e.target) {
let formdata = [...this.state.formdata]
formdata[i] = {...formdata[i], [e.target.name]: e.target.value}
this.setState({formdata})
}
现在看着它,我不确定 e.target.name 是否有意义。不完全确定您在使用 name 变量做什么。
推荐阅读
- php - 如何使用 Yelp API 从 v2 迁移到 v3?
- android - Android Studio:加载时 MapView 应用程序崩溃
- python - 使用 matplotlib 时的警告
- ios - 应用程序试图在自身上呈现模态视图控制器
- python - 在 python 中重现 Matlab 的 SVD
- javascript - 将base 64(数据url)中的图像复制到excel?
- javascript - 如何将 Ajax 连接到外部 php 文件
- vim - YouCompleteMe GetDoc 预览窗口不会在选择时触发
- branch.io - Branch.io 智能横幅之旅无法检测应用是否已下载
- node.js - 如何在 Couchbase 中找到最大的地图减少结果