代码之家  ›  专栏  ›  技术社区  ›  1110

在循环内发出时,不会为正确的项调用onlayout

  •  0
  • 1110  · 技术社区  · 5 年前

    我在循环中呈现项目,我需要得到每个项目的y位置,以便使用 scrollTo() 在事件发生后滚动到该位置。
    问题是看起来 onLayout 没有正确调用,所以我得到了错误的项目位置。
    示例项目:

    A,B,C,D
    

    但我有时会得到A的存储位置,有时是C的存储位置。
    如何同步?

    this.props.list.map((item, index) => {
       return (
          <TouchableOpacity
            onLayout={(event) => {
              let {x, y, width, height} = event.nativeEvent.layout;
    ....
    



    更新

    这是完整的代码。所以你看我设置了第一个国家指数 在布局上 . 所以当我按下 它应该滚动到 巴哈马群岛 但有时它会滚动到 巴哈马群岛 有时为了 巴巴多斯 有时为了 不丹

    const countries = ["Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan"];
    
    export default class App extends Component {
    
      constructor(props, context) {
        super(props, context);
    
        this.state = {
          currentLetter: "A",
        };
    
        this.sections = {}
      }
    
    onLetter(letter) {
        this.setState({currentLetter: letter});
        if (this.sections[letter]) {
          this.scrollView.scrollTo({ y: this.sections[letter] });
        }
      }
    
    <ScrollView ref={ref => this.scrollView = ref}>
              {
                countries.map((item) => {
                  return (
                    <View onLayout={(event) => {
                      var {x, y, width, height} = event.nativeEvent.layout;
                        if (!this.sections[item[0]]) {
                          this.sections[item[0]] = y;
                        }
                      }}
                      style={{backgroundColor: "#f0aabb", padding: 10, margin: 5}}>
                      <Text>{item}</Text>
                    </View>
                  )
                })
              }
            </ScrollView>
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   tuledev    5 年前

    我认为 onLayout 不按顺序进行。所以不确定巴哈马是否会先去。

    我认为应该创建一个func来映射字母和起始/指向项,比如:“a”=“阿富汗”,“b”=“巴哈马”

    你可以硬编码(不推荐,只是解释一下)

    dataSource = { 'Afghanistan': 'A', 'Bahamas': 'B'}
    // implement this func base on your rules for title and letter
    getLetterFromTitle(title) {
      return dataSource[title];
    } 
    

    然后 在布局上

    const letter = getLetterFromTitle(item);
    if (letter && !this.sections[letter]) {
      this.sections[letter] = y;
    }