【问题标题】:React useState() - no css transitions? Just jumps to new class without animation/transition反应 useState() - 没有 css 转换?只是跳到没有动画/过渡的新课程
【发布时间】:2020-08-15 22:53:40
【问题描述】:

我有一个用 React 的useState() 设置的条件类,不知何故,转换不是针对的。它只是跳转到新的类值。

在下面的代码示例中,我试图使其尽可能干净。 随着线 className={`collapse my-navbar-collapse ${toggle ? "show" : ""}`}我设置了班级。

我在这里错过了什么?

header.js

import React, { useState } from "react"
import "./header.sass"

const Header = () => {
  const [toggle, setToggle] = useState(false)

  return (
    <div className={'sticky-top'}>

      <button
        className="btn navbar-toggler"
        type="button"
        onClick={ () => setToggle(!toggle) }
      >
        button stuff
      </button>

      <div className={`collapse my-navbar-collapse ${toggle ? "show" : ""}`}>
        rest of my stuff
      </div>

    </div>

  )
}

export default Header

header.sass

.my-navbar-collapse
  background-color: red
  transition: all 2s ease
  height: 0

  &.show
    height: 100vh

(当一切正常时,我会将transition: all 2s easeall 更改为height。我只想先为这个测试捕获每一个 :)

【问题讨论】:

  • React 部分对我来说看起来不错,我猜问题出在 CSS 中,那么 collapse 类呢?你检查了吗?
  • @Makan,是的,就是这样。我将引导方法更改为自己的方法。但是collapseshow(绝对是组合)问题出在哪里。删除了类并添加了新的独特类,它的动画效果很好。 (不顺利,但它有效)如果您可以将其添加为答案,我会接受它。谢谢!
  • 不,它现在已经消失了。等等,什么?它工作了一些刷新。现在不是 :) :) 几个撤消和重做,我找不到它......猜它不是 collapse
  • 您可能想在有问题的 div 上使用 chrome 的计算属性 devtool,看看是否有什么东西覆盖了您正在设置的转换。你也可以在转换之后加上 !important 看看是否能解决问题。
  • @Tim 发生了 :)

标签: javascript css reactjs react-hooks use-state


【解决方案1】:

正如您从这个演示中看到的那样,我在高度过渡方面没有任何问题。

但是,您似乎忘记了 CSS 中的 overflow: hidden。您需要这个,因为默认情况下,css 会尝试确保即使样式混乱也不会丢失任何内容,因此为了在您的导航栏折叠时隐藏“我的其余内容”文本,您需要确保隐藏它.

看起来问题出在折叠类中。 Bootstrap 的 transitions.css 通过该类添加 display: none。如果没有显示,则 css 无法正确转换。因此问题。

该示例现在有 2 个按钮,一个触发具有折叠类的 div,另一个 div 没有它。

const Header = () => {
  const [toggle, setToggle] = React.useState(false);
  const [toggle2, setToggle2] = React.useState(false);
  return (
    <div className={'sticky-top'}>
      <button
        className="btn navbar-toggler"
        type="button"
        onClick={() => setToggle(!toggle)}
      >
        button stuff - collapse
      </button>

      <div className={`collapse my-navbar-collapse ${toggle ? 'show' : ''}`}>
        rest of my stuff
      </div>
      <button
        className="btn navbar-toggler"
        type="button"
        onClick={() => setToggle2(!toggle2)}
      >
        button stuff - no collapse
      </button>

      <div className={`my-navbar-collapse ${toggle2 ? 'show' : ''}`}>
        rest of my stuff
      </div>
    </div>
  );
};
ReactDOM.render(<Header />, document.querySelector('#root'));
.my-navbar-collapse {
  background-color: red;
  transition: height 2s ease;
  height: 0;
  overflow: hidden;
}

.my-navbar-collapse.show {
  height: 100vh;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="root" />

【讨论】:

  • 感谢您的示例!正如@Makan 提到的,错误在于引导程序的collapse 类和我的代码的组合。但是overflow 绝对有帮助:)
  • 看起来这是引导程序的折叠类。它正在添加display: none
  • @Tim 如果你在我更新后还没有看到这个,你应该能够确保你的 div 没有 display: none
  • 谢谢,好像有别的反应。我已经换掉了所有的类名,以确保它不会干扰其他东西。但没有成功。它只是有时有效。有时不是。就在刷新页面之后。无需更改代码。它被包裹在 useContext() 钩子内。
  • 听起来好像还有其他问题,正如演示的那样,您提供给我们的基础部分已经可以使用。我可能会建议制作一个可重现的示例,说明它不能在代码沙箱等中工作,并为它设置一个新问题。如果您从工作示例开始并添加直到它停止,它还可能让您了解出了什么问题。
猜你喜欢
  • 2021-12-11
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2020-06-05
相关资源
最近更新 更多