Как определить обработчик событий глобальной области видимости для рендеринга на стороне сервера React

По сравнению с рендерингом на стороне клиента, я предпочитаю использовать рендеринг на стороне сервера для приложения с небольшим взаимодействием с пользователем. А для компиляции кода на стороне сервера - веб-пакет.

Есть сценарий, который я хочу обновить marginTop таблицы после визуализации компонента. Если это рендеринг на стороне клиента, реализация будет перечислена следующим образом

componentDidMount() {
  const node = ReactDOM.findDOMNode(this.refs.table);
  node.style.marginTop = `-${height}`;
}

Однако в ssr компонент DidMount никогда не вызывается при визуализации компонента. Поэтому я поместил эти коды в componentWillMount и обновил исходный код следующим образом

document.addEventListener("DOMContentLoaded", function(event) {
  const node = document.getElementById('table');
  node.style.marginTop = `-${height}`;
});

тогда у него есть другая проблема.

document is not defined on server 

Я знаю причину, потому что код работает в среде узла. нет такого разнообразия документов, как среда браузера. Я могу придумать, как поместить код в функцию renderPage, которая используется для визуализации компонента React в html-строку при рендеринге сервера на стороне сервера. Но если поместить обработчик события в контекст верхнего уровня, он будет загрязнять другую отображаемую страницу.

router.get('*', ctx => {
  match({ routes: routes, location: ctx.url }, (err, redirect, props) => {
    if (err) {
      ctx.throw(err.message, 500);
    } else if (redirect) {
      ctx.redirect(redirect.pathname + redirect.search)
    } else if (props) {
      const appHtml = renderToString(<RouterContext {...props}/>);
      ctx.body = renderPage(appHtml);
    } else {
      ctx.throw(404, 'not fount');
    }
  })
})
function renderPage(appHtml) {
  return `
    <!doctype html public="storage">
    <html>
    <meta charset=utf-8/>
    <title>My First React Router App</title>
    <div id=app>${appHtml}</div>
    <script type='text/javascript'>
      document.addEventListener("DOMContentLoaded", function(event) {
        const node = document.getElementById('table');
        node.style.marginTop = `-${height}`;
      });
    </script>
  `
}

Я также нашел другое разрешение. Компонент React для привязки событий в глобальной области., Я не думаю, что это лучшее разрешение.

Поэтому я хочу спросить, есть ли лучший способ манипулировать DOM-узлом, который обычно помещается в componentDidMount или componentDidUpdate, как рендеринг на стороне клиента.

1 ответ

Управлять DOM-узлом таким способом, как вы, бесполезно. React возьмет под свой контроль DOM, после того, как в следующий раз вы будете перерисовывать приложение, установленный вами запас будет переопределен React.

Я рекомендую вам использовать встроенный стиль, чтобы манипулировать любым стилем, который вам нравится.

render() {
  const divStyle={'marginTop': '100px'}

  return <div style={divStyle}></div>
}

Также позвольте функции рендера позаботиться о UI.

Есть ли какая-то причина, по которой вам нужно сбросить marginTop в жизненном цикле React, а не в функции рендеринга напрямую?

Другие вопросы по тегам