我想我会这样处理它...
在您的容器或顶级组件中,创建一个用于保存脚注的数组。然后将此数组作为道具传递给可能呈现脚注的任何组件,以及必须在任何其他组件之后呈现的脚注呈现组件。
const DocComponent = () => {
const footnotes = [];
return (
<div>
<SomeContent footnotes={footnotes} />
<SomeOtherContent footnotes={footnotes} />
<EvenDifferentContent footnotes={footnotes} />
<Footnotes footnotes={footnotes} />
</div>
);
};
请注意,脚注数组必须通过 props 向下传递到所有可以呈现对脚注的引用的组件。每次组件呈现脚注引用时,它都会向数组添加脚注,如下所示:
const SomeContent = ({footnotes}) => {
footnotes.push('This is the footnote text.');
const footnoteIndex = footnotes.length;
return (<p>Hermansen and Shihipar, et al [{footnoteIndex}]</p>);
};
当执行到达脚注组件时,相同的脚注数组实例将通过 prop 传递给它。在执行时,数组将填充所有需要显示的脚注。您可以直接以简单的方式渲染它们:
const Footnotes = ({footnotes}) => {
const inner = footnotes.map(
(footnote, index) => (<li>[{index+1}] {footnote}</li>) );
return (<ul>{inner}</ul>);
};
这种实现肯定与组件的渲染顺序耦合。因此,渲染中的组件顺序应该与您希望脚注出现的视觉顺序相匹配。
这是一个 jsfiddle - https://jsfiddle.net/69z2wepo/79222/