React Native - LayoutAnimation: как сделать так, чтобы он просто анимировал объект внутри компонента, а не весь компонент / представление?
Я пытаюсь следовать этому примеру (код здесь) и использовать LayoutAnimation внутри моего проекта RN (отличие от этого примера в том, что я просто хочу рендерить круги без кнопки, которая будет нажата).
Но когда я добавил LayoutAnimation, весь "вид / экран / компонент" выполняет анимацию "появления", а не только круги, которые я желаю. Куда мне нужно переместить LayoutAnimation, чтобы добиться только анимированных объектов круга?
ОБНОВЛЕНО СНОВАbennygenel
Совет, чтобы сделать отдельный компонент Круги, а затем в избранное, есть componentDidMount
это добавило бы каждый компонент Cricle один за другим, приводя к отдельной анимации, поскольку состояние обновляется с задержкой по времени. Но я все еще не получаю желаемого эффекта от рендеринга / анимации кругов один за другим...
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>
);
}
}
1 ответ
От 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>
);
}
}