Guten Tag!React Variablen ändern in Jsx
Ich habe herum gespielt, nachdem ich einem Tutorial gefolgt bin und bin auf ein Problem gestoßen, das ich anscheinend nicht verstehe.
Immer, wenn ich auf Variablen durch einen this.props.updateSurveyText(this.props.index, newText)
passieren ändern sie zurück zu den alten Variablen, wenn sie in zu bekommen updateSurveyText={this.updateSurvey.bind(i, newText[0], newText[1])}
Logging zeigt die richtigen Variablen in der ersten Funktion, aber wenn ich sie in der zweiten Funktion log sind sie unverändert.
Hilfe wird sehr geschätzt!
Umfrage:
import React from 'react';
import ReactDOM from 'react-dom';
export default class Survey extends React.Component{
constructor(props){
super(props);
this.state = {
editing : false,
title : "",
desc : "",
};
this.edit = this.edit.bind(this);
this.save = this.save.bind(this);
this.remove = this.remove.bind(this);
}
edit() {
this.setState({editing: true});
}
remove() {
console.log('delete');
this.props.deleteFromBoard(this.props.index)
}
save() {
var title = this.refs.newTitle.value;
var desc = this.refs.newDesc.value;
var newText = [title, desc];
console.log(newText[0]);
this.props.updateSurveyText(this.props.index, newText);
this.setState({editing: false});
}
renderNormal(){
return(
<div className="surveyContainer">
<div className="surveyTitle">{this.props.children[0]}</div>
<div className="surveyDesc">{this.props.children[1]}</div>
<button onClick={this.edit} className="button-primary">Edit</button>
<button onClick={this.remove} className="button-primary">Remove</button>
</div>
);
}
renderForm(){
return(
<div className="surveyContainer">
<textarea ref="newTitle" defaultValue={this.props.children[0]}></textarea>
<textarea ref="newDesc" defaultValue={this.props.children[1]}></textarea>
<button onClick={this.save} className="button-primary">Save</button>
</div>
);
}
render(){
if(this.state.editing){
return this.renderForm();
}else{
return this.renderNormal();
}
}
}
Verpflegung:
import Survey from './Survey.jsx';
import React from 'react';
import ReactDOM from 'react-dom';
export default class Board extends React.Component{
constructor(props){
super(props);
this.state = {
surveys: [
],
};
this.updateSurvey = this.updateSurvey.bind(this);
this.removeSurvey = this.removeSurvey.bind(this);
this.eachSurvey = this.eachSurvey.bind(this);
this.addSurvey = this.addSurvey.bind(this);
}
addSurvey(title, desc){
var arr = this.state.surveys;
arr.push([title, desc]);
this.setState({surveys: arr})
}
removeSurvey(i){
var arr = this.state.surveys;
arr.splice(i, 1);
this.setState({surveys: arr})
}
updateSurvey(newTitle, newDesc, i){
console.log(newTitle);console.log(newDesc);
var arra = this.state.surveys;
arra[i] = [newTitle, newDesc];
this.setState({surveys: arra});
}
eachSurvey(newText, i){
return(
<Survey key={i} index={i} updateSurveyText={this.updateSurvey.bind(i, newText[0], newText[1])} deleteFromBoard={this.removeSurvey.bind(i)}>
{newText[0]}
{newText[1]}
</Survey>);
}
render(){
return(
<div>
<button onClick={this.addSurvey.bind(null, "Titel", "Desc")}>Add new</button>
<div className="board">
{this.state.surveys.map(this.eachSurvey)}
</div>
</div>
)
}
}
Vielen Dank für das Clearing nach oben, die einige seltsame Verhalten als gut aufgrund der Bindung erklärt. Ich bin mir jedoch nicht ganz sicher, wie ich einen Zustand ohne Bindung aktualisieren kann oder wie ich die Bindung anders verwende. Können Sie einen Hinweis geben, wie Sie das Problem beheben können? – Conroyd
Binden Sie keine Variablen an 'updateSurvey', wenn Sie sie an' updateSurveyText' übergeben. Ihre Umfragekomponente hat bereits den Index in Requisiten und die Textwerte werden aus Ihren Referenzen übernommen. Einfach "updateSurveyText = {this.updateSurvey}" übergeben und in der 'save' -Funktion mit den richtigen Argumenten aufrufen' this.props.updateSurveyText (newTitle, newDesc, this.props.index); 'Das muss nicht sein Wickeln Sie die Textstücke in ein Array. Stellen Sie sicher, dass Sie das 'this.props.index' als drittes Argument übergeben. In Ihrem Beispiel sind die Argumente nicht in der richtigen Reihenfolge. – jbielick
Vielen Dank, dass Sinn macht! Wie Sie jedoch in meiner updateSurvey-Funktion sehen, rufe ich den Zustand folgendermaßen auf: var arra = this.state.surveys; Dies führt zu einem Typfehler: this.state ist nicht definiert. Soll ich den Zustand auch in die Funktion übergehen? – Conroyd