我正在尝试使用React.forwardRef()
,我对以下问题感到困惑:
的数据
看起来IntelliJ能够正确地干扰引用的类型,在本例中是FilterRef
。
但是,我无法访问当前值ref.current
,除非出现编译错误,说明该值不存在。
当然,在运行时将其打印出来可以确认current
是一个现有属性。
不知道是什么原因导致这个问题。
代码
我正在创建一个引用,我想与Filter
组件和上下文提供程序共享:
const filterRef = useRef<FilterElement>({ filters, setFilters: onSetFilters });
console.log('filterRef', filterRef);
return (
<>
<Filter ref={filterRef} />
<FilterContext.Provider value={{ ref: filterRef }}>
<Outlet />
</FilterContext.Provider>
</>
);
字符串
但是,current
始终是null
:
export const Filter = React.forwardRef<FilterElement, FilterProps>((props, ref) => {
const filterRef = useRef<FilterElement>(null);
useImperativeHandle(ref, () => filterRef.current!, []);
console.log('filter', filterRef, ref);
// ...
}
型
1条答案
按热度按时间ufj5ltwl1#
编辑2
为了让
Filter
自己管理一个单独的状态,也可以执行以下操作:字符串
编辑:
根据更新的代码,我认为你根本不需要
ref
,因为你可以将filters
和setFilters
传递给Filter
组件和FilterContext
提供程序:型
在任何情况下,如果你想这样做,你不需要使用
forwardRef
,只要命名你的 prop 别的东西,并输入RefObject
:型
如果您想在
Filter
组件中使用ref
,但又想将相同的ref
暴露给父组件,则可以使用下面的useImperativeHandler
答案。原始答案:
Refs可以是一个带有
current
属性的对象,就像useRef
返回的对象一样,也可以是一个ref
回调函数,所以编译器是正确的。您应该在
Filter
组件中创建一个新的ref
,并使用useImperativeHandle
将其与转发的组件同步:型