1

我有 3 个组件,应用程序、父项和子项。App 使用 Parent 提供的方法,将孩子注册到 Parent。这是为了让 Parent 收集它所包含的 Children 的 Refs(创建依赖关系图)。

Child 有一个名为 Animate 的方法,Parent 通过创建的 refs 调用该方法。

当我尝试打印 dependencyMap 时,我可以看到正在生成一个数组,这是我所期望的。

但是当我尝试使用dependencyMap从Parent访问子组件时,它总是调用子列表中的最后一个。

也就是说,当我尝试在 Parent.js 中使用 animateDependentChildren 为 <CustomComponent> 设置动画时,即使我为 CustomComponent1 传递了正确的 ID,CustomComponent2 也只会获得动画。

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 用于创建多个引用,然后单独调用它们吗?

4

1 回答 1

0

由于订阅者是组件引用,请尝试更改此行:

this.refs[subscriber].animate(scrollObj);

...至:

subscriber.animate(scrollObj);

我希望这有帮助。

于 2018-11-15T08:50:46.380 回答