다음과 같이 데이터 구조를 나열하는 작은 구성 요소가 있습니다. 내가 뭘하고 싶은지 update
버튼을 클릭 할 때 vote
키를 증가시키고 싶지만, 제대로 할 수있는 방법을 찾지 못했습니다. data
상태를 전체적으로 업데이트해야합니까? 나는 그것에 대해 거의 혼동하지 않는다.클릭시 반응 상태 업데이트
let MOCKDATA = [
{
id: 1,
name: 'Test 1',
vote: 0
},
{
id: 2,
name: 'Test 2',
vote: 2
}];
LinkListPage.js
import React from 'react';
// import LinksData from '../LinksData';
import Links from './Links';
// import update from 'react-addons-update';
//localStorage.setItem('linksData', JSON.stringify(LinksData));
let MOCKDATA = [
{
id: 1,
name: 'Test 1',
vote: 0
},
{
id: 2,
name: 'Test 2',
vote: 2
}];
class LinkListPage extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
data: MOCKDATA
};
this.update = this.update.bind(this);
}
componentDidMount() {
}
update() {
// this.setState({
// data:
// })
}
render() {
let list = this.state.data.map(links => {
return <Links key={links.id} update={this.update} data={links} />;
});
return (
<div>
<ul>{list}</ul>
{console.log(this.state.data)}
</div>
);
}
}
export default LinkListPage;
LinksPage.js
import React, {PropTypes} from 'react';
const Links = (props) => {
return (
<li>
<p>{props.data.name}</p>
<p>{props.data.vote}</p>
<button onClick={props.update}>Up</button>
</li>
);
};
Links.propTypes = {
data: PropTypes.object,
name: PropTypes.string,
vote: PropTypes.number,
update: PropTypes.func
};
export default Links;
HomePage.js
import React from 'react';
import LinkListPage from '../containers/LinkListPage';
const HomePage =() => {
return (
<div>
<LinkListPage />
</div>
);
};
export default HomePage;
답변을 읽은 후 나의 최종 결과는 다음과 같습니다. 어쨌든 고마워.
LinksPage.js
const Links = (props) => {
return (
<li>
<p>{props.data.name}</p>
<p>{props.data.vote}</p>
<button onClick={() => props.update(props.data.id)}>Up</button>
</li>
);
};
LinkListPage.js이 경우
update(id) {
const findId = LinksData.filter(item => {
item.id === id ? item.vote++ : false;
});
const data = Object.assign(...findId, LinksData);
this.state.data.sort((a, b) => {
return b.vote - a.vote;
});
//localStorage.setItem('linksData', JSON.stringify(this.state.data));
this.setState({data});
}
내가 반복해야합니까 반응에 불변 실제 데이터를 찾으려면'this.state.data '에요? – agriboz
글쎄, 당신은 알 수 있겠지만, 당신은 상태를 돌연변이 시켜서는 안됩니다. 업데이트하는 가장 좋은 방법은 다음과 같습니다. // id로 인덱스 찾기 const itemIndex = this.state.data.findIndex (c => c.id === id); // 새 배열을 만듭니다. const 데이터 = [ ... nodes.slice (0, itemIndex), Object.assign ({}, this.state.data [itemIndex], { 값 : 값 +1, }), ... nodes.slice (itemIndex + 1), ]; –
아니면 그냥 Array.map 함수를 사용하여 반복 할 수 있습니다. –