添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Repository files navigation

react-spline

react-spline allows you to export and use Spline scenes directly in your React websites.

🌈 Spline is a friendly 3d collaborative design tool for the web.

Website Twitter Community Documentation

Table of Contents

  • Install
  • Usage
  • Next.js
  • Read and modify Spline objects
  • Listen to events
  • Trigger Spline events from outside
  • Lazy loading
  • Spline Component Props
  • Spline App Methods
  • Spline Events
  • Contributing
  • Install

    yarn add @splinetool/react-spline @splinetool/runtime
    npm install @splinetool/react-spline @splinetool/runtime

    Usage

    To use react-spline, first you have to go to the Spline editor, click on the Export button, select " Code " and then " React ".

    You should see this:

    You can copy the URL and pass it to the <Spline /> component in react:

    import Spline from '@splinetool/react-spline';
    export default function App() {
      return (
          <Spline scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode" />
        </div>
    

    You should be able to see the scene you exported in your React app.

    NOTE: If you are experiencing CORS issues, you can download the .splinecode file and self-host it; this will fix any CORS issue. To download, go to Spline's code export panel and click on the download icon visible in the prod.spline textarea.

    Next.js

    You can use this library in Next.js as well to take advantage of Server Side Rendering. By default the library will render on the client only, but if you use the import @splinetool/react/next the server will render an autogenerated blurred placeholder.

    Here is an example. Export as Next.js from the Spline editor to autogenerate the placeholder.

    import Spline from '@splinetool/react-spline/next';
    export default function App() {
      return (
          <Spline scene="https://prod.spline.design/KFonZGtsoUXP-qx7/scene.splinecode" />
        </div>
    

    Read and modify Spline objects

    You can query any Spline object via findObjectByName or findObjectById.

    (You can get the ID of the object by right-clicking on it and selecting Copy Development Object ID).

    import { useRef } from 'react';
    import Spline from '@splinetool/react-spline';
    export default function App() {
      const cube = useRef();
      function onLoad(spline) {
        const obj = spline.findObjectByName('Cube');
        // or
        // const obj = spline.findObjectById('8E8C2DDD-18B6-4C54-861D-7ED2519DE20E');
        // save it in a ref for later use
        cube.current = obj;
      function moveObj() {
        console.log(cube.current); // Spline Object => { name: 'Cube', id: '8E8C2DDD-18B6-4C54-861D-7ED2519DE20E', position: {}, ... }
        // move the object in 3D space
        cube.current.position.x += 10;
      return (
          <Spline
            scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode"
            onLoad={onLoad}
          <button type="button" onClick={moveObj}>
            Move Cube
          </button>
        </div>
    

    Listen to Spline Events

    You can listen to any Spline Event you set in the Events panel of the editor by attaching a listener to the Spline component.

    import Spline from '@splinetool/react-spline';
    export default function App() {
      function onSplineMouseDown(e) {
        if (e.target.name === 'Cube') {
          console.log('I have been clicked!');
      return (
          <Spline
            scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode"
            onSplineMouseDown={onSplineMouseDown}
        </div>
    

    You can find a list of all of the Spline Event listeners in the Spline Component Props section.

    Trigger Spline events from outside

    You can trigger any animation Event you set in the Events panel in the Spline Editor.

    You can use the emitEvent function via the spline ref, passing the event type and the ID of your object.

    (You can get the ID of the object in the Develop pane of the right sidebar).

    import { useRef } from 'react';
    import Spline from '@splinetool/react-spline';
    export default function App() {
      const spline = useRef();
      function onLoad(splineApp) {
        // save the app in a ref for later use
        spline.current = splineApp;
      function triggerAnimation() {
        spline.current.emitEvent('mouseHover', 'Cube');
      return (
          <Spline
            scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode"
            onLoad={onLoad}
          <button type="button" onClick={triggerAnimation}>
            Trigger Spline Animation
          </button>
        </div>
    

    Or you can query the spline object first, and then trigger the event:

    import { useRef } from 'react';
    import Spline from '@splinetool/react-spline';
    export default function App() {
      const objectToAnimate = useRef();
      function onLoad(spline) {
        const obj = spline.findObjectByName('Cube');
        // save the object in a ref for later use
        objectToAnimate.current = obj;
      function triggerAnimation() {
        objectToAnimate.current.emitEvent('mouseHover');
      return (
          <Spline
            scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode"
            onLoad={onLoad}
          <button type="button" onClick={triggerAnimation}>
            Trigger Spline Animation
          </button>
        </div>
    

    You can find a list of all of the Spline Events you can pass to the emitEvent function in the Spline Events section.

    Lazy loading

    To start loading react-spline after the whole website has finished loading, we can use lazy-loading. This technique can be achieved using React.lazy() in combination with dynamic imports:

    import React, { Suspense } from 'react';
    const Spline = React.lazy(() => import('@splinetool/react-spline'));
    export default function App() {
      return (
          <Suspense fallback={<div>Loading...</div>}>
            <Spline scene="https://prod.spline.design/6Wq1Q7YGyM-iab9i/scene.splinecode" />
          </Suspense>
        </div>
    

    More info in the relative React documentation.

    Spline Component Props

    These are all the props you can pass to the <Spline /> component.

    Description onLoad? (spline: Application) => void Gets called once the scene has loaded. The spline parameter is an instance of the Spline Application renderOnDemand? boolean Wether or not to enable on demand rendering. Default true. className? string CSS classes style? object CSS style string Canvas id React.Ref<HTMLDivElement> A ref pointing to div container element. onSplineMouseDown? (e: SplineEvent) => void Gets called once a Spline Mouse Down event is fired onSplineMouseHover? (e: SplineEvent) => void Gets called once a Spline Mouse Hover event is fired onSplineMouseUp? (e: SplineEvent) => void Gets called once a Spline Mouse Up event is fired onSplineKeyDown? (e: SplineEvent) => void Gets called once a Spline Key Down event is fired onSplineKeyUp? (e: SplineEvent) => void Gets called once a Spline Key Up event is fired onSplineStart? (e: SplineEvent) => void Gets called once a Spline Start event is fired onSplineLookAt? (e: SplineEvent) => void Gets called once a Spline Look At event is fired onSplineFollow? (e: SplineEvent) => void Gets called once a Spline Mouse Up event is fired onSplineScroll? (e: SplineEvent) => void Gets called once a Spline Scroll event is fired

    Spline App Methods

    The object exposed as a first argument of the onLoad function, is a Spline Application. You can call all these different methods on it.

    Description emitEvent (eventName: SplineEventName, nameOrUuid: string) => void Triggers a Spline event associated to an object with provided name or uuid. emitEventReverse (eventName: SplineEventName, nameOrUuid: string) => void Triggers a Spline event associated to an object with provided uuid in reverse order. Starts from last state to first state. findObjectById (uuid: string) => SPEObject Searches through scene's children and returns the object with that uuid. findObjectByName (name: string) => SPEObject Searches through scene's children and returns the first object with that name. setZoom (zoom: number) => void Sets the initial zoom of the scene.

    Spline Events

    These are all the Spline event types that you can pass to the emitEvent or emitEventReverse function.

    Description