react-app-rewired与React Transition Group动画集成

【免费下载链接】react-app-rewired Override create-react-app webpack configs without ejecting 【免费下载链接】react-app-rewired 项目地址: https://gitcode.com/gh_mirrors/re/react-app-rewired

你还在为Create React App项目中添加动画效果时不得不执行eject命令而烦恼吗?本文将展示如何使用react-app-rewired在不暴露Webpack配置的情况下,轻松集成React Transition Group实现流畅的组件过渡动画。读完本文你将学会:配置react-app-rewired自定义Webpack设置、安装并使用React Transition Group、实现常见的淡入淡出和滑动动画效果。

什么是react-app-rewired

react-app-rewired是一个允许你在不执行eject命令的情况下覆盖create-react-app Webpack配置的工具。它通过创建一个config-overrides.js文件来实现自定义配置,避免了eject后维护复杂配置的麻烦。

react-app-rewired logo

项目核心文件结构:

准备工作

安装react-app-rewired

首先确保你的项目中已安装react-app-rewired:

npm install react-app-rewired --save-dev

修改package.json脚本

将package.json中的scripts部分修改为使用react-app-rewired:

"scripts": {
-  "start": "react-scripts start",
+  "start": "react-app-rewired start",
-  "build": "react-scripts build",
+  "build": "react-app-rewired build",
-  "test": "react-scripts test",
+  "test": "react-app-rewired test",
  "eject": "react-scripts eject"
}

创建配置文件

在项目根目录创建config-overrides.js文件,基础结构如下:

module.exports = {
  webpack: function(config, env) {
    // 在这里自定义Webpack配置
    return config;
  },
  devServer: function(configFunction) {
    return function(proxy, allowedHost) {
      const config = configFunction(proxy, allowedHost);
      // 在这里自定义开发服务器配置
      return config;
    };
  }
};

安装React Transition Group

React Transition Group是React官方推荐的动画库,它提供了简单的组件来定义进入和退出过渡效果。

安装命令:

npm install react-transition-group --save

实现基本淡入淡出动画

创建动画组件

创建一个Fade组件,使用CSSTransition实现淡入淡出效果:

import React from 'react';
import { CSSTransition } from 'react-transition-group';
import './Fade.css';

const Fade = ({ in: inProp, children, timeout = 300 }) => (
  <CSSTransition
    in={inProp}
    timeout={timeout}
    classNames="fade"
    unmountOnExit
  >
    {children}
  </CSSTransition>
);

export default Fade;

添加CSS样式

创建对应的CSS文件Fade.css:

.fade-enter {
  opacity: 0;
}
.fade-enter-active {
  opacity: 1;
  transition: opacity 300ms;
}
.fade-exit {
  opacity: 1;
}
.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

使用动画组件

在应用中使用Fade组件包裹需要添加动画的元素:

import React, { useState } from 'react';
import Fade from './Fade';

function App() {
  const [show, setShow] = useState(false);
  
  return (
    <div>
      <button onClick={() => setShow(!show)}>
        切换显示
      </button>
      <Fade in={show}>
        <div>这是一个带有淡入淡出动画的元素</div>
      </Fade>
    </div>
  );
}

export default App;

实现列表过渡动画

使用TransitionGroup可以为列表中的项目添加进入和退出动画:

import React, { useState } from 'react';
import { TransitionGroup, CSSTransition } from 'react-transition-group';
import './List.css';

function List() {
  const [items, setItems] = useState([1, 2, 3]);
  
  const addItem = () => {
    setItems([...items, items.length + 1]);
  };
  
  const removeItem = (index) => {
    setItems(items.filter((_, i) => i !== index));
  };
  
  return (
    <div>
      <button onClick={addItem}>添加项目</button>
      <TransitionGroup>
        {items.map((item, index) => (
          <CSSTransition
            key={item}
            timeout={500}
            classNames="item"
          >
            <div className="item">
              {item}
              <button onClick={() => removeItem(index)}>删除</button>
            </div>
          </CSSTransition>
        ))}
      </TransitionGroup>
    </div>
  );
}

export default List;

对应的CSS样式List.css:

.item-enter {
  opacity: 0;
  transform: translateX(-100%);
}
.item-enter-active {
  opacity: 1;
  transform: translateX(0);
  transition: opacity 500ms, transform 500ms;
}
.item-exit {
  opacity: 1;
  transform: translateX(0);
}
.item-exit-active {
  opacity: 0;
  transform: translateX(100%);
  transition: opacity 500ms, transform 500ms;
}
.item {
  margin: 10px 0;
  padding: 10px;
  border: 1px solid #ccc;
}

配置Webpack支持CSS模块化(可选)

如果你的项目使用CSS模块化,可以通过react-app-rewired进行配置。修改config-overrides.js

module.exports = {
  webpack: function(config, env) {
    // 修改CSS加载器以支持模块化
    const cssLoader = config.module.rules.find(rule => 
      rule.test.toString().includes('css')
    );
    
    if (cssLoader) {
      cssLoader.use.forEach(loader => {
        if (loader.loader && loader.loader.includes('css-loader')) {
          loader.options = {
            ...loader.options,
            modules: {
              localIdentName: '[name]__[local]___[hash:base64:5]',
            },
          };
        }
      });
    }
    
    return config;
  }
};

调试与排错

如果动画不生效,可检查以下几点:

  1. 确保react-app-rewired配置正确,config-overrides.js文件是否在项目根目录
  2. 检查CSS类名是否与CSSTransition的classNames属性匹配
  3. 使用浏览器开发者工具检查元素的类名变化
  4. 确认react-transition-group已正确安装并导入

项目的测试应用可参考test/react-app/目录下的示例代码。

总结

通过react-app-rewired,我们可以在不执行eject的情况下自定义Create React App项目配置,轻松集成React Transition Group实现各种动画效果。本文介绍了淡入淡出动画和列表过渡动画的实现方法,以及如何配置Webpack支持CSS模块化。

更多高级用法可参考:

  • React Transition Group官方文档:https://reactcommunity.org/react-transition-group/
  • react-app-rewired配置说明:README.md

希望本文能帮助你为React应用添加流畅的过渡动画效果!如果觉得有用,请点赞收藏,关注获取更多前端开发技巧。

【免费下载链接】react-app-rewired Override create-react-app webpack configs without ejecting 【免费下载链接】react-app-rewired 项目地址: https://gitcode.com/gh_mirrors/re/react-app-rewired

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐