당신은 정말 여기 상태를 사용하고 tweets
변수가 그것의 일부가 될 수 있도록해야한다. 이를 위해 생성자를 추가
constructor() {
super();
this.state = {
tweets: [
{ id: 1, link: 'example.com' },
{ id: 2, link: 'example2.com' }
]
};
}
그런 다음 당신은 당신이 입력 중 하나에 입력 할 때마다 각 link
를 돌연변이해야합니다. 몇 가지 함정은 그래서 나를 하나씩 그들을 통해 가자 여기에 있습니다 :
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]}와 같이 렌더링 할 수 있습니다. –