Давайте немного расскажем о том, как это работает.Когда вы выполняете классический SPA без какого-либо внутреннего механизма, вы обычно делаете что-то вроде
ReactDOM.render(<App />, document.getElementByID('root'))
, что просто отображает корневой компонент вместо <div id="root" />
.Когда вы применяете шаблоны Rails сверху, вы соединяете 2 разных мира.ReactDOM
и тонкий шаблонизатор Rails (вероятно), но они ничего не знают друг о друге.ReactRails
- это на самом деле просто подпрограмма, которая выполняет что-то вроде этого:
- 1 Внедрить пользовательский сценарий response-rails на страницу
- Ожидание готовности DOM
- Собрать все
[data-react-class]
elements - Итерируйте их и вызывайте
ReactDOM
с реквизитом.
Вы можете думать об этом, как о вызове нескольких «мини-приложений», но на самом деле это только компоненты (реакция не различает приложение / компонент, это всегда просто компонент)
Таким образом, код выглядит примерно так (я не проверял исходный код, но написал собственную реализацию react-rails
для своей компании)
function init () {
const elements = document.querySelectorAll('[data-react-class]')
if (elements.length > 0) {
Array.prototype.forEach.call(elements, node => {
if (node) {
mount(node)
}
})
}
}
function mount(node) {
const { reactClass, reactProps } = node.dataset
const props = JSON.parse(reactProps || '{}')
const child = React.createElement(window[reactClass], props)
ReactDOM.render(child, node)
}
Тогда DOM готов
document.addEventListener('DOMContentLoaded', e => {
init()
})
Сын на самом деле Rails ничего не знает о React, и React ничего не знает о Rails, если он не живет на window.
(ЭТОТ МЕТОД ВЫСОКО ОБНОВЛЕН.ДГОРедактировать HTML для DOM.Это означает, что в жизненном цикле ПЕРЕД HTML отправляется клиенту, существует так называемый транспортер, который компилирует эти компоненты, вы можете прочитать об этом здесь
- https://github.com/reactjs/react-rails#server-side-rendering
Так что он просто вызывает эти методы с помощью https://github.com/rails/execjs
Так что единственный способ, как «не выставлять» реквизиты клиенту, - это «предварительно визуализировать» компоненты на бэкэнде с помощьюкакой-то движок (либо некоторая реализация JS для вашего языка, либо непосредственно серверная часть node.js).Я надеюсь, что дал вам лучшую картину, как это работает и как это можно решить!