предисловие
Друзья, работающие с интерфейсом, часто могут сталкиваться с необходимостью создания пользовательской панели инструментов. Так что же такое настраиваемая панель инструментов? Пользовательская информационная панель на самом деле является пользовательской панелью. Пользователи могут свободно перетаскивать, добавлять и удалять компоненты на панели. Компоненты могут быть различными графическими диаграммами или различными таблицами данных. С помощью комбинации перетаскивания различных компонентов пользователи могут настраивать панели, которые они хотят видеть.
Предварительный просмотр проекта
Компоненты можно динамически добавлять, удалять, перетаскивать и свободно масштабировать. И после масштабирования диаграмма echarts внутри компонента также будет увеличена.Технологическая архитектура
- Внешний фреймворк:React
- Библиотека пользовательского интерфейса:Ant Design
- строительные леса:create-react-app
- Перетащите плагин:react-grid-layout
Техническая реализация
1. Установите пакет react-grid-layout с помощью npm.
npm install react-grid-layout
2. Объявление плагина и введение в стиль
Во-первых, добавьте компоненты WidthProvider и Responsive в файл js и создайте экземпляры адаптивных компонентов перетаскивания. Во-вторых, введите стиль плагина в файл css.
import { WidthProvider, Responsive } from "react-grid-layout";
const ResponsiveReactGridLayout = WidthProvider(Responsive);
@import '~react-grid-layout/css/styles.css';
@import '~react-resizable/css/styles.css';
3. Рендеринг
Рендеринг перетаскиваемых макетов в методе рендеринга React. Компонент ResponsiveReactGridLayout имеет несколько свойств, вот еще несколько важных пояснений:
- cols: определяет, как адаптивный макет делится на несколько столбцов.
- rowHeight: высота строки компонента в адаптивном макете.
- onLayoutChange: эта функция срабатывает, когда компонент в адаптивном макете перетаскивается или увеличивается или уменьшается.
<ResponsiveReactGridLayout
className="layout"
{...this.props}
layouts={this.state.layouts}
onLayoutChange={(layout, layouts) =>
this.onLayoutChange(layout, layouts)
}
>
{this.generateDOM()}
</ResponsiveReactGridLayout>
4. Генерация DOM компонентов
Компоненты макета генерируются функцией generateDOM.Во-первых, массив компонентов просматривается, и тип каждого компонента используется для определения того, следует ли создавать компонент столбчатой диаграммы, компонент полилинии или компонент круговой диаграммы. Каждый компонент должен определять глобально уникальное значение ключа. data-grid привязывает свои свойства к каждому компоненту. Конкретные свойства сетки данных описаны ниже.
generateDOM = () => {
return _.map(this.state.widgets, (l, i) => {
let option;
if (l.type === 'bar') {
option = getBarChart();
}else if (l.type === 'line') {
option = getLineChart();
}else if (l.type === 'pie') {
option = getPieChart();
}
let component = (
<ReactEcharts
option={option}
notMerge={true}
lazyUpdate={true}
style={{width: '100%',height:'100%'}}
/>
)
return (
<div key={l.i} data-grid={l}>
<span className='remove' onClick={this.onRemoveItem.bind(this, i)}>x</span>
{component}
</div>
);
});
};
5. Добавьте компоненты через функцию addItem.
Свойства каждого компонента следующие:
- x: координата компонента по оси X
- y: координата компонента по оси Y
- w: ширина компонента
- h: высота компонента
- i: значение ключа компонента
addItem(type,widgetId) {
const addItem = {
x: (this.state.widgets.length * 2) % (this.state.cols || 12),
y: Infinity, // puts it at the bottom
w: 2,
h: 2,
i: widgetId || new Date().getTime().toString(),
};
this.setState(
{
widgets: this.state.widgets.concat({
...addItem,
type,
}),
},
);
};
6. Удалите надстройку с помощью функции onRemoveItem.
onRemoveItem(i) {
console.log(this.state.widgets)
this.setState({
widgets: this.state.widgets.filter((item,index) => index !=i)
});
}
постскриптум
Спасибо за поддержку. Если есть какие-то недостатки, пожалуйста, указывайте на них и поощряйте друг друга.
Если вы думаете, что это хорошо, не забудьте поставить лайк, спасибо😂
Добро пожаловать, чтобы следовать за мной:【Блог】【Гитхаб】【Наггетс】【Краткая книга】