【问题标题】:CSSTransitionGroup component doesn't leave properlyCSSTransitionGroup 组件没有正确离开
【发布时间】:2017-12-31 22:23:19
【问题描述】:

我正在尝试创建一个用于登录的模式,该模式在您单击登录按钮时淡入并在您关闭它时淡出。我决定让我们使用“react-transition-group”库来实现它。淡入效果很好,但它会立即淡出,而没有应用动画。我怎样才能让它发挥作用?

连接组件:

<div>
                <ModalRoot {...this.props}>
                    <Grid>
                        <Menu {...this.props}/>
                        <div className='wrapper'>
                            <div className='content'>
                                <Form postTodo={this.props.postTodo}/>
                                <ul className='todo-list'>
                                   <CSSTransitionGroup
                                    transitionName='todo'
                                    transitionEnterTimeout={500}
                                    transitionLeaveTimeout={300}>
                                        {todoItems}
                                    </CSSTransitionGroup>    
                                </ul>
                            </div>
                        </div>
                    </Grid>
                </ModalRoot> 
            </div>

模态根:

const MODAL_COMPONENTS = {
  LOGIN_MODAL: LoginModal,
  /* other modals */
};

const ModalRoot = (props: any) => {
    const {isVisible, isMaskShown, window} = props.modal;
    const Modal = MODAL_COMPONENTS[window];
    if(!isVisible) {
      return (
        <div>
          {props.children}
        </div>
      );
    }
    if(isMaskShown) {
      return (
        <CSSTransitionGroup
          transitionName='mask'
          transitionAppear={true}
          transitionAppearTimeout={500}
          transitionEnterTimeout={0}
          transitionLeaveTimeout={300}>
            <Mask>
              <Modal key={100} hideModal={props.hideModal} />
                {props.children}
            </Mask>
        </CSSTransitionGroup>
      );
    }
    if(!isMaskShown) {
      return (
        <div>
          <Modal hideModal={props.hideModal}/>
          {props.children}
        </div>  
      );
    }
};

登录模式:

const LoginModal = ({hideModal,presets}) => {

    return (
        <div className='login-modal'>
            <button onClick={hideModal} className='close'>X</button>
        </div>
    );
};

CSS:

 .mask {
    position: absolute;
    width: 100%;
    height: 100%;
    background: black;
    opacity: 0.75;
}

.mask-leave {
  opacity: 0.75;
}  

.mask-leave.mask-leave-active {
  opacity: 0;
  transition: opacity 300ms ease-in;
}

.mask-appear {
  opacity: 0;
}

.mask-appear.mask-appear-active {
  opacity: 0.75;
  transition: opacity .5s ease-in;
}

【问题讨论】:

  • 您要为哪个组件设置“出现”和“离开”过渡的动画?换句话说,您要挂载和卸载哪个子组件?
  • 我正在尝试挂载和卸载 组件

标签: reactjs redux react-redux reactcsstransitiongroup react-transition-group


【解决方案1】:

&lt;CSSTransitionGroup&gt; 仅处理组件的安装和卸载动画&lt;CSSTransitionGroup&gt; 组件的子组件。你不应该挂载或卸载&lt;CSSTransitionGroup&gt; 本身,你应该挂载或卸载它的孩子。

它淡入但不淡出的原因是因为您指定了道具transitionAppear={true},这导致&lt;CSSTransitionGroup&gt; 在首次挂载时呈现“出现”动画。但是,当您的 isMaskShown 变量从 true 变为 false 时,请考虑在您的渲染函数内部发生了什么:&lt;CSSTransitionGroup&gt; 立即卸载,没有机会为“离开”过渡设置动画,因为 - 再次- &lt;CSSTransitionGroup&gt; 仅对直接在其中的组件进行动画处理

解决方案是只安装一次您的&lt;CSSTransitionGroup&gt;,使其保持静态,并且仅有条件地渲染其子项。很难从您的代码中分辨出您要对哪个组件进行动画处理,因此我无法为您提供直接的解决方案。但是请记住我的解释,您应该能够弄清楚。

【讨论】:

  • 谢谢,我在这里看到了问题。我决定将所有内容都包装在 组件中,以便能够在我的所有内容上放置一个遮罩,但我不知道如何使它与我拥有的结构一起工作。你有什么想法如何让它工作,这样我就可以有条件地安装带面具或不带面具的模态?好像我需要把 放在别的地方。
  • 如果我不需要面具,我会做这样的事情codepen.io/NoOneKnowsWhoIam/pen/YxPbJe,但正如你所见,面具并没有覆盖所有内容。也许有一种方法可以使用这种结构放置一个蒙版,而我只需要对我的 CSS 做一些事情?
  • @Umbrella 如果遮罩是一个简单的层,用于覆盖模态下方的背景内容,那么模态不需要位于遮罩的inside。将它们分开,以便您可以安装或卸载其中一个而不影响另一个。
猜你喜欢
  • 2015-02-07
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多