J'ai une application React de type levé qui affiche diverses questions à l'écran en utilisant divers composants de l'interface utilisateur.Utilisation de React TransitionGroup, GSAP et MobX pour redéfinir le même composant
Cependant, la nature de l'enquête est que beaucoup de questions sont rendues en utilisant exactement le même composant. Par exemple, un "Sélecteur A/B" ou une "Liste de contrôle". Ce que je voudrais faire, c'est que chaque composant, qu'il soit réutilisé ou monté sur le DOM pour la première fois, disparaisse du fond, et s'efface lorsque l'utilisateur sélectionne le composant. répondre.
Voici un exemple de base en utilisant cinq questions et une petite boîte:
import React, {Component, PropTypes} from 'react';
import ReactDOM from 'react-dom';
import { observer, Provider, inject } from 'mobx-react';
import { observable, computed, action } from 'mobx';
import 'gsap';
import TransitionGroup from 'react-addons-transition-group';
// STORE
class APP_STORE {
@observable showingBox = true;
@observable transDuration = .25;
@observable questionIndex = 0;
@observable questions = [
{text: 'one'},
{text: 'two'},
{text: 'three'},
{text: 'four'},
{text: 'five'},
];
@computed get currentQuestion() {
return this.questions[this.questionIndex];
}
@action testTrans() {
this.showingBox = !this.showingBox;
setTimeout(() => {
this.questionIndex++;
this.showingBox = !this.showingBox;
}, this.transDuration * 1000);
}
}
let appStore = new APP_STORE();
// TRANSITION w/HIGHER ORDER COMPONENT
function fadesUpAndDown (Component) {
return (
class FadesUp extends React.Component {
componentWillAppear (callback) {
const el = ReactDOM.findDOMNode(this);
TweenMax.fromTo(el, appStore.transDuration, {y: 100, opacity: 0}, {y: Math.random() * -100, opacity: 1, onComplete: callback});
}
componentWillEnter (callback) {
const el = ReactDOM.findDOMNode(this);
TweenMax.fromTo(el, appStore.transDuration, {y: 100, opacity: 0}, {y: Math.random() * -100, opacity: 1, onComplete: callback});
}
componentWillLeave (callback) {
const el = ReactDOM.findDOMNode(this);
TweenMax.to(el, appStore.transDuration, {y: 100, opacity: 0, onComplete: callback});
}
render() {
return <Component ref="child" {...this.props} />;
}
}
)
}
// REACT
@fadesUpAndDown
class Box extends React.Component {
render() {
return <div className="box" ref={c => this.container = c}> {this.props.data.text} </div>;
}
}
@inject('store') @observer
class Page extends Component {
render() {
const store = this.props.store;
return (
<div className="page">
<TransitionGroup>
{ store.showingBox ? <Box data={store.currentQuestion}/> : null }
</TransitionGroup>
<button className="toggle-btn" onClick={() => { store.testTrans(); } } >
test trans
</button>
</div>
);
}
}
Cela fonctionne! Mais ... pour le retirer, je dois supprimer manuellement le composant de la boîte du DOM (dans ce cas via le showingBox
observable), définir un délai d'attente pour la durée de transition, et re-monter le composant complètement. En fin de compte, je suppose que c'est bien, mais je me demande si quelqu'un dans la communauté SO a rencontré un scénario similaire avec une meilleure façon de l'aborder, car démonter/remonter n'est pas très fort Réagir.
Merci, @rodrigo - le deuxième exemple est proche de ce que je recherche. En fait, la façon dont je l'ai écrit ci-dessus est très similaire en utilisant un état 'isShowing' de haut niveau pour forcer un montage/démontage, que le composant en transition reçoive juste de nouveaux accessoires. Je vais essayer et revenir à vous – Zfalen
vous êtes l'homme. Le deuxième modèle a fonctionné, et j'ai été en mesure de le mailler avec MobX/Decorators vraiment bien. Voir mon édition, j'ai ajouté à votre réponse. – Zfalen
heureux d'aider;). Merci également d'avoir ajouté votre solution. MobX n'est pas une question fréquente ici, donc je suis sûr que beaucoup de gens bénéficieront de votre solution. À votre santé!!! – Rodrigo