React 中的树视图
Tree view in React
这是我的数据:
{
"studentId": "P1",
"assignments": [
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t1",
"isAssigned": false
}
]
},
{
"CourseId": 112,
"subjectId": "s1",
"topics": [
{
"topicId": "t1",
"isAssigned": false
},
{
"topicId": "t2",
"isAssigned": false
}
]
},
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t3",
"isAssigned": false
}
]
},
{
"CourseId": 113,
"subjectId": "s2",
"topics": [
{
"topicId": "t4",
"isAssigned": false
}
]
},
{
"CourseId": 114,
"subjectId": "",
"topics": [
{
"topicId": "t5",
"isAssigned": false
}
]
},
{
"CourseId": 115,
"subjectId": "s4",
"topics": [
{
"topicId": "t6",
"isAssigned": false
}
]
}
],
"updatedOn": null,
"updatedBy": null
}
我正在尝试以此为基础在 React 中创建一个树视图。我正在使用“react-checkbox-tree”。仅在分配对象上创建树视图,因为其余数据仅用于保存功能。
我已经创建了基本架构,因为我在模态中需要它 window。它适用于硬编码数据,但我发现很难将我的数据集转换为树视图所需的格式。下面是工作正常的硬编码对象。
const nodes = [{
value: 'mars',
label: 'Mars',
children: [
{ value: 'phobos', label: 'Phobos' },
{ value: 'deimos', label: 'Deimos' },
],
}];
试试下面的代码。这基本上是将所有第一个值转换为对象 {value.., label..}
如果您的代码中有任何特定条件,它不应始终考虑第一个对象,那么请在您的问题中提及它。
const assignments = [
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t1",
"isAssigned": false
}
]
},
{
"CourseId": 112,
"subjectId": "s1",
"topics": [
{
"topicId": "t1",
"isAssigned": false
},
{
"topicId": "t2",
"isAssigned": false
}
]
},
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t3",
"isAssigned": false
}
]
},
{
"CourseId": 113,
"subjectId": "s2",
"topics": [
{
"topicId": "t4",
"isAssigned": false
}
]
},
{
"CourseId": 114,
"subjectId": "",
"topics": [
{
"topicId": "t5",
"isAssigned": false
}
]
},
{
"CourseId": 115,
"subjectId": "s4",
"topics": [
{
"topicId": "t6",
"isAssigned": false
}
]
}
];
const mapAssignment = (object, key) => ({value: key, label: object[key]});
console.log(assignments.map(ass => {
let assObj = {...mapAssignment(ass, 'CourseId')};
if(ass.subjectId) {
assObj['children'] = mapAssignment(ass, 'subjectId');
if(ass.topics.length > 0) assObj['children']['children'] = ass.topics.map(child => mapAssignment(child, 'topicId'))
}
else if(ass.topics.length > 0) assObj['children'] = ass.topics.map(child => mapAssignment(child, 'topicId'))
return assObj;
}));
这是我的数据:
{
"studentId": "P1",
"assignments": [
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t1",
"isAssigned": false
}
]
},
{
"CourseId": 112,
"subjectId": "s1",
"topics": [
{
"topicId": "t1",
"isAssigned": false
},
{
"topicId": "t2",
"isAssigned": false
}
]
},
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t3",
"isAssigned": false
}
]
},
{
"CourseId": 113,
"subjectId": "s2",
"topics": [
{
"topicId": "t4",
"isAssigned": false
}
]
},
{
"CourseId": 114,
"subjectId": "",
"topics": [
{
"topicId": "t5",
"isAssigned": false
}
]
},
{
"CourseId": 115,
"subjectId": "s4",
"topics": [
{
"topicId": "t6",
"isAssigned": false
}
]
}
],
"updatedOn": null,
"updatedBy": null
}
我正在尝试以此为基础在 React 中创建一个树视图。我正在使用“react-checkbox-tree”。仅在分配对象上创建树视图,因为其余数据仅用于保存功能。
我已经创建了基本架构,因为我在模态中需要它 window。它适用于硬编码数据,但我发现很难将我的数据集转换为树视图所需的格式。下面是工作正常的硬编码对象。
const nodes = [{
value: 'mars',
label: 'Mars',
children: [
{ value: 'phobos', label: 'Phobos' },
{ value: 'deimos', label: 'Deimos' },
],
}];
试试下面的代码。这基本上是将所有第一个值转换为对象 {value.., label..}
如果您的代码中有任何特定条件,它不应始终考虑第一个对象,那么请在您的问题中提及它。
const assignments = [
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t1",
"isAssigned": false
}
]
},
{
"CourseId": 112,
"subjectId": "s1",
"topics": [
{
"topicId": "t1",
"isAssigned": false
},
{
"topicId": "t2",
"isAssigned": false
}
]
},
{
"CourseId": 111,
"subjectId": "",
"topics": [
{
"topicId": "t3",
"isAssigned": false
}
]
},
{
"CourseId": 113,
"subjectId": "s2",
"topics": [
{
"topicId": "t4",
"isAssigned": false
}
]
},
{
"CourseId": 114,
"subjectId": "",
"topics": [
{
"topicId": "t5",
"isAssigned": false
}
]
},
{
"CourseId": 115,
"subjectId": "s4",
"topics": [
{
"topicId": "t6",
"isAssigned": false
}
]
}
];
const mapAssignment = (object, key) => ({value: key, label: object[key]});
console.log(assignments.map(ass => {
let assObj = {...mapAssignment(ass, 'CourseId')};
if(ass.subjectId) {
assObj['children'] = mapAssignment(ass, 'subjectId');
if(ass.topics.length > 0) assObj['children']['children'] = ass.topics.map(child => mapAssignment(child, 'topicId'))
}
else if(ass.topics.length > 0) assObj['children'] = ass.topics.map(child => mapAssignment(child, 'topicId'))
return assObj;
}));