Могу ли я создать в React компонент, который также действует как объект Forwarded Ref?
Мне нужно использовать перенаправленные ссылки
const InfoBox = React.forwardRef((props, ref) => (
<div ref={ref} >
<Rings >
</Rings>
<Tagline />
</div>
));
У меня тоже есть такой код
class InfoBox extends React.Component {
constructor(props) {
super(props)
}
render () {
return (
<div >
<Rings />
<Tagline />
</div>
)
}
в основном мой InfoBox должен быть Component, потому что он содержит некоторое состояние, но я также хочу, чтобы он вел себя как объект, который может получать ссылки от родителя и пересылать их потомкам (в основном React.forwardRef)
Ознакомившись с React.forwardRef, я не могу понять, как заставить его работать с моими существующими компонентами React, функциональность которых уже привязана к состоянию.
мне нужно разделить два объекта и обернуть один в другой, или есть способ добиться этого в одном объекте?
код, который обертывает Infobox, выглядит как
class AppContainer extends React.Component {
constructor(props) {
super()
this.infobox_ref = React.createRef()
}
componentDidMount() {
// this.infobox_ref.current.innerHTML should return the inner HTML of the infobox
}
render() {
return (
<InfoBox ref={this.infobox_ref}>
)
}
правильно ли я использую перенаправленные ссылки?
1 ответ
В React ref
prop по умолчанию не пересылается. Чтобы получить ссылку в дочернем компоненте, у вас есть 2 варианта:
- Использование функционального компонента, заключенного в
forwardRef
функция. Вы уже это сделали:
const InfoBox = React.forwardRef((props, ref) => (
<div ref={ref} >
<Rings >
</Rings>
<Tagline />
</div>
));
- Изменение названия
ref
опора
// Parent Component
class AppContainer extends React.Component {
constructor(props) {
super()
this.infobox_ref = React.createRef()
}
componentDidMount() {
// this.infobox_ref.current.innerHTML should return the inner HTML of the infobox
}
render() {
return (
<InfoBox infoboxRef={this.infobox_ref}>
)
}
}
// Child Component
class InfoBox extends React.Component {
render () {
return (
<div ref={this.props.infoboxRef}>
<Rings />
<Tagline />
</div>
)
}
}
Конечно, вы также можете комбинировать их, что позволяет перейти к ref
prop из родительского, но потребляет "фиксированную" опору в компоненте дочернего класса, как показано здесь @tubu13:
class InfoBox extend React.Component{
render() {
return (
<div ref={this.props.infoboxRef}>
<Rings />
<Tagline />
</div>
)
}
}
export default React.forwardRef((props, ref) => <InfoBox {...props} infoboxRef={ref} />)