NextJs中是否存在与原始ReactJs中的createRef()挂钩等效的挂钩/方法等?

i7uaboj4  于 2023-02-18  发布在  React
关注(0)|答案(2)|浏览(136)

我尝试在NextJs中使用第三方软件包ReactPhotoSphereViewer在网站中显示全景图像。该软件包在NextJs和ReactJs中都可以使用。
下面是在ReactJs中工作的代码:

import { ReactPhotoSphereViewer } from 'react-photo-sphere-viewer';
import React, {createRef, useEffect} from 'react';

...
function PanoramaImage({src}) {
  return (
    <ReactPhotoSphereViewer 
      src={src}
    ></ReactPhotoSphereViewer>
  );
} 
...
export default PanoramaImage;

以下是NextJs中用于相同目的的代码:

import React, {createRef, useEffect} from "react";
import dynamic from 'next/dynamic'

const ReactPhotoSphereViewer = dynamic(
  () =>
    import('react-photo-sphere-viewer').then(
      (mod) => mod.ReactPhotoSphereViewer
    ),
  {
    ssr: false,
  }
)

...
function PanoramaImage({src}) {
    return (
      <div>
        <ReactPhotoSphereViewer
            src={src}
        ></ReactPhotoSphereViewer>
      </div>
    )
}
...

export default PanoramaImage;

然而,当我尝试添加对ReactPhotoSphereViewer组件的引用时,它在ReactJs中工作,但在NextJs中不工作。
下面是添加引用后的代码。

...
function PanoramaImage({src}) {
  const photoSphereRef = createRef(<ReactPhotoSphereViewer />);

  React.useEffect(() => {
    if (!photoSphereRef.current)
      return;

    photoSphereRef.current.toggleAutorotate();
  }, [photoSphereRef]);

    return (
      <div>
        <ReactPhotoSphereViewer
            ref={photoSphereRef}
            src={src}
        ></ReactPhotoSphereViewer>
      </div>
    )
}
...

export default PanoramaImage;

我认为问题出在createRef钩子上,那么,有没有什么方法可以代替createRef,或者如果我用错了,应该怎么纠正呢?
如果你能帮忙我会很高兴的。谢谢。

编辑:问题不在createRef上,我在ReactJs和NextJs框架中都使用了useRef而不是createRef,ReactJs工作得很完美,但是我不知道为什么,NextJs没有检测到引用。最后我放弃使用NextJs,开始使用ReactJs。谢谢大家。

kmbjn2e3

kmbjn2e31#

使用useRef钩子。不同的是createRef会在render时创建一个新的引用。对于函数组件,你每次都需要相同的引用。useRef做到了这一点。

function PanoramaImage({src}) {
  const photoSphereRef = useRef();

  React.useEffect(() => {
    if (!photoSphereRef.current)
      return;

    photoSphereRef.current.toggleAutorotate();
  }, [photoSphereRef]);

    return (
      <div>
        <ReactPhotoSphereViewer
            ref={photoSphereRef}
            src={src}
        ></ReactPhotoSphereViewer>
      </div>
    )
}
...

export default PanoramaImage;
yk9xbfzb

yk9xbfzb2#

import './App.css';
import React, { useEffect, useRef } from 'react';
import dynamic from 'next/dynamic';

// import { ReactPhotoSphereViewer } from 'react-photo-sphere-viewer';
const ReactPhotoSphereViewer = dynamic(
  () =>
    import('react-photo-sphere-viewer').then(
      (mod) => mod.ReactPhotoSphereViewer
    ),
  {
    ssr: false,
  }
);

export default function Home() {  
  return (
    <div className="App">
      <ReactPhotoSphereViewer src="Test_Pano.jpg" height={'100vh'} width={"100%"}></ReactPhotoSphereViewer>
    </div>
  );
}

资料来源:国家预防机制。
或者看看这个代码沙盒:https://codesandbox.io/s/sandbox-react-photo-sphere-viewer-by-elius94-j064sm?file=/src/App.js
(原作者elius94)

相关问题