reactjs - 使用 css 属性 "transition: all",我添加了一个动态类 : (<div className= {`${show ? "show": "hide"}></div> ), 但我的动画不起作用

标签 reactjs

我正在尝试制作一个 Modal 组件。我希望当模态出现时,它会像消失时一样出现过渡。目前这非常不稳定,为什么以及如何解决它?

我希望当显示模态时,它会显示一个动画,当模态消失时(单击按钮),它会显示相同的行为。

非常感谢您的帮助,我知道我会学到很多东西。

//content of styles.css
.modal {
  position: absolute;
  width: 100%;
  height: 100%;
  background: red;
  transition: all 300ms ease-out;
  transform: translateY(100%);
}

.show {
  transform: translateY(0%);
}

.hide {
  transform: translateY(100%);
}

app.js

import Modal from "./modal";
/*
const Modal = ({ show, children }) => {
 return <div className={`modal ${show ? "show" : "hide"}`}>. 
 {children} </div>;
};
export default Modal;
*/
import ModalContent from "./modalContent";
/*
  const ModalContent = ({ show }) => {
   const showModal = () => {
    show();
   };
  return <button onClick={showModal}> close modal</button>;
};
export default ModalContent;
*/
export default function App() {
 const [show, setShow] = useState(false);
 const closeModal = () => {
  setShow(false);
};

useEffect(() => setShow(true), []);

return (
  <div className="App">
    {show && (
      <Modal show={show}>
        <ModalContent show={closeModal} />
      </Modal>
    )}
  </div>
 );
}

我更新了我的代码:

this is my live code

最佳答案

首先,在您的演示模式中立即消失,没有任何过渡。看来,这是由于在 show 状态更改时重新呈现整个 App 组件造成的。从 App 中提取 Modal 组件对我有用:

const Modal = ({ show, children }) => {
  useEffect(() => {}, [show]);
  return <div className={`modal ${show ? "show" : "hide"}`}>{children} </div>;
};

export default function App() {

第二点 - 您无法仅通过 css 转换来控制初始设置。当给定元素上的某些内容(类、属性、伪类)发生变化时,会出现过渡。为了解决这个问题并获得平滑的模态外观,您可以在 App 组件中设置一次性 useEffect,这会将 show 状态从 false 更改为 true。我的整体片段:

const Modal = ({ show, children }) => {
    return <div className={`modal ${show ? "show" : "hide"}`}>{children}        </div>;
};

export default function App() {

const ModalContent = ({ show }) => {
  const showModal = () => {
    show();
  };
  return <button onClick={showModal}> close modal</button>;
};

const [show, setShow] = useState(false);
const closeModal = () => {
  setShow(false);
};

useEffect(() => setShow(true), [])

return (
  <div className="App">
    <Modal show={show}>
      <ModalContent show={closeModal} />
    </Modal>
  </div>
);
}

关于reactjs - 使用 css 属性 "transition: all",我添加了一个动态类 : (<div className= {`${show ? "show": "hide"}></div> ), 但我的动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70312961/

相关文章:

javascript - Object.assign 在这种情况下的行为

javascript - 在 React Redux 中实现的获取操作返回 : "Cannot read property ' title' of undefined"

node.js - 连接reactjs和nodejs

javascript - 如何在React上正确开发分页?

javascript - HTML 事件处理程序与 React 事件处理程序

javascript - react : Warning: React. createElement:类型无效

javascript - 使用react-router-dom在react中全局使用Header

reactjs - 在 React js 中获取时如何隐藏控制台状态错误消息?

javascript - 上下文返回未定义 - useContext

reactjs - 服务端渲染 + 响应式设计 + 内联样式 -> 使用哪个断点?