如何在 react-three-fiber 中获取对象的 id
How to get the id of an object in react-three-fiber
我正在尝试获取我在 react-three-fiber 中创建的对象的 id
。我尝试使用 document.getElementById
但没有成功。
这是我创建的对象:
const createFace = () => {
let face = [];
let size = props.cubeArr[0].length;
for (let row = 0; row < size; row++) {
let rowArr = [];
for (let col = 0; col < size; col++) {
let position = [col - 1, size - 2 - row, 0];
rowArr[col] = (
<Cell
key={`${props.side}-${row}-${col}`}
id={`${props.side}-${row}-${col}`}
position={position}
/>
);
}
face[row] = <group key={`${props.side}-${row}`}>{rowArr}</group>;
为简洁起见,我没有包括 three.js 代码的其余部分,但本质上我正在为我的每个 Cells
设置一个 id
,我想访问这些 3D Cells
基于他们的 ID,所以我可以 运行 click
函数。
我发现了一个类似的问题 here 但看不到如何将其翻译成 react
发布这篇文章后不久,我发现了一些关于在我的群组中使用 useRef
挂钩的答案。
此实现有效,但不确定它是否是最合适的实现方式。不管怎样,到目前为止这个方法有效
import React, {useRef} from 'react'
const Cell = (props) => {
let cellRef = useRef();
const clickSurroundingCell = (e) => {
e.stopPropagation()
let cubeObject = cellRef.current.parent.parent.parent // get main parent to check all objects
// clicking on the cell reference here
let cellToClick = cubeObject.children[0].children[0].children[0]
cellToClick.__r3f.handlers.onClick(event) // this executes the referenced cell onClick function
}
return (
<Plane onClick={clickSurroundingCell}>
</Plane>
)
}
Three.js 对象有这个可选的 property called .name
。您可以为您的网格指定名称,然后您可以使用 .getObjectByName()
访问它们。这是一个干净的替代方案,可以让您摆脱 React 草率的 useRef
方法:
// First you assign a name to the object
const mesh = new THREE.Mesh(geometry, material);
mesh.name = "mySpecialMesh";
// ...
// Then later on you can find this object by the name you assigned
const sameMesh = scene.getObjectByName("mySpecialMesh");
我想你可以用 <Cell name="mySpecialMesh" />
做类似的事情
我正在尝试获取我在 react-three-fiber 中创建的对象的 id
。我尝试使用 document.getElementById
但没有成功。
这是我创建的对象:
const createFace = () => {
let face = [];
let size = props.cubeArr[0].length;
for (let row = 0; row < size; row++) {
let rowArr = [];
for (let col = 0; col < size; col++) {
let position = [col - 1, size - 2 - row, 0];
rowArr[col] = (
<Cell
key={`${props.side}-${row}-${col}`}
id={`${props.side}-${row}-${col}`}
position={position}
/>
);
}
face[row] = <group key={`${props.side}-${row}`}>{rowArr}</group>;
为简洁起见,我没有包括 three.js 代码的其余部分,但本质上我正在为我的每个 Cells
设置一个 id
,我想访问这些 3D Cells
基于他们的 ID,所以我可以 运行 click
函数。
我发现了一个类似的问题 here 但看不到如何将其翻译成 react
发布这篇文章后不久,我发现了一些关于在我的群组中使用 useRef
挂钩的答案。
此实现有效,但不确定它是否是最合适的实现方式。不管怎样,到目前为止这个方法有效
import React, {useRef} from 'react'
const Cell = (props) => {
let cellRef = useRef();
const clickSurroundingCell = (e) => {
e.stopPropagation()
let cubeObject = cellRef.current.parent.parent.parent // get main parent to check all objects
// clicking on the cell reference here
let cellToClick = cubeObject.children[0].children[0].children[0]
cellToClick.__r3f.handlers.onClick(event) // this executes the referenced cell onClick function
}
return (
<Plane onClick={clickSurroundingCell}>
</Plane>
)
}
Three.js 对象有这个可选的 property called .name
。您可以为您的网格指定名称,然后您可以使用 .getObjectByName()
访问它们。这是一个干净的替代方案,可以让您摆脱 React 草率的 useRef
方法:
// First you assign a name to the object
const mesh = new THREE.Mesh(geometry, material);
mesh.name = "mySpecialMesh";
// ...
// Then later on you can find this object by the name you assigned
const sameMesh = scene.getObjectByName("mySpecialMesh");
我想你可以用 <Cell name="mySpecialMesh" />