Я пытаюсь передать ссылку компонента на другой компонент. Поскольку string refs устарели, я использую refback обратного вызова.
Поэтому у меня есть что-то похожее на это:
<One ref={c => this.one = c}/>
<Two one={this.one}/>
Проблема в том, что всякий раз, когда я пытаюсь получить доступ к this.props.one
внутри Two
я получаю undefined
.
Я даже попробовал это на Two
:
componentDidMount(){
setTimeout(()=>{
console.log(this.props.one);
},5000)
}
Похоже, проблема в том, что когда создается prop, ref еще не существует, поскольку он создается после того, как One
установлен. Но я не знаю, как "обновить" реквизиты на " Two
чтобы получить ссылку на смонтированный компонент.
Итак, каков правильный способ передачи ссылки на другой компонент?
редактировать
Некоторые пользователи предложили инкапсулировать эту логику в более высокий компонент, который сам по себе отображает эти другие дочерние компоненты.
Проблема с этим подходом заключается в том, что вы не можете создать многоразовую логику, и вам придется повторять одну и ту же логику снова и снова в тех инкапсулирующих компонентах.
Предположим, вы хотите создать общий компонент <Form>
который инкапсулирует логику отправки в ваш магазин, проверку ошибок и т.д. И вы делаете что-то вроде этого:
<Form>
<Input/>
<Input/>
<Input/>
<Input/>
<SubmitButton/>
</Form>
В этом примере <Form>
не может обращаться к экземплярам (и методам) дочерних элементов, поскольку this.props.children
не возвращает эти экземпляры. Он возвращает некоторый список псевдо-компонентов.
Итак, как вы можете проверить, не обнаружил ли какой-либо <Input/>
ошибку проверки, не передавая ссылку?
Вы должны инкапсулировать эти компоненты в другом компоненте с помощью логики проверки. Например, в <UserForm>
. Но так как каждая форма отличается, одна и та же логика должна быть скопирована в <CategoryForm>
, <GoupForm>
и т.д. Это ужасно неэффективно, поэтому я хочу инкапсулировать логику проверки в <Form>
и передать ссылки <Input>
компонентов в <Form>
.