我有一个表示Page的组件,其中包含多个SectionHeader组件作为该Page的子级。我希望通过检查Page的子级SectionHeader动态创建目录。
<Page>
<TaleOfContents sections={this.props.children} />
<SectionHeader title={"Section A"} />
<TextBlock>
<p> Text here. </p>
</TextBlock>
<SectionHeader title={"Section B"} />
<TextBlock>
<p> Text here. </p>
</TextBlock>
</Page>
不幸的是,this.props.children
是未定义的,有没有办法动态地获取Page的这些子元素,并将它们呈现在TableOfContents中?
编辑:这是我的页面组件,它实际上只是一个很大的呈现方法,将一堆其他组件捆绑在一起。
/** @jsx React.DOM */
var React = require('react/addons');
// COMPONENTS
var TextBlock = require('../text_block.jsx');
var PaperHeader = require('../header_paper.jsx')
var SectionHeader = require('../header_section.jsx');
var TableOfContents = require('../table_of_contents.jsx');
var Page = React.createClass({
render: function() {
return (
<div>
<PaperHeader
title={"Page Title"}
authors={["Cole Gleason"]}
/>
<SectionHeader
title={'First Section'}
size={'large'}
/>
<TextBlock
key={"text_first"}
>
<p>
Text goes here.
</p>
</TextBlock>
<this.props.activeRouteHandler/>
</div>
);
}
});
module.exports = Page;
1条答案
按热度按时间xdyibdwo1#
你可以把内部组件放在一个数组中,迭代它们,然后呈现它们。
但是我不禁觉得你并没有真正以正确的方式使用React。你把React组件当作简单的模板来对待。下面这样的事情更有意义:
给予东西正确的结构是很重要的。我认为这更有意义,因为现在父节点和子节点之间有了真实的的关系。属于一个节的文本块应该位于该节内部。现在这并不能解决目录问题,但它是一个开始。例如,现在
Page
的所有直接子节点都是Sections
,这很有帮助。这样你就可以做更多的事情。如果你想在运行时构建一个真实的的动态目录,你应该寻找另一个地方来存储你的内容。你现在把模板和内容混合在一起,这并不理想。React组件中的通信实际上只有一种方式(下树),因此试图将数据从一个组件传递回一个兄弟或父组件并不容易,也不是一个好主意。2请查看Flux,了解更多关于数据应该如何流动的信息。
另一个好的阅读:https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0