我想我會處理這件事像這樣...
在容器中或頂級組件,創建控股腳註的數組。然後將這個數組作爲一個道具傳遞給任何可能渲染腳註的組件,還可以傳遞給一個腳註渲染組件,它必須在任何其他組件之後渲染。
const DocComponent =() => {
const footnotes = [];
return (
<div>
<SomeContent footnotes={footnotes} />
<SomeOtherContent footnotes={footnotes} />
<EvenDifferentContent footnotes={footnotes} />
<Footnotes footnotes={footnotes} />
</div>
);
};
請注意,腳註數組必須通過道具傳遞給所有可以呈現腳註引用的組件。每當一個組件呈現腳註參考,它增加了一個腳註到陣列像這樣:
const SomeContent = ({footnotes}) => {
footnotes.push('This is the footnote text.');
const footnoteIndex = footnotes.length;
return (<p>Hermansen and Shihipar, et al [{footnoteIndex}]</p>);
};
如果執行到達腳註組件,相同的腳註數組實例將通過支柱將其傳遞。在執行的那一刻,數組將填充所有需要顯示的腳註。您可以直接渲染它們:
const Footnotes = ({footnotes}) => {
const inner = footnotes.map(
(footnote, index) => (<li>[{index+1}] {footnote}</li>));
return (<ul>{inner}</ul>);
};
此實現無疑與組件的渲染順序相關聯。因此,在你的渲染組件順序應與你想腳註出現在可視順序
這裏是一個的jsfiddle - https://jsfiddle.net/69z2wepo/79222/
什麼是你的數據結構是什麼樣子?這看起來像應該與源數據一起整理的東西,所以組件只是渲染它們的東西。 – Aaron
我同意,可能會對數據本身進行預處理。我正在尋找一種類似於React的解決方案,以便我不必手動通過樹並更新所有這些節點。 –
你是否保存這份文件?它不會成爲一些數據結構嗎?你不能從中得到腳註計數嗎?它們是否被動態添加?如果是這樣,您可以在DOM層次結構中觸發一個事件。您還可以使用redux來存儲所有腳註。 –