ReactJS createRef для N компонентов, все указывают на последний в списке
У меня есть 3 компонента, приложение, родитель и ребенок. Приложение использует метод, предоставленный Parent, и регистрирует детей в Parent. Это для Родителя, чтобы собрать ссылки (создать карту зависимостей) дочерних элементов, которые он охватывает.
У Child есть метод с именем Animate, который будет вызываться Parent через созданные ссылки.
Когда я пытаюсь распечатать файл dependencyMap, я вижу, что создается массив, как я и ожидал.
Но когда я пытаюсь получить доступ к дочерним компонентам из Parent, используя dependencyMap, он всегда вызывает последний элемент в списке дочерних.
То есть, когда я пытаюсь анимировать
App.js
export default class App extends React.Component {
render(){
return(
<Parent>
{
(props)=>{
return(
<View>
<CustomComponent1 ref={props.register('s1')} key={1}>Text</CustomComponent1>
<CustomComponent2 ref={props.register('s2')} key={2}>Text2</CustomComponent2>
<ListComponent id={'s1'} key={3}/>
<ListComponent id={'s2'} key={3}/>
</View>
)
}
}
</Parent>
);
}
}
Parent.js
class Parent extends React.Component{
constructor(props) {
super(props);
this.dependencyMap = {}
}
render() {
return (
<View>
{this.props.children({
register: this.register.bind(this)
})}
</View>
);
}
register(dependentOn){
let dependentRef = React.createRef();
if(!this.dependencyMap[dependentOn]){
this.dependencyMap[dependentOn] = [];
}
this.dependencyMap[dependentOn].push(dependentRef);
return dependentRef;
}
animateDependentChildren(listId){
let subscribers = this.dependencyMap[listId];
subscribers.forEach(subscriber => {
console.log('subscriber', subscriber);
console.log('subscriber dom', subscriber.current);
this.refs[subscriber].animate(scrollObj); // <-This function always animates the last of the list of children (ie CustomComponent2)
});
}
}
Есть идеи, что я здесь делаю не так? Может ли React.createRef использоваться для создания нескольких ссылок, а затем вызывать их позже по отдельности?
1 ответ
Поскольку подписчик является компонентом ref, попробуйте изменить эту строку:
this.refs[subscriber].animate(scrollObj);
... чтобы:
subscriber.animate(scrollObj);
Надеюсь, это поможет.