2

所以有人告诉我,由于一些技术问题,你不能将 react-router-dom 与 react-three-fiber 一起使用,因为 react-router 无法访问画布内的提供程序。好吧,我尝试在Link画布之外放置一个标签,当元素被点击到另一个页面时它会重定向,但显然这适用于所有元素,而不是我想要的特定元素。我已经看到使用门户或转发画布的示例,但恐怕这对我来说真的很困惑,我不知道如何应用它。

我想知道这是否可以通过传递道具来实现。例如,而不是使用<Link to = "/Page2"><Link to = "{link}">,然后我会在组件中定义链接。例如<Cube link = "/Page2">。这是我的代码的简化版本:

export default function Page1({ link }) {

  return (
    <>

 <Link to = "/page2">
      <Canvas>

        <ambientLight />
        <pointLight position={[10, 10, 10]} />

        <Suspense fallback={<Fallback />}>

          <Cube position={[-1.2, 0, 0]} time={1000} link="/Page2" />

        </Suspense>
      </Canvas>
      </Link>
    </>
  );
}

问题是当我应用它时,什么也没有发生,我不知道为什么,我的语法错了吗?这是我在沙盒中的主要代码。一切都在 Page1.js 中,但由于它的数量,它有点令人困惑。

4

1 回答 1

1

所以从反应三纤维光谱聊天@mjf 帮助我找到了答案。所以@0xca0a 说问题是'上下文没有刺穿协调者。该组件打开一个新的渲染根,它无法访问主机协调器(react-dom)上下文。 所以解决这个问题的一种方法是将反应路由器上下文桥接到画布中。首先,上下文是通过 react router dom `import { createBrowserHistory } 中的“历史”库创建的。

这是代码:

import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
import App from "./App";
import { createBrowserHistory } from "history";
import { Router, Route } from "react-router-dom";

const rootElement = document.getElementById("root");
const customHistory = createBrowserHistory({
  // basename: config.urlBasename || ""
});
ReactDOM.render(
  <Router history={customHistory}>
    <Route
      component={({ history }) => {
        window.appHistory = history;
        return <App />;
      }}
    />
  </Router>,
  rootElement
);

import React, { Suspense } from "react";
import { Canvas } from "react-three-fiber";
import Cube from "./cube";

export default function Page1() {
  return (
    <Canvas>
      <ambientLight />
      <pointLight position={[10, 10, 10]} />
      <Suspense fallback={null}>
        <Cube
          position={[-1.2, 0, 0]}
          onClick={() => window.appHistory.push("/page2")}
        />
      </Suspense>
    </Canvas>
  );
}

这是 @mjf 的工作代码沙箱 https://codesandbox.io/s/cool-yonath-j9u1m?from-embed

于 2020-05-12T17:49:37.843 回答