enter image description here

Я пытаюсь добиться чего-то похожего на приведенное выше, но мой код находится в React

    import PropTypes from 'prop-types';
import React, { Component } from 'react';
import ClassNames from 'classnames/bind';
import SlidePanel from 'yoda-site-components/lib/components/SlidePanel/SlidePanel';
import TokenProvider from 'yoda-site-components/lib/helpers/TokenProvider/TokenProvider';

// wrappers
import LoginWrapper from './wrappers/LoginWrapper';
import CreateAccountWrapper from './wrappers/CreateAccountWrapper';
import PasswordResetWrapper from './wrappers/PasswordResetWrapper';
import Welcome from './wrappers/Welcome';
import * as styles from './SignInSlider.css';

const cx = ClassNames.bind(styles);

class SignInSlider extends Component {
    static propTypes = {
        isOpenPanel: PropTypes.bool,
        onClosePanel: PropTypes.func.isRequired,
        signInDetails: PropTypes.objectOf(PropTypes.object).isRequired,
        createAccount: PropTypes.objectOf(PropTypes.object).isRequired,
        preferences: PropTypes.objectOf(PropTypes.object).isRequired,
        messagesTexts: PropTypes.objectOf(PropTypes.object).isRequired,
        deviceType: PropTypes.shape({
            isMobile: PropTypes.bool.isRequired,
            isDesktop: PropTypes.bool.isRequired,
        }).isRequired,
        signInActions: PropTypes.objectOf(PropTypes.func).isRequired,
        createAccountActions: PropTypes.objectOf(PropTypes.func).isRequired,
        passwordResetActions: PropTypes.objectOf(PropTypes.func).isRequired,
        passwordResetDetails: PropTypes.objectOf(PropTypes.object),
        signInSliderActions: PropTypes.objectOf(PropTypes.func).isRequired,
        showCreateAccountPage: PropTypes.bool.isRequired,
        showWelcomePage: PropTypes.bool.isRequired,
        showForgotPasswordPage: PropTypes.bool.isRequired,
    };
    static defaultProps = {
        isOpenPanel: false,
        passwordResetDetails: {
            passwordResetResponse: {},
        },
    };
    constructor() {
        super();
        this.onClickOfCreateAccountButton = this.onClickOfCreateAccountButton.bind(this);
        this.onClickPasswordReset = this.onClickPasswordReset.bind(this);
        this.onClosePanel = this.onClosePanel.bind(this);
    }

    componentWillReceiveProps(nextProps) {
        console.log(nextProps);
        if (nextProps.showWelcomePage) {
            this.timer = setTimeout(() => {
                //this.onClosePanel();
            }, 3000);
        }
    }

    onClickOfCreateAccountButton() {
    const el = document.getElementsByClassName('SignInSlider-loginSlider')[0];
    const el1 = document.getElementsByClassName('SignInSlider-createAccountSlider')[0];

    el.classList.add('animate-show');
    setTimeout(() => {
        this.props.signInSliderActions.openCreateAccountPage();
        el1.classList.add('animate-show');
    }, 800);
}

    onClickPasswordReset() {
        setTimeout(() => {
            this.props.signInSliderActions.openForgotPasswordResetPage();
        }, 800);
    }

    onClosePanel() {
        this.timer && clearTimeout(this.timer);
        this.props.signInSliderActions.resetSignInSlider();
        this.props.onClosePanel();
    }

    render() {
        const { deviceType, preferences, messagesTexts, signInDetails, createAccount } = this.props;
        const { showCreateAccountPage, showWelcomePage, showForgotPasswordPage } = this.props;
        return (
            <SlidePanel
                isOpenPanel={this.props.isOpenPanel}
                onClosePanel={this.onClosePanel}>

                <div className={cx('signInSliderPanel')}>

                    <div className={cx('loginSlider')}>
                        { !showCreateAccountPage && !showWelcomePage && !showForgotPasswordPage &&
                        <LoginWrapper
                            signInDetails={signInDetails}
                            deviceType={deviceType}
                            preferences={preferences}
                            messagesTexts={messagesTexts}
                            source="account"
                            actions={this.props.signInActions}
                            onClickOfCreateAccountButton={this.onClickOfCreateAccountButton}
                            onClickPasswordReset={this.onClickPasswordReset}
                            isSignInSliderReq
                    />
                } </div>

                    <div className={cx('createAccountSlider')}>
                        {showCreateAccountPage &&
                        <CreateAccountWrapper
                            createAccount={createAccount}
                            isSignInSliderReq
                            deviceType={deviceType}
                            messagesTexts={this.props.messagesTexts}
                            preferences={this.props.preferences}
                            actions={this.props.createAccountActions}/>} </div>
                    <div className={cx('passwordSlider')}>
                        {showForgotPasswordPage &&
                        <PasswordResetWrapper
                            isSignInSliderReq
                            messagesTexts={messagesTexts.passwordReset}
                            preferences={preferences}
                            createAccountActions={this.props.createAccountActions}
                            actions={this.props.passwordResetActions}
                            passwordResetDetails={this.props.passwordResetDetails}
                            deviceType
               />} </div>
                    <div className={cx('welcomeSlider')}>
                        { showWelcomePage &&
                        <Welcome messagesTexts= {messagesTexts.signInSlider}
                            firstName={TokenProvider.get('DP_USER_NAME')}/>} </div>
                </div>
            </SlidePanel>
        );
    }
}

export default SignInSlider;

OnClickofcreateaccount Я пытаюсь перейти на следующую страницу, но ничего не происходит:

    .signInSliderPanel {
    position: relative;
    height: 100%;
    width: 422px;

    & .loginSlider {
        height: 100%;
        width: 422px;
        position: absolute;
    }

    & .createAccountSlider {
        height: 100%;
        width: 422px;
    }
}

.animate-show {
    height: 100%;
    width: 422px;
    position: absolute;
    transform: translate3d(-422px, 0, 0);
    transition: all 1.25s linear 0s;
    will-change: transform;
}

Я также сделал код codepen.io, чтобы имитировать то, что я хочу.

https://codepen.io/anon/pen/VQdgmV

2
vini 26 Фев 2018 в 17:10

1 ответ

Лучший ответ

Я исправил проблему.

Моя функция анимации:

   onClickOfCreateAccountButton() {
    const el = document.getElementsByClassName('SignInSlider-loginSlider')[0];
    const el1 = document.getElementsByClassName('SignInSlider-createAccountSlider')[0];

    el.classList.add('SignInSlider-animate-show');
    setTimeout(() => {
        this.props.signInSliderActions.openCreateAccountPage();
        el1.classList.add('SignInSlider-animate-show');
    }, 1000);
}

Мой CSS:

.signInSliderPanel {
position: relative;
height: 100%;
width: 422px;

& .loginSlider {
    height: 100%;
    width: 422px;
    position: absolute;
    display: inline-block;
}

& .createAccountSlider {
    height: 100%;
    width: 422px;
    left: 422px;
    position: absolute;
    display: inline-block;
}

& .passwordSlider {
    height: 100%;
    width: 422px;
    left: 422px;
    position: absolute;
    display: inline-block;
}

  & .animate-show {
    height: 100%;
    width: 422px;
    position: absolute;
    transform: translate3d(-422px, 0, 0);
    transition: all 1.25s linear 0s;
    will-change: transform;
    display: block;
  }

}

То, что я делаю выше, - это добавление анимации-шоу, чтобы сначала показать переход, а затем добавить его на входящую страницу.

0
vini 27 Фев 2018 в 04:52