さまざまなUIコンポーネントを使用して様々な質問を画面にレンダリングする調査のようなReactアプリケーションがあります。React TransitionGroup、GSAP、およびMobXを使用して同じコンポーネントを再レンダリングする
しかし、調査の性質上、正確に同じコンポーネントを使用して多くの質問が再レンダリングされます。たとえば、「A/Bセレクタ」または「チェックリスト」。
私が達成したいのは、最初にDOMに再使用されるのか、最初にマウントされるのか、下からフェードアップするのかにかかわらず、各コンポーネントのためです。回答。この作品
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>
);
}
}
:ここ
は、5つの質問と小さな箱を使用して、非常に基本的な例です!しかし...をプルするには、DOMの(この場合はshowingBox
観測可能)経由でボックスコンポーネントを手動で削除する必要があります。移行時間のタイムアウトを設定し、コンポーネントを完全に再マウントします。
最終的に私はこれがうまくいくと思いますが、SOコミュニティの誰かが、アンマウント/再マウントが非常に強力なReactではないので、同じようなシナリオに遭遇しましたか?
ありがとう、@rodrigo - 2番目の例は、私が探しているものに近いです。実際、上のレベルの 'isShowing'ステートを使用して移行コンポーネントがちょうど新しい小道具を受け取っているかどうかにかかわらず、マウント/アンマウントを強制するために、私は非常に似ています。私はそれを試し、あなたに戻ってきます – Zfalen
あなたは男です。 2番目のパターンがうまくいき、MobX/Decoratorsと実際にうまく網を張ることができました。あなたの答えに追加された私の編集を見てください。 – Zfalen
喜んで助ける;)。また、ソリューションを追加していただきありがとうございます。 MobXはここで頻繁に出る質問ではありませんので、多くの人があなたのソリューションから恩恵を受けると確信しています。乾杯!!! – Rodrigo