ref
(а также key
кстати) очень особенная опора.this.props.ref
.
недоступно у ребенкаref
внутри вашего дочернего компонента (например, inputRef
+ scrollableContainerRef
+ popupRef
)
Но в некоторых случаях вы хотите создать новый компонент для существующей кодовой базы.Скажи <input>
замена.Конечно, в этом случае вам не следует менять все <input ref={...} />
на <MyInput refProp={...}>
.
Здесь вы можете использовать React.forwardRef
.Он чувствует себя лучше всего с функциональными компонентами, такими как
export Child = React.forwardRef((props, forwardedRef) => {
...
return ...
<input ref={forwardedRef} />
})
Но для компонента на основе классов вы бы предпочли использовать ref-prop
с другим именем:
class Child
...
render()
return
...
<input ref={this.props.forwardedRefName} />
export ChildWithForwardRef = React.forwardRef((props, ref) => <Child forwardedRefName={ref} {...props} />)
PS, поскольку вы будете потреблять то, что forwardRef
возвращает довольно начальный компонент (Child
), для которого вы можете указать displayName
.Таким образом, вы сможете найти его позже, скажем, с помощью энзима find()
или легко распознать элемент в браузере React DevTools