我有一个小组件,列出了如下所示的数据结构。我想要做的是当我点击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});
}
答案 0 :(得分:5)
在这种情况下,我会将onClick
处理程序添加到LinksPage
组件。
class Links extends React.Component {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
}
onClick(e) {
// here you know which component is that, so you can call parent method
this.props.update(this.props.data.id);
}
render() {
return (
<li>
<p>{this.props.data.name}</p>
<p>{this.props.data.vote}</p>
<button onClick={this.onClick}>Up</button>
</li>
);
}
};
并更改您的update
功能:
class LinkListPage extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
data: MOCKDATA
};
this.update = this.update.bind(this);
}
update(itemId) {
// TODO: find and update your item, you can do it since you have an 'id'
const data = [...];
this.setState({
data,
});
}
}
答案 1 :(得分:1)
//将链接ID传递给LinkListPage组件中的update方法。 ref point读取此内容以处理深入理解的更新https://www.sitepoint.com/immutability-javascript/
//在update方法中使用immutablejs或es6导致状态在react
中是不可变的
.overridden-a {
position: static;
}
&#13;
答案 2 :(得分:0)
我会为此使用生命周期挂钩,因为onClick事件会对组件状态产生副作用。
由于我使用了componentDidUpdate()方法,因此当我尝试收听画布上的每次单击时,您可能会看到此示例。
class Canvas extends Component {
state = {
drawing: false,
x: 0,
y: 0,
};
componentDidUpdate() {
// this will log after every click on canvas
console.log(this.state.drawing, this.state.x, this.state.y);
}
mouseDownHandler = (e) => {
this.setState({
drawing: true,
x: e.clientX,
y: e.clientY,
});
};
render() {
return (
<div>
<canvas
onMouseDown={this.mouseDownHandler}
ref="canvas"
width={640}
height={425}
></canvas>
</div>
);
}
}
您可以尝试使用此代码段,看看是否更改了console.log()函数,您将发现它需要单击两次才能看到正确的协调。
我希望这很清楚:)。