Как реализовать document.getElementById в Gatsby (React) - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь написать функцию в моем проекте Gatsby. В обычных javascript проектах я бы использовал document.getElementById для управления элементом из DOM, но как этот способ манипуляции работает в Gatsby? Не могу найти никакой информации в Интернете.

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

1 Ответ

2 голосов
/ 09 июля 2020

В Gatsby (как и в любом проекте React) вы можете использовать функцию document.getElementbyId или другие функции DOM. Однако это считается плохой практикой, поскольку вы создаете виртуальную DOM, чтобы избежать доступа к реальной DOM из-за огромного влияния на производительность (например, jQuery).

Конечно, вы можете используйте их, но, в частности, в Gatsby, поскольку он выполняет предварительную визуализацию вашего проекта и functions / logi c перед созданием некоторых глобальных объектов, это может вызвать серьезные проблемы. Большинство этих проблем объясняется в Debugging HTML Builds (из официальной документации Gatsby). Другими словами, window или document могут не быть созданы в тот момент, когда ваша функция их запрашивает.

Вы можете избежать этих проблем, используя жизненный цикл React (componentDidMount или useEffect хук) потому что они ждут, пока сгенерируется дерево DOM, чтобы запустить его.

Отвечая на ваш вопрос; если вы хотите избежать использования высокоэффективной DOM-функции, вам следует использовать React ref.

const Post= ({ data }) => {
  const postReference = useRef(null),

  return <Layout>
      <div ref={postReference} dangerouslySetInnerHTML={{ __html: post.html }} />
};

В этом фиктивном примере postReference.current будет иметь точно такую ​​же информацию, как document.getElementById(postId) . И это имеет низкое влияние на производительность.

Если вы все еще хотите использовать функцию document.getElementById, вы должны сделать что-то вроде:

const Post= ({ data }) => {
  useEffect(()=>{
   console.log(document.getElementById("myPost"))
  }, []):

  return <Layout>
      <div id="myPost" dangerouslySetInnerHTML={{ __html: post.html }} />
};

Ссылки: https://reactjs.org/docs/refs-and-the-dom.html

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

Вы можете игнорировать эти предупреждения, но я бы посоветовал этого не делать. Они появляются из-за конфигурации ESLint. Чтобы удалить его, вам просто нужно найти .eslintrc.json в папке root и удалить эту строку: "no-unused-vars": "warn".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...