Sie sollten wirklich einen Zustand hier verwenden und machen Sie Ihre tweets
variable Teil davon sein. Um dies zu tun, fügen Sie einen Konstruktor:
constructor() {
super();
this.state = {
tweets: [
{ id: 1, link: 'example.com' },
{ id: 2, link: 'example2.com' }
]
};
}
Dann müssen Sie jede link
mutieren, wenn Sie in einem der Eingänge ein. Es gibt ein paar Tücken hier, mich durch sie so gehen lassen one-by-one:
changeTweet = (id, e) => {
let arr = this.state.tweets.slice();
let index = arr.findIndex(i => i.id === id);
let obj = Object.assign({}, arr[index]);
obj.link = e.target.value;
arr[index] = obj;
this.setState({tweets: arr});
}
Zuerst müssen Sie eine Kopie Ihrer Zustandsvariablen erstellen. Dies gibt Ihnen etwas, mit dem Sie arbeiten können, ohne den Zustand direkt zu verändern, der Anti-Pattern ist. Dies kann mit slice()
erfolgen.
Da Sie das id
des zu ändernden Objekts senden, müssen wir es in unserem Array finden (falls die Elemente ungeordnet sind). Dies geschieht mit findIndex()
. Vielleicht möchten Sie das Szenario behandeln, in dem ein solcher Index nicht gefunden wird (ich habe das nicht getan).
Jetzt wissen wir, wo in dem Array das Objekt mit dem angegebenen id
Schlüssel ist. Erstellen Sie nun eine Kopie dieses Objekts (welches ein Objekt ist). Dies soll auch verhindern, dass der Zustand direkt mutiert wird. Tun Sie dies mit Object.assign()
.
nun die link
zum Eingangswert ändern, wie wir in getippt. Ersetzen Sie das alte Item-Objekt mit dem neuen (obj
) und den alten tweets
Array mit dem neuen (arr
) ersetzen.
Hier ist das vollständige Beispiel:
class App extends React.Component {
constructor() {
super();
\t this.state = {
\t tweets: [
{ id: 1, link: 'example.com' },
{ id: 2, link: 'example2.com' }
]
};
}
changeTweet = (id, e) => {
let arr = this.state.tweets.slice();
let index = arr.findIndex(i => i.id === id);
let obj = Object.assign({}, arr[index]);
obj.link = e.target.value;
arr[index] = obj;
\t this.setState({tweets: arr});
}
render() {
return (
<div>
{this.state.tweets.map(tweet =>
<div key={tweet.id}>
<input type="text" placeholder="text" onChange={(e) => this.changeTweet(tweet.id, e)} />
<a href={`https://twitter.com/intent/tweet?text=${tweet.link}`}>Tweet</a>
</div>
)}
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Sie müssen den Text von der Eingabe im Status speichern (mit SetState), nicht im Tweets-Array. Dann kannst du es mit etwas wie {this.state.tweetsText [tweet.id]} rendern. –