あなたが本当にここの状態を使用して、あなたのtweets
変数はそれの一部で行う必要があります。
はJsfiddleを更新しました。これを行うには、コンストラクタを追加します。
constructor() {
super();
this.state = {
tweets: [
{ id: 1, link: 'example.com' },
{ id: 2, link: 'example2.com' }
]
};
}
は、その後、あなたが入力の一つに入力したときに、各link
を変異させる必要があります。いくつかの落とし穴はので、私は、1つずつ見ていきましょう、ここにあります
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});
}
は、まず、あなたがあなたの状態変数のコピーを作成する必要があります。これは、アンチパターンである状態を直接変更することなく、作業することができます。これはslice()
で行うことができます。
変更するオブジェクトのid
を送信しているので、配列内で項目を検索する必要があります(項目が順序付けられていない場合)。これはfindIndex()
で行われます。そのようなインデックスが見つからないシナリオを扱うことができます(私はそれをしていません)。
ここで、配列内で指定されたid
キーのオブジェクトがどこにあるかを知りました。次に、そのアイテム(オブジェクト)のコピーを作成します。これは、状態を直接変更するのを防ぐためです。 Object.assign()
でこれを行います。
今、私たちは中に型指定された入力値にlink
を変更します。新しいもの(obj
)で古いアイテムのオブジェクトを交換し、新しいもの(arr
)と古いtweets
配列を置き換えます。
ここでは完全な例です:
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>
ツイートの配列ではなく、(setStateを使用して)状態の入力からテキストを保存する必要があります。それで、あなたは{this.state.tweetsText [tweet.id]}のようなものでレンダリングできます。 –