gpt4 book ai didi

javascript - react 事件层次问题

转载 作者:数据小太阳 更新时间:2023-10-29 04:43:49 25 4
gpt4 key购买 nike

处理深度节点中也需要由父节点处理的状态更改的最佳方法是什么。这是我的情况:

<Table>
<Row prop={user1}>
<Column prop={user1_col1} />
<Column prop={user1_col2} />
</Row>
<Row prop={user2}>
<Column prop={user2_col1} />
<Column prop={user2_col2} />
</Row>
<TableFooter>
<FooterColumn prop={sum1} />
<FooterColumn prop={sum2} />
</TableFooter>
</Table>

每当有人更改列属性中的任何内容时,我只需要在该列组件中维护该值的状态。但是,我现在想要 FooterColumn 组件中这些值的总和。实现这一目标的最佳方法是什么?

如果我要传递状态变化,我必须在多个地方保存状态,然后再传递下去,这是一项非常繁琐的工作。最好使用 EventEmitter 还是我遗漏了什么?

最佳答案

因此,您只需要在父组件中跟踪状态,并将状态更新功能共享给子组件即可:

var Parent = React.createClass({
getInitialState: function() {
return {
users: [
{name: 'Matt', values: [1, 2]},
{name: 'user517153', values: [4, 5]}
]
};
},
updateValue: function(rowId, colId, newValue) {
var newUsersState = this.state;
newUsersState.users[rowId].values[colId] = newValue;
this.setState({users: newUsersState});
},
render: function() {
var rows = this.state.users.map(function(user, r) {
var cols = user.values.map(function(value, c) {
return (
<Column key={c} prop={value} rowId={r} colId={c} onChange={this.updateValue}/>
);
});

return (
<Row key={r} prop={user}>
{cols}
</Row>
);
});

// Yes, it could be more efficient if you did it all in one map/forEach - doing this in a second one for clarity
var footerCols = this.state.users.map(function(user) {
var sum = 0;
user.values.forEach(function(value) { sum+= value; });
return (
<FooterColumn prop={sum} />
);
});

return (
<Table>
{rows}
<TableFooter>
{footerCols}
</TableFooter>
</Table>
);
}
});

在您的 Column 类中,您只需要符合以下内容的内容:

var Column = React.createClass({
onChange: function(event) {
var props = this.props;

var newValue = event.target.value; // Get the new value somehow - this is just an example
props.onChange(props.rowId, props.coldId, newValue);
},
render: function() {
var props = this.props;

return (
<td onChange={this.onChnage}>{props.prop}</td>
);
}
});

希望这是有道理的。

关于javascript - react 事件层次问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34430927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com