问题描述
我正在尝试基于以下示例使用 react-data-grid 实现可拖动列:https://github.com/adazzle/react-data-grid/blob/canary/stories/demos/ColumnsReordering.tsx
我看到这个例子需要创建一个 DraggableHeaderRenderer 文件,所以我将以下文件复制到我的项目中并将其转换为 React:https://github.com/adazzle/react-data-grid/blob/canary/stories/demos/components/HeaderRenderers/DraggableHeaderRenderer.tsx
我的问题是我不知道从哪里导入 useCombinedRefs。 它不是从 react-data-grid 导出的。我在 repo 中看到它位于 src/hooks 中。
我尝试了以下方法:
import {useCombinedRefs} from 'react-data-grid'
// Error: Attempted import error: 'useCombinedRefs' is not exported from 'react-data-grid'.
import {useCombinedRefs} from 'react-data-grid/lib/hooks';
// Error: Module not found: Can't resolve 'react-data-grid/lib/hooks' in 'C:\Users\Liam\Desktop\Work\MyProject\src\ReactDataGrid'
import useCombinedRefs from 'react-data-grid/lib/hooks/useCombinedRefs';
// Error: Module not found: Can't resolve 'react-data-grid/lib/hooks/useCombinedRefs' in 'C:\Users\Liam\Desktop\Work\MyProject\src\ReactDataGrid'
感谢任何可以提供帮助的人。
这是我的代码: DraggableHeaderRenderer.js
import { useDrag,useDrop } from 'react-dnd';
import React from 'react'
import { SortableHeaderCell } from 'react-data-grid';
import useCombinedRefs from 'react-data-grid/lib/hooks/useCombinedRefs';
export function DraggableHeaderRenderer({ onColumnsReorder,column,sortColumn,sortDirection,onSort }) {
const [{ isDragging },drag] = useDrag({
item: { key: column.key,type: 'COLUMN_DRAG' },collect: monitor => ({
isDragging: !!monitor.isDragging()
})
});
const [{ isOver },drop] = useDrop({
accept: 'COLUMN_DRAG',drop({ key,type }) {
if (type === 'COLUMN_DRAG') {
onColumnsReorder(key,column.key);
}
},collect: monitor => ({
isOver: !!monitor.isOver(),canDrop: !!monitor.canDrop()
})
});
return (
<div
ref={useCombinedRefs(drag,drop)}
style={{
opacity: isDragging ? 0.5 : 1,backgroundColor: isOver ? '#ececec' : 'inherit',cursor: 'move'
}}
>
<SortableHeaderCell
column={column}
sortColumn={sortColumn}
sortDirection={sortDirection}
onSort={onSort}
>
{column.name}
</SortableHeaderCell>
</div>
);
}
TestDataGrid.js
import React from 'react';
import DataGrid from 'react-data-grid';
import {DraggableHeaderRenderer} from './DraggableHeaderRenderer';
import { useState,useCallback,useMemo } from 'react';
import 'react-data-grid/dist/react-data-grid.css';
const createRows = () => {
const rows = [];
for (let i = 1; i < 500; i++) {
rows.push({
id: i,task: `Task ${i}`,complete: Math.min(100,Math.round(Math.random() * 110)),priority: ['Critical','High','Medium','Low'][Math.round(Math.random() * 3)],issueType: ['Bug','Improvement','Epic','Story'][Math.round(Math.random() * 3)]
});
}
return rows;
}
const createColumns = () => {
return [
{
key: 'id',name: 'ID',width: 80,},{
key: 'task',name: 'Title',resizable: true,sortable: true,draggable: true
},{
key: 'priority',name: 'Priority',{
key: 'issueType',name: 'Issue Type',{
key: 'complete',name: '% Complete',draggable: true
}
];
}
export default function TestDataGrid() {
const [rows] = useState(createRows)
const [columns,setColumns] = useState(createColumns)
const draggableColumns = useMemo(() => {
const HeaderRenderer = (props) => {
return <DraggableHeaderRenderer {...props} onColumnsReorder={handleColumnsReorder}/>
}
const handleColumnsReorder = (sourceKey,targetKey) => {
const sourceColumnIndex = columns.findIndex(c => c.key === sourceKey);
const targetColumnIndex = columns.findIndex(c => c.key === targetKey);
const reorderedColumns = [...columns];
reorderedColumns.splice(
targetColumnIndex,reorderedColumns.splice(sourceColumnIndex,1)[0]
);
setColumns(reorderedColumns);
}
return columns.map(c => {
if(c.key === "id") return c;
return {...c,HeaderRenderer}
});
},[columns])
return (
<DataGrid
columns={draggableColumns}
rows={rows}
/>
);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)