According to this line a react component will only mount if the innerHTML is empty.
// javascript/webpacker_react-npm-module/src/index.js:72
if (node.innerHTML.length === 0) this.render(node, component)
This works well for initial page loads that are not rendered via the Turbolinks cache, but components will not re-mount after navigating around an app that utilize Turbolinks caching. This can be replicated with the following steps:
- Use
react_component on page one which mount's just fine.
- Click link to visit
page two. page one's html is cached, the component is unmounted and page two is rendered.
- Click the back button,
page one is rendered from the Turbolinks cache and the component will not be re-mounted as the components innerHTML is not empty
This is not noticeable for simple components that render static text, but becomes immediately apparent if a component that changes state over time (showing the current time, polling for new data, etc.).
Is there a reason for ensuring innerHTML is empty before mounting a component? Or perhaps the components should be un-mounted on turbolinks:before-cache to avoid being cached all together?