在反应中有条件地分配 ref
Conditionally assign ref in react
我正在做 React 方面的工作,遇到了一个我自己无法解决的挑战。我在这里和其他地方进行了搜索,发现标题相似但与我遇到的问题没有任何关系的主题,所以我们开始吧:
所以我有一个数组将被映射到 React,组件,通常是这样的:
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr
return (<>
{arr.map((item, id) => {<ChildComponent props={item} key={id}>})}
</>)
}
但问题是,parent 元素中有一个状态,它存储当前选定的 ChildComponents 之一的 ID(我通过设置上下文并在内部设置此状态来做到这一点ChildComponent),然后问题是我必须引用当前选定的 ChildComponent 内部的一个节点。我可以转发 ref 没问题,但我也想仅在当前选定的 ChildComponent 上分配 ref,我想这样做:
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr and there's a state which holds the id of a selected ChildComponent called selectedObjectId
const selectedRef = createRef();
return (<>
<someContextProvider>
{arr.map((item, id) => {
<ChildComponent
props={item}
key={id}
ref={selectedObjectId == id ? selectedRef : null}
>
})}
<someContextProvider />
</>)
}
但是我试过了,我们做不到。那么,如果某个条件为真,如何将 ref 动态分配给数组的一个特定元素?
不能动态赋值ref,但可以全部存储,通过id访问
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr and theres a state wich holds the id of a selected ChildComponent called selectedObjectId
let refs = {}
// example of accessing current selected ref
const handleClick = () => {
if (refs[selectedObjectId])
refs[selectedObjectId].current.click() // call some method
}
return (<>
<someContextProvider>
{arr.map((item, id) => {
<ChildComponent
props={item}
key={id}
ref={refs[id]}
>
})}
<someContextProvider />
</>)
}
解决方案
就像 Drew 在 Medets 回答中评论的那样,唯一的解决方案是创建一个 refs 数组并通过简单地将 ChildElement 的索引与 ref 数组的索引匹配来访问所需的 refs,如我们所见 .我们发现无法在对象之间实际移动 ref,但这样做的性能成本应该无关紧要。
您可以使用 props 展开运算符 {...props}
通过首先构建 props 对象来传递条件引用。例如
export default ParentComponent = () => {
const selectedRef = useRef(null);
return (
<SomeContextProvider>
{arr.map((item, id) => {
const itemProps = selectedObjectId == id ? { ref: selectedRef } : {};
return (
<ChildComponent
props={item}
key={id}
{...itemProps}
/>
);
})}
<SomeContextProvider />
)
}
我正在做 React 方面的工作,遇到了一个我自己无法解决的挑战。我在这里和其他地方进行了搜索,发现标题相似但与我遇到的问题没有任何关系的主题,所以我们开始吧:
所以我有一个数组将被映射到 React,组件,通常是这样的:
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr
return (<>
{arr.map((item, id) => {<ChildComponent props={item} key={id}>})}
</>)
}
但问题是,parent 元素中有一个状态,它存储当前选定的 ChildComponents 之一的 ID(我通过设置上下文并在内部设置此状态来做到这一点ChildComponent),然后问题是我必须引用当前选定的 ChildComponent 内部的一个节点。我可以转发 ref 没问题,但我也想仅在当前选定的 ChildComponent 上分配 ref,我想这样做:
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr and there's a state which holds the id of a selected ChildComponent called selectedObjectId
const selectedRef = createRef();
return (<>
<someContextProvider>
{arr.map((item, id) => {
<ChildComponent
props={item}
key={id}
ref={selectedObjectId == id ? selectedRef : null}
>
})}
<someContextProvider />
</>)
}
但是我试过了,我们做不到。那么,如果某个条件为真,如何将 ref 动态分配给数组的一个特定元素?
不能动态赋值ref,但可以全部存储,通过id访问
export default ParentComponent = () => {
//bunch of stuff here and there is an array called arr and theres a state wich holds the id of a selected ChildComponent called selectedObjectId
let refs = {}
// example of accessing current selected ref
const handleClick = () => {
if (refs[selectedObjectId])
refs[selectedObjectId].current.click() // call some method
}
return (<>
<someContextProvider>
{arr.map((item, id) => {
<ChildComponent
props={item}
key={id}
ref={refs[id]}
>
})}
<someContextProvider />
</>)
}
解决方案
就像 Drew 在 Medets 回答中评论的那样,唯一的解决方案是创建一个 refs 数组并通过简单地将 ChildElement 的索引与 ref 数组的索引匹配来访问所需的 refs,如我们所见
您可以使用 props 展开运算符 {...props}
通过首先构建 props 对象来传递条件引用。例如
export default ParentComponent = () => {
const selectedRef = useRef(null);
return (
<SomeContextProvider>
{arr.map((item, id) => {
const itemProps = selectedObjectId == id ? { ref: selectedRef } : {};
return (
<ChildComponent
props={item}
key={id}
{...itemProps}
/>
);
})}
<SomeContextProvider />
)
}