【发布时间】:2018-06-23 01:42:57
【问题描述】:
我正在寻找有关如何在 React 中单击五个相关按钮之一来呈现五分之一表单的建议。我已经让它实际上适用于一种形式,但我很确定这不是 React 中应该做的事情。
有一个带有 5 个按钮的侧边栏和一个显示一些内容的内容区域。单击侧栏中的相应按钮后,其中一个表单应出现在内容区域中。一次只能显示一个表单。侧边栏和内容区域都是一个名为 GraphArea 的类中的函数,用于呈现它们。
AddNodes(侧边栏中的五个按钮之一):
const AddNodes = ({ showAdd }) => (
<li role="presentation" className="list-inline">
<a href="" className="nav-link" onClick={showAdd}>
<i className="fa fa-plus" aria-hidden="true"/> Add
</a>
</li>
);
export default AddNodes;
问题是,有五个表单和按钮...没有办法合理地继续这样下去。
我正在使用 Apollo 链接状态。默认情况下,所有 5 五个表单都不会呈现,因此它们的默认值为 false。这些值被写入缓存。 Apollo 查询并在点击时将缓存中的默认值更改为 true。
如果你能在这里告诉我正确的方式,那对我来说意义重大。我错过了在 React 中如何工作的“点击”,这将是一个很好的机会。这是侧边栏和内容区域的父完整组件:
GraphArea:(父级)
class GraphArea extends Component {
render() {
const { updateEditGraph, editGraph: { mode } } = this.props;
const showAdd = (e) => {
updateEditGraph(
{
variables: {
index: 'mode',
value: 'addNode'
}
});
e.preventDefault()
};
const showLink = (e) => {
updateEditGraph(
{
variables: {
index: 'mode',
value: 'addLink'
}
});
e.preventDefault()
};
return (
<div className="item">
<GraphSidebar showAdd={showAdd} showLink={showLink}/>
<GraphContent/>
</div>
)
}
}
export default compose(
graphql(updateEditGraph, {name: 'updateEditGraph'}),
graphql(getEditGraph, {
props: ({data: {editGraph}}) => ({
editGraph
})
})
)(GraphArea);
图表内容:
class GraphContent extends Component {
render() {
let content;
if (this.props.editGraph.mode === 'addNode') {
content = <AddNodesForm/>
} else if (this.props.editGraph.mode === 'addLink') {
content = <LinkNodesForm/>
} else {
content = null;
}
return (
<div className="content">
{content}
<Graph/>
</div>
);
}
}
export default compose(
graphql(getEditGraph, {
props: ({data: {editGraph}}) => ({
editGraph
})
})
)(GraphContent);
GraphSidebar:
const GraphSidebar = ({ showAdd, showLink }) => (
<div className="avatars">
<ul>
<AddNodes showAdd={showAdd} />
<SequenceNodes />
<EditNodes />
<LinkNodes showLink={showLink} />
<DeleteNodes />
</ul>
</div>
);
【问题讨论】:
-
GraphArea是 1 个表格,而您有 5 个表格,或者<div className="item" />是 1 个表格? -
<AddNodesForm />是表单。它在<div className="content">div 中。其中有五种形式,但这里的代码中只有一种。我发现atticuswhite.com/blog/… 上的 if else 渲染有很多改进的机会。我猜 if else 逻辑也更适合 switch 语句。我不明白的事情似乎与道具和状态有关。从我读到的,它一定是关于状态的,因为数据可以改变,但我不确定这在代码中是如何表现出来的。
标签: javascript reactjs apollo