官方文件:
从使用的角度来看,两者的工作方式相同:
- 他们需要
npm install bootstrap 在 index.js 或 App.js 中导入 Bootstrap 样式表文件,以启用带有 import 'bootstrap/dist/css/bootstrap.min.css'; 的 Bootstrap 默认样式。默认情况下,ReactJS 会将所有 Bootstrap CSS 代码附加到 HTML 页面头部的样式标签中。
import { StrictMode } from "react";
import ReactDOM from "react-dom";
import "bootstrap/dist/css/bootstrap.min.css";
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(
<StrictMode>
<App />
</StrictMode>,
rootElement
);
- 为我们提供在内部重新设计为 JSX 的即用型 Bootstrap 组件,无需使用 JQuery 或 Javascript 直接操作 DOM(使用虚拟 DOM,因为 React 默认已经工作);
- 幕后,使用
React.createElement渲染组件;
道具
根据包的不同,传递给组件的 props 可以有不同的名称。查看 Button 颜色用法:https://codesandbox.io/s/reactbootstrapvsreactstrap-7y87c-7y87c?file=/src/App.js
import React from "react";
import { Button as ReactBootstrapButton } from "react-bootstrap";
import { Button as ReactstrapButton } from "reactstrap";
const App = () => (
<>
<ReactBootstrapButton variant="danger">React BootStrap</ReactBootstrapButton>
<ReactstrapButton color="danger">Reactstrap</ReactstrapButton>
</>
);
export default App;
props 名称不同 color 和 variant,但渲染的 HTML 几乎相同,正如我们在 DevTools 中看到的那样:
幕后
您可以查看这两种实现,将包源代码中的基本组件与Button 进行比较:
- node_modules\react-bootstrap\cjs\Button.js (React Bootstrap ^1.6.0);
- node_modules\reactstrap\dist\reactstrap.cjs.js 行:930 (Reactstrap v^8.9.0);
反应引导
var Button = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
var bsPrefix = _ref.bsPrefix,
variant = _ref.variant,
size = _ref.size,
active = _ref.active,
className = _ref.className,
block = _ref.block,
type = _ref.type,
as = _ref.as,
props = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["bsPrefix", "variant", "size", "active", "className", "block", "type", "as"]);
var prefix = (0, _ThemeProvider.useBootstrapPrefix)(bsPrefix, 'btn');
var classes = (0, _classnames.default)(className, prefix, active && 'active', variant && prefix + "-" + variant, block && prefix + "-block", size && prefix + "-" + size);
if (props.href) {
return /*#__PURE__*/_react.default.createElement(_SafeAnchor.default, (0, _extends2.default)({}, props, {
as: as,
ref: ref,
className: (0, _classnames.default)(classes, props.disabled && 'disabled')
}));
}
if (ref) {
props.ref = ref;
}
if (type) {
props.type = type;
} else if (!as) {
props.type = 'button';
}
var Component = as || 'button';
return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, props, {
className: classes
}));
});
Button.displayName = 'Button';
Button.defaultProps = defaultProps;
var _default = Button;
exports.default = _default;
module.exports = exports["default"];
反应带
var Button = /*#__PURE__*/function (_React$Component) {
_inheritsLoose(Button, _React$Component);
function Button(props) {
var _this;
_this = _React$Component.call(this, props) || this;
_this.onClick = _this.onClick.bind(_assertThisInitialized(_this));
return _this;
}
var _proto = Button.prototype;
_proto.onClick = function onClick(e) {
if (this.props.disabled) {
e.preventDefault();
return;
}
if (this.props.onClick) {
return this.props.onClick(e);
}
};
_proto.render = function render() {
var _this$props = this.props,
active = _this$props.active,
ariaLabel = _this$props['aria-label'],
block = _this$props.block,
className = _this$props.className,
close = _this$props.close,
cssModule = _this$props.cssModule,
color = _this$props.color,
outline = _this$props.outline,
size = _this$props.size,
Tag = _this$props.tag,
innerRef = _this$props.innerRef,
attributes = _objectWithoutPropertiesLoose(_this$props, ["active", "aria-label", "block", "className", "close", "cssModule", "color", "outline", "size", "tag", "innerRef"]);
if (close && typeof attributes.children === 'undefined') {
attributes.children = /*#__PURE__*/React__default.createElement("span", {
"aria-hidden": true
}, "\xD7");
}
var btnOutlineColor = "btn" + (outline ? '-outline' : '') + "-" + color;
var classes = mapToCssModules(classNames(className, {
close: close
}, close || 'btn', close || btnOutlineColor, size ? "btn-" + size : false, block ? 'btn-block' : false, {
active: active,
disabled: this.props.disabled
}), cssModule);
if (attributes.href && Tag === 'button') {
Tag = 'a';
}
var defaultAriaLabel = close ? 'Close' : null;
return /*#__PURE__*/React__default.createElement(Tag, _extends({
type: Tag === 'button' && attributes.onClick ? 'button' : undefined
}, attributes, {
className: classes,
ref: innerRef,
onClick: this.onClick,
"aria-label": ariaLabel || defaultAriaLabel
}));
};
return Button;
}(React__default.Component);
尽管有一些不同,比如reactstrap实现的prototype的使用方法,特别是在这个组件中,一些额外props的处理,总的来说,它们之间没有显着差异。
组件列表
可用组件有 80% 到 90% 相同,其中一些只是名称不同。
React Bootstrap:警报、手风琴、徽章、面包屑、按钮、按钮组、卡片、轮播、下拉菜单、图形、表单、输入组、图像、Jumbotron、列表组、模态、导航、导航栏、叠加层、分页、弹出框、进度、微调器、表格、选项卡、工具提示、Toast。
Reactstrap:警报、徽章、面包屑、按钮下拉菜单、按钮组、按钮、卡片、轮播、折叠、下拉菜单、淡入淡出、表单、输入组、Jumbotron、布局、列表、列表组、媒体、模态框、导航栏、导航、分页、弹出框、进度、微调器、表格、标签、Toasts、工具提示。
基准测试
你可以看到我关于它的完整原始帖子here