ReactJS createRef для N компонентов, все указывают на последний в списке

У меня есть 3 компонента, приложение, родитель и ребенок. Приложение использует метод, предоставленный Parent, и регистрирует детей в Parent. Это для Родителя, чтобы собрать ссылки (создать карту зависимостей) дочерних элементов, которые он охватывает.

У Child есть метод с именем Animate, который будет вызываться Parent через созданные ссылки.

Когда я пытаюсь распечатать файл dependencyMap, я вижу, что создается массив, как я и ожидал.

Но когда я пытаюсь получить доступ к дочерним компонентам из Parent, используя dependencyMap, он всегда вызывает последний элемент в списке дочерних.

То есть, когда я пытаюсь анимировать , используя animateDependentChildren в Parent.js, CustomComponent2 только анимируется, даже если я передаю правильный ID для CustomComponent1.

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);

Надеюсь, это поможет.

Другие вопросы по тегам