Est-il préférable de conserver la valeur animée (fadeAnim
) en tant que propriété de l'état ou est-il correct d'en faire une propriété de classe?
Exemple:
class ModalShade extends React.Component {
fadeAnim = new Animated.Value(0)
render() {
return (
<Animated.View
cls="bg-black absolute-fill"
style={{ opacity: this.fadeAnim }}
/>
)
}
componentDidMount() {
Animated.spring(
this.fadeAnim, {
toValue: 0.6,
tension: 100,
friction: 20
}
).start();
}
}
Clarification: Je sais que cet état est utilisé pour la réconciliation de react. Les valeurs 'Animated
React-native contournent le rendu () habituel, donc le composant est mis à jour même lorsqu'il n'y a pas de changement d'état.
Je ne vois aucun intérêt à comparer un Animated.Value
dans mon shouldComponentUpdate
, c'est pourquoi je l'ai déplacé.
Il est préférable de suivre la documentation officielle et d'utiliser la propriété de l'État. Il y a deux bonnes raisons à cela:
setState
et le rendu lors du changement de composants animés. Ceci est une citation de la documentation officielleLorsque le composant monte, l'opacité est définie sur 0. Ensuite, une animation d'accélération est lancée sur la valeur animée fadeAnim, qui mettra à jour tous ses mappages dépendants (dans ce cas, juste l'opacité) sur chaque image lorsque la valeur s'anime sur la valeur finale de 1.
Cela se fait de manière optimisée, plus rapide que d'appeler setState et de restituer.
En général, avec React il y a une grande différence entre stocker quelque chose en tant que propriété d'instance/classe (par exemple this.myVar = 'foo';) ou dans l'état. La différence est que React utilise l'objet state pour déterminer quand re-restituer le composant (c'est-à-dire appeler à nouveau render ()).
Si vous stockez une variable en tant que propriété de classe/instance et que vous la modifiez, React la logique de rendu ne sait rien de ce changement et, par conséquent, vous ne verrez aucun changement dans le interface utilisateur rendue.
Vous devez donc stocker dans l'état les éléments qui modifient la sortie rendue d'un composant. Si une variable n'affecte pas du tout la sortie rendue (et vous ne vous souciez pas d'être averti lorsqu'elle change fondamentalement), vous pouvez la stocker en tant que propriété d'instance/classe. Parfois, cela peut avoir de meilleures implications en termes de performances, car un appel setState
pour mettre à jour cette variable déclencherait un rendu inutile.
Dans votre exemple de cas, vous avez omis la méthode de rendu, mais il est très probable que vous ayez besoin d'accéder à la variable fadeAnim
dans l'état pour effectuer réellement l'animation. Fondamentalement, Animated.spring interpole simplement certaines valeurs au fil du temps, mais vous devez ensuite utiliser ces valeurs interpolées pour réellement animer quelque chose. Dans l'exemple de documentation ( https://facebook.github.io/react-native/docs/animated.html ), vous pouvez voir this.state.fadeAnim
est utilisé dans render
pour contrôler (animer) le style d'opacité.
Pour récapituler, vous devez stocker fadeAnim
dans l'état spécifiquement parce qu'une modification de la valeur devrait déclencher un nouveau rendu.