Ответ 1
Хотя, возможно, более простой, старый API refs может быть затруднен в некоторых случаях, например, когда используется в обратном вызове. Весь вид статического анализа - это боль со строками. API-интерфейс, основанный на обратном вызове, может делать все, что может использовать API-интерфейс строки, и многое другое с помощью немного добавленной многословности.
class Repeat extends React.Component {
render() {
return <ul> {
[...Array(+this.props.times)].map((_, i) => {
return <li key={i}> { this.props.template(i) } </li>
})
} </ul>
}
}
class Hello extends React.Component {
constructor() {
super();
this.refDict = {};
}
render() {
return <Repeat times="3" template={i => <span ref= {el => this.refDict[i] = el}> Hello {i} </span>} />
{/* ^^^ Try doing this with the string API */}
}
}
Дальнейшее обсуждение и более подробный список возможных проблем с api на основе строк можно найти из issue # 1373, где обратный вызов основанный api. Я включу здесь список из описания проблемы:
API-интерфейс ref нарушен, это несколько аспектов.
Вы должны ссылаться на this.refs ['myname'] как строки для совместимости с совместимым компилятором Closure.
Это не допускает понятия нескольких владельцев одного экземпляра.
Волшебные динамические строки потенциально ломают оптимизацию в виртуальных машинах.
Он должен быть всегда последовательным, потому что он синхронно разрешен. Это означает, что асинхронное пакетное рендеринг вводит потенциальные ошибки.
В настоящее время у нас есть крючок, чтобы получить ссылки sibling, чтобы вы могли иметь один компонент, ссылаясь на него как на родную страницу, как на справочную. Это работает только на одном уровне. Это нарушает возможность переноса одного из них в инкапсуляцию.
Его нельзя статически напечатать. Вы должны использовать его при любом использовании на таких языках, как TypeScript.
Нет способа привязать ref к правильному "владельцу" в обратном вызове, вызванном дочерним элементом.
<Child renderer={index => <div ref="test">{index}</div>} />
- этот ref будет прикреплен там, где вызывается обратный вызов, а не у текущего владельца.
Документы вызывают устаревший старый API-интерфейс строки, чтобы сделать его более понятным, что API-интерфейс обратного вызова является предпочтительным подходом, как описано в this commit и в этот PR, которые фактически помещают эти заявления в документацию в первую очередь. Также обратите внимание на то, что некоторые из комментариев подразумевают, что в конце строки refs api может быть устаревшим в какой-то момент.