- ReactJS 菜鸟教程
- ReactJS 教程
- ReactJS - 简介
- ReactJS - 安装
- ReactJS - 特性
- ReactJS - 优点和缺点
- ReactJS - 架构
- ReactJS - 创建 React 应用程序
- ReactJS - JSX
- ReactJS - 组件
- ReactJS - 嵌套组件
- ReactJS - 使用组件
- ReactJS - 组件集合
- ReactJS - 样式
- ReactJS - 属性(props)
- ReactJS - 使用属性创建组件
- ReactJS - props 验证
- ReactJS - 构造函数
- ReactJS - 组件生命周期
- ReactJS - 事件管理
- ReactJS - 创建事件感知组件
- ReactJS - 在Expense Manager APP中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React 钩子的组件生命周期
- ReactJS - 组件的布局
- ReactJS - 分页
- ReactJS - Material 用户界面
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 不受控制的组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键
- ReactJS - 路由
- ReactJS - 冗余
- ReactJS - 动画
- ReactJS - 引导程序
- ReactJS - 地图
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- ReactJS - 钩子简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义钩子
- ReactJS - 可访问性
- ReactJS - 代码拆分
- ReactJS - 上下文
- ReactJS - 错误边界
- ReactJS - 转发引用
- ReactJS - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 优化性能
- ReactJS - 分析器 API
- ReactJS - 门户
- ReactJS - 没有 ES6 ECMAScript 的 React
- ReactJS - 没有 JSX 的 React
- ReactJS - 协调
- ReactJS - 引用和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - 严格模式
- ReactJS - Web 组件
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - 属性类型
- ReactJS - 浏览器路由器
- ReactJS - DOM
- ReactJS - 旋转木马
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
ReactJS - 与其他库集成
尽管 react 提供了创建完整 Web 应用程序所需的所有功能,但由于遗留系统在另一个库中编码、从另一个框架迁移等,因此必须与其他库集成,React 可以与其他库共存并提供必要的基础设施与其他系统一起使用。
在本章中,让我们看看如何将 react 组件与其他库(如 jQuery、backbone 等)一起使用。
基于 CreateRoot 的集成
React 使用 ReactDOMClient 模块中的 createRoot() 方法将自身附加到主 HTML 文档。createRoot() 不会干扰 HTML 文档,但附加元素除外。开发人员可以利用此行为在同一文档中混合使用多个库。
让我们看看如何通过将 react 应用程序附加到一个单独的元素中来将 jQuery 和 React 组件集成到一个文档中。
首先,创建一个新的 react 应用程序并使用以下命令启动它。
cd myapp
npm start
接下来,创建一个 react 组件,在组件文件夹 (src/components/Hello.js) 下
import React from "react";
class Hello extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div>Hello, {this.props.name}</div>
);
}
}
export default Hello;
接下来,打开index.html(public/index.html)并添加一个新容器(jquery-root),如下所示 -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Web site created using create-react-app" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<script src="https://code.jquery.com/jquery-3.6.1.slim.min.js"></script>
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div style="padding: 10px;">
<div id="root"></div>
<div id="jquery-root"></div>
</div>
<script>
$(document).ready(function() {
$("#jquery-root").text("Hello, from jQuery")
})
</script>
</body>
</html>
这里
- 通过CDN链接的jQuery库
- 它按照传统方式通过 $(document).ready 方法进行初始化
- 并用于使用 jQuery 选择器(#jquery-root)和文本方法附加消息
接下来,打开 index.js (src/index.js) 并将我们的 你好 组件附加到根容器中,如下所示 -
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import Hello from './Components/Hello';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Hello name="from React" />
</React.StrictMode>
);
reportWebVitals();
这里
- React 应用程序使用 createRoot() 方法附加。
- 将 Hello 组件呈现到 HTML 文档的根元素中。
最后,在浏览器中打开应用程序并检查结果。react 和 jQuery 库都会发出你好消息,如下所示 -
基于 Ref 的集成
一般来说,React 不知道其他库所做的任何 DOM 操作。因此,要将 React 与其他库一起使用,React 不应执行任何 DOM 操作,而应将所有更改转发到其他库。
正如我们所知,React 提供了一个称为 Ref 的逃生舱口来操作 DOM 元素,而不会影响/受状态变化的影响。开发人员可以利用这些功能来创建其他库的包装器 react 组件,并在 react 应用程序中使用它。在 React 组件中使用其他库的标准步骤如下:
- 创建一个 react 组件并渲染一个空的 div
render() {
return <div />
}
- 将 ref 附加到渲染的 div 上,如下所示 -
render() {
return <div ref={el => this.el = el} />
}
- 在 componentDidMount() 生命周期事件中使用附加的 ref 操作 dom 元素,如下所示 -
componentDidMount() {
this.$el = $(this.el);
this.$el.somePlugin(); // create dom
// call this.$el.pluginAPI() as necessary
}
- 在 componentWillUnmount() 生命周期事件中使用附加的 ref 销毁 dom 元素,如下所示 -
componentWillUnmount() {
this.$el.somePlugin('destroy'); // destroy dom
// this.$el.destroyAPI() to remove the element from the dom
}
让我们应用这些技术,在下一节中将jQuery插件集成到应用程序中。
JQuery slick 插件集成
让我们尝试将流畅的 jquery 插件 (https://github.com/kenwheeler/slick) 集成到 react 组件中
首先,创建一个新的 react 应用程序并使用以下命令启动它。
cd myapp
npm start
接下来,安装流畅的jQuery插件
接下来,将 slick 插件包(css 和 assets)中的 slick 文件夹复制到应用程序的公共文件夹中。滑块文件夹的内容如下图所示 -
├── ajax-loader.gif
├── config.rb
├── fonts
│ ├── slick.eot
│ ├── slick.svg
│ ├── slick.ttf
│ └── slick.woff
├── slick-theme.css
├── slick-theme.less
├── slick-theme.scss
├── slick.css
├── slick.js
├── slick.less
├── slick.min.js
└── slick.scss
接下来,创建一个简单的组件 ReactSlick (src/Components/ReactSlick.js),如下所示 -
import React from "react";
import $ from 'jquery';
import slick from 'slick-carousel';
class ReactSlick extends React.Component {
componentDidMount() {
this.$el = $(this.el);
this.$el.slick();
}
componentWillUnmount() {
this.$el.slick('destroy');
}
render() {
return (
<div>
<div ref={el => this.el = el}>
{this.props.children}
</div>
</div>
);
}
}
export default ReactSlick;
这里
- 从道具中渲染了一个带有子元素的 div
- 将 ref 附加到 div 元素
- 在 componentDidMount() 生命周期事件中使用 ref 将插件附加到元素
- 在 componentWillUnmount 生命周期事件中使用 ref 销毁了插件到元素
接下来,打开 App 组件 (src/App.js) 并使用 ReactSlick 组件更新内容,如下所示 -
import ReactSlick from './Components/ReactSlick';
function App() {
return (
<ReactSlick>
<div className="box"><h1>1</h1></div>
<div className="box"><h1>2</h1></div>
<div className="box"><h1>3</h1></div>
<div className="box"><h1>4</h1></div>
</ReactSlick>
);
}
export default App;
这里
- 渲染了 ReactSlick 组件
- 使用四个带有数字(1,2,3 和 4)的 div 作为滑块
接下来,打开 App.css (src/App.css) 并删除所有 CSS 类。然后,打开index.html (public/index.html) 并添加必要的样式,如下所示 -
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="stylesheet" type="text/css" href="slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/>
<style>
#root {
margin: auto;
padding-left: 25px;
padding-top: 25px;
width: 300px;
color: gray;
font-family:Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
padding-left : 25px;
text-align: center;
}
.box {
background-color: skyblue;
text-align: center;
color: white
}
</style>
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div style="background-color: white; margin: 2px;">
<div id="root"></div>
</div>
</body>
</html>
在这里,我们有,
- 更新了根组件的样式
- 更新了滑块 (.box ) 的样式)
- 包括 slick 插件特定样式(slick/slick.css 和 slick/slick-theme.css)
最后,在浏览器中打开应用程序。jQuery 光滑滑块将通过 React 组件渲染,如下所示 -
总结
React 提供了多种方式来在同一项目中使用 react 和其他库。每种集成方法都简单有效。开发人员应避免使用其他库,除非在不可避免的情况下,如遗留应用程序、迁移应用程序等,