我是一个非常活跃的Dash用户,我开始发现我的Dash使用有很多限制,我意识到关于如何将组件转换为Dash的信息/内容是绝对有限的,有一些过时且非常简单的示例。。。我几乎没有任何Javascript或React方面的知识,我完全不知道如何转换组件
我正在尝试将响应网格布局组件从react.js转换为Plotly-Dash,但我不知道在这种情况下应该如何处理属性? 链接到组件: https://github.com/STRML/react-grid-layout/blob/master/lib/ResponsiveReactGridLayout.jsx
由于我没有使用react.js的经验,我不知道应该做哪些修改才能将此组件转换为Plotly Dash
对于上面的组件,我应该只声明Proptypes上的属性(如下所示),还是需要做更多的修改
ResponsiveReactGridLayout.propTypes{
//
// Basic props
//
className: PropTypes.string,
style: PropTypes.object,
// This can be set explicitly. If it is not set, it will automatically
// be set to the container width. Note that resizes will *not* cause this to adjust.
// If you need that behavior, use WidthProvider.
width: PropTypes.number,
// If true, the container height swells and contracts to fit contents
autoSize: PropTypes.bool,
// # of cols.
cols: PropTypes.number,
// A selector that will not be draggable.
draggableCancel: PropTypes.string,
// A selector for the draggable handler
draggableHandle: PropTypes.string,
// Deprecated
verticalCompact: function (props: Props) {
if (
props.verticalCompact === false &&
process.env.NODE_ENV !== "production"
) {
console.warn(
// eslint-disable-line no-console
"`verticalCompact` on <ReactGridLayout> is deprecated and will be removed soon. " +
'Use `compactType`: "horizontal" | "vertical" | null.'
);
}
},
// Choose vertical or hotizontal compaction
compactType: PropTypes.oneOf(["vertical", "horizontal"]),
// layout is an array of object with the format:
// {x: Number, y: Number, w: Number, h: Number, i: String}
layout: function (props: Props) {
var layout = props.layout;
// I hope you're setting the data-grid property on the grid items
if (layout === undefined) return;
require("./utils").validateLayout(layout, "layout");
},
//
// Grid Dimensions
//
// Margin between items [x, y] in px
margin: PropTypes.arrayOf(PropTypes.number),
// Padding inside the container [x, y] in px
containerPadding: PropTypes.arrayOf(PropTypes.number),
// Rows have a static height, but you can change this based on breakpoints if you like
rowHeight: PropTypes.number,
// Default Infinity, but you can specify a max here if you like.
// Note that this isn't fully fleshed out and won't error if you specify a layout that
// extends beyond the row capacity. It will, however, not allow users to drag/resize
// an item past the barrier. They can push items beyond the barrier, though.
// Intentionally not documented for this reason.
maxRows: PropTypes.number,
//
// Flags
//
isBounded: PropTypes.bool,
isDraggable: PropTypes.bool,
isResizable: PropTypes.bool,
// If true, grid items won't change position when being dragged over.
preventCollision: PropTypes.bool,
// Use CSS transforms instead of top/left
useCSSTransforms: PropTypes.bool,
// parent layout transform scale
transformScale: PropTypes.number,
// If true, an external element can trigger onDrop callback with a specific grid position as a parameter
isDroppable: PropTypes.bool,
// Resize handle options
resizeHandles: resizeHandlesType,
resizeHandle: resizeHandleType,
//
// Callbacks
//
// Callback so you can save the layout. Calls after each drag & resize stops.
onLayoutChange: PropTypes.func,
// Calls when drag starts. Callback is of the signature (layout, oldItem, newItem, placeholder, e, ?node).
// All callbacks below have the same signature. 'start' and 'stop' callbacks omit the 'placeholder'.
onDragStart: PropTypes.func,
// Calls on each drag movement.
onDrag: PropTypes.func,
// Calls when drag is complete.
onDragStop: PropTypes.func,
//Calls when resize starts.
onResizeStart: PropTypes.func,
// Calls when resize movement happens.
onResize: PropTypes.func,
// Calls when resize is complete.
onResizeStop: PropTypes.func,
// Calls when some element is dropped.
onDrop: PropTypes.func,
//
// Other validations
//
droppingItem: PropTypes.shape({
i: PropTypes.string.isRequired,
w: PropTypes.number.isRequired,
h: PropTypes.number.isRequired
}),
// Children must not have duplicate keys.
children: function (props: Props, propName: string) {
var children = props[propName];
// Check children keys for duplicates. Throw if found.
var keys = {};
React.Children.forEach(children, function (child) {
if (keys[child.key]) {
throw new Error(
'Duplicate child key "' +
child.key +
'" found! This will cause problems in ReactGridLayout.'
);
}
keys[child.key] = true;
});
},
// Optional ref for getting a reference for the wrapping div.
innerRef: PropTypes.any
};
欢迎提供任何帮助或参考资料
问候,, 莱昂纳多
实现定制组件
如果您只想使用带有通过
npm
(如react-grid-layout
)提供的包的库中的组件,则不需要在这些库中重新实现组件。您只需使用npm
安装它们,并在自定义组件中使用它们使用
ResponsiveGridLayout
(src/lib/components/GridLayout.react.js
)的组件示例:环境设置(如果已经完成此操作,请跳过)
要创建和编辑自定义组件,您需要按照说明设置cookiecutter dash-component-boilerplate
但是,要重复几个要点中所述的内容,您需要:
cookiecutter
:pip install cookiecutter
https://github.com/plotly/dash-component-boilerplate.git
。这将生成一个环境,您可以在其中创建自定义组件李>grid_layout
,如果在cookiecutter
的提示下选择不同的值,您的结构将不同李>pip install -r requirements.txt
来安装所需的python依赖项。现在还可以使用npm i react-grid-layout
安装react-grid-layout
李>基本用法
安装完所有内容后,我们可以在
src/lib/components
目录中编辑自定义组件。当我们做了一些更改(用上面列出的代码替换了示例代码)并且我们感到满意时,我们可以运行npm run build
来保持更改之后,您可以运行
python usage.py
,使用自定义组件的dash应用程序将运行usage.py
是一个常规的Dash
应用程序,它在构建过程之后导入从react
组件生成的组件,并且可以如下所示:您也可以根据自己的喜好对其进行编辑
相关问题 更多 >
编程相关推荐