9

我正在尝试按照这个示例此处的代码)并在我的 RN 项目中使用LayoutAnimation(与该示例的不同之处在于我只想渲染我的圆圈而不需要按下按钮)。

但是,当我添加了 LayoutAnimation 时,是整个视图/屏幕/组件执行“跳入”动画,而不仅仅是我想要的圆圈。我必须将 LayoutAnimation 移动到哪里才能实现动画的圆形对象?

再次更新:听从bennygenel了制作一个单独的 Circles 组件然后在收藏夹上的建议,有一个会一个一个地添加每个CriclecomponentDidMount组件,导致随着时间延迟更新状态时产生单独的动画。但是我仍然没有得到一一渲染/动画的理想效果......

class Circle extends Component {
  componentWillMount() {
    LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
  }

  render() {
    return (
        <View>
          { this.props.children }
        </View>
    );
  }
}

class Favorites extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      circleCount: 0
    }
  }
  componentDidMount() {
    for(let i = 0; i <= this.props.screenProps.appstate.length; i++) {
      setTimeout(() => {
        this.addCircle();
      }, (i*500));
    }
  }
  addCircle = () => {
    this.setState((prevState) => ({circleCount: prevState.circleCount + 1}));
  }

render() {
    var favoritesList = this.props.screenProps.appstate;

    circles = favoritesList.map((item) => {
        return (
            <Circle key={item.url} style={styles.testcontainer}>
              <TouchableOpacity onPress={() => {
                  Alert.alert( "Add to cart and checkout?",
                              item.item_name + "? Yum!",
                              [
                                {text: 'Yes', onPress: () => console.log(item.cust_id)},
                                {text: 'Cancel', onPress: () => console.log('Cancel Pressed'), style: 'cancel'}
                              ]
                              )}}>
                <Image source={{uri: item.url}} />
               </TouchableOpacity>
            </Circle>
        )});

    return (
        <ScrollView}>
          <View>
            <View>
              {circles}
            </View>
          </View>
        </ScrollView>
    );
  }
}
4

1 回答 1

6

来自configureNext()文档;

static configureNext(config, onAnimationDidEnd?)

安排在下一个布局上发生的动画。

这意味着您需要LayoutAnimation在要设置动画的组件渲染之前进行配置。如果您分离Circle组件并LayoutAnimation为该组件设置动画,则可以为圆圈设置动画,而布局中没有其他内容。

例子

class Circle extends Component {
  componentWillMount() {
    LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
  }

  render() {
    return (<View style={{width: 50, height: 50, backgroundColor: 'red', margin: 10, borderRadius: 25}}/>);
  }
}

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      circleCount: 0
    }
  }
  componentDidMount() {
    for(let i = 0; i < 4; i++) {
      setTimeout(() => {
        this.addCircle();
      }, (i*200));
    }
  }
  addCircle = () => {
    this.setState((prevState) => ({circleCount: prevState.circleCount + 1}));    
  }
  render() {
    var circles = [];
    for (var i = 0; i < this.state.circleCount; i++) {
      circles.push(<Circle />);
    }
    return (
    <View>
      <View style={{flexDirection:'row', justifyContent:'center', alignItems: 'center', marginTop: 100}}>
        { circles }
      </View>
      <Button color="blue" title="Add Circle" onPress={this.addCircle} />
    </View>
    );
  }
}

更新

如果你想使用Circle组件作为你的例子,你需要像下面这样使用它,这样子组件也可以被渲染。更详细的解释可以在这里找到。

class Circle extends Component {
  componentWillMount() {
    LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
  }

  render() {
    return (
        <View>
          { this.props.children }
        </View>
    );
  }
}
于 2018-03-02T08:05:25.080 回答