Mehrere Parameter übergeben, um event-Handler Reagieren
So, ich bin versucht, zu reagieren, arbeiten mit ES6-syntax. In ES5 ich hatte setInitialState ohne einen Konstruktor, arbeitete mit der Funktion verbindliche syntax. Ich habe eine Liste der Preise, die ist willkürlich und ich will den Zustand ändern, wenn das input-element geändert wird. Aber der richtige Preis muss geändert werden.
Ich bin mir auch nicht ganz sicher, das ist der richtige Weg, es zu tun. Kann mir bitte jemand sagen, den letzten Weg dieses sollte getan werden?
Hier ist mein code:
import React, {Component} from 'react'
import 'bootstrap/dist/css/bootstrap.css';
export default class PriceTable extends Component {
constructor(props, context) {
super(props, context);
this.state = {
pid: this.props.pid || "12345",
name: this.props.name || "name",
prices: this.props.prices || [
{count: 1, desc: 'one', price: 8.25},
{count: 6, desc: 'six', price: 7.60},
{count: 12, desc: 'twelve', price: 6.953}
]
};
this.setPid = this.setPid.bind(this);
this.setName = this.setName.bind(this);
this.setCount = this.setCount.bind(this, i);
this.setDesc = this.setDesc.bind(this, i);
this.setPrice = this.setPrice.bind(this, i);
this.logDebug = this.logDebug.bind(this);
}
setPid(e) {
this.setState({pid: e.target.value})
}
setName(e) {
this.setState({name: e.target.value})
}
setCount(i, e) {
var newPrices = this.state.prices
newPrices[i].count = e.target.value
this.setState({prices: newPrices})
}
setDesc(i, e) {
var newPrices = this.state.prices
newPrices[i].sec = e.target.value
this.setState({prices: newPrices})
}
setPrice(i, e) {
var newPrices = this.state.prices
newPrices[i].price = e.target.value
this.setState({prices: newPrices})
}
_renderPriceRow(price, i) {
return (
<tr key={i}>
<td >
<input type="text" className="form-control" defaultValue={price.count} onChange={this.setCount(this, i).bind(this, i)}/>
</td>
<td >
<input type="text" className="form-control" defaultValue={price.desc} onChange={this.setDesc(this, i).bind(this, i)}/>
</td>
<td >
<input type="text" className="form-control" defaultValue={price.price} onChange={this.setPrice(this, i).bind(this, i)}/>
</td>
</tr>
);
}
render() {
return (
<div className="row">
...
</div>
);
}
}
- Und das ist der Fehler...
PriceTable.jsx:21 Uncaught ReferenceError: i is not defined
at new PriceTable (PriceTable.jsx:21)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie verbindlich sind die Funktionen falsch
Im Konstruktor müssen Sie nicht das argument, Sie brauchen nur binden Sie es wie
this.setDesc = this.setDesc.bind(this);
Auch In Ihrem onChange, wenn Sie wollen, übergeben Sie Parameter an die Funktion geben Sie es mit binden und nicht als Argumente übergeben, und binden Sie diese erneut .
Sie gesamte code sieht wie
Sie könnten auch Gebrauch machen von Pfeil-Funktionen zum übergeben von Parametern wie
Uncaught TypeError: Cannot read property 'setCount' of undefined at _renderPriceRow
this
als Referenz zu nennen, diesetCount
Funktion und wothis
in der Funktion bezieht sich auf den Kontext der Funktion selbst, wenn Sie nicht binden Sie es. viel wie Bindung, welche anderen Funktionen verwendensetState
Verwenden Sie die
onChange
Methode wie diese:Entfernen Sie diese Zeilen aus
constructor
:Können wir
bind
diefunction
imconstructor
, wo keine zusätzlichen parameter erforderlich ist, wie diesefunctions
in Ihrem Fall:Aber wenn in jedem
function
Sie möchten, übergeben Sie einen zusätzlichen parameter, dann müssen Sie entwederarrow function
oderbind
dassfunction
mithilfe.bind(this, parameter)
.Hinweis:
Etwas anderes, was Sie ändern müssen, hier ist der Weg, den Sie aktualisieren die
state
Werte, sollten Sie niemals mutieren state variable direkt. Bei der Zuordnung einesarray
zu jeder variable, die variable wird an die Referenz, diearray
, bedeutet auch immer änderungen, die Sie tun, um diese variable auf den ursprünglichenarray
.So dass Sie brauchen, um eine Kopie dieser variable und führen Sie dann die änderungen auf und verwenden Sie
setState
zum aktualisieren der Werte.Als pro DOC:
Uncaught TypeError: Cannot read property 'setCount' of undefined at _renderPriceRow
_renderPriceRow
Funktion.this._renderPriceRow = this._renderPriceRow.bind(this);