Как реализовать Three. js внутри Гэтсби? - PullRequest
2 голосов
/ 20 февраля 2020

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

const rootElement = document.getElementById("root");

Кроме того, я начинаю получать эту ошибку:

Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

Мой index.js:

import React, { Children, useRef, useState } from "react"

import {  Link } from "gatsby"

import { Canvas} from 'react-three-fiber'

import Layout from "../components/layout"

const IndexPage = () => {

  return(

    <Layout>

      <div>

        <h1>Hi</h1>

      </div>

      <canvas>

        <Children></Children>

      </canvas>

    </Layout>

    )

}

const rootElement = document.getElementById("root");

export default IndexPage

Есть идеи?

1 Ответ

5 голосов
/ 20 февраля 2020

Убедитесь, что вы установили three и react-three-fiber.

npm install three react-three-fiber 

Затем в свой компонент страницы gatsby просто импортируйте Canvas из react-three-fiber перед его использованием в JSX.

import React from "react"
import { Canvas} from 'react-three-fiber'

import Layout from "../components/layout"

const IndexPage = () => (
  <Layout>
    <Canvas />
  </Layout>
)

export default IndexPage

Относительно const rootElement = document.getElementById("root");:

Хотя Gatsby построен с React, вам не требуется выбирать элемент root, чтобы сделать ваш приложение. Если это звучит странно, вам следует потратить немного времени на то, чтобы прочесть документы Гэтсби .


Если бы вы использовали пример из реакции Документы с тремя волокнами , в Гэтсби это будет выглядеть примерно так:

import React, { useRef, useState } from "react"
import { Canvas, useFrame } from "react-three-fiber"

const Box = props => {
  // This reference will give us direct access to the mesh so we can animate it
  const mesh = useRef()

  // Set up state for the hovered and active state
  const [hovered, setHover] = useState(false)
  const [active, setActive] = useState(false)

  // Rotate mesh every frame, this is outside of React without overhead
  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))

  return (
    <mesh
      {...props}
      ref={mesh}
      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}
      onClick={e => setActive(!active)}
      onPointerOver={e => setHover(true)}
      onPointerOut={e => setHover(false)}
    >
      <boxBufferGeometry attach="geometry" args={[1, 1, 1]} />
      <meshStandardMaterial
        attach="material"
        color={hovered ? "hotpink" : "orange"}
      />
    </mesh>
  )
}

const IndexPage = () => (
  <Canvas>
    <ambientLight />
    <pointLight position={[10, 10, 10]} />
    <Box position={[-1.2, 0, 0]} />
    <Box position={[1.2, 0, 0]} />
  </Canvas>
)

export default IndexPage

Edit gatsby-react-three-fibre-example

...