У меня (кажется) была та же проблема, и я нашел решение, которое использует функциональность фильтрации bootstrap-vue <b-table>
для достижения эффекта расширения и свертывания строк.
Естьминимальный пример в JSFiddle здесь:
https://jsfiddle.net/adlaws/mk4128dg/
В основном вы предоставляете древовидную структуру для таблицы следующим образом:
[
{
columnA: 'John', columnB:'Smith', columnC:'75',
children:
[
{ columnA: 'Mary', columnB:'Symes', columnC:'46' },
{ columnA: 'Stan', columnB:'Jones', columnC:'42' },
{ columnA: 'Pat', columnB:'Black', columnC:'38' },
]
}
]
Затем дерево "сплющивается""к строкам, которые могут отображаться в таблице методом _flattenTreeStructure()
.Во время этого процесса строки также аннотируются некоторыми дополнительными свойствами для уникальной идентификации строки, хранения глубины строки (используемой для отступа), родительской строки строки (если есть) и того, развернута ли строка в настоящее время или нет..
Как только это будет сделано, уплощенная структура может быть передана <b-table>
, так как это всего лишь массив строк - это делается через свойство compute
d flattenedTree
.
Основная работа теперь выполняется методом _filterFunction()
, который обеспечивает настраиваемую фильтрацию таблицы.Он работает с состоянием свойства expandedRowIndices
элемента данных filterObj
.
При нажатии кнопок раскрытия / сворачивания индекс строки (заполняемый в процессе выравнивания) вставляется в качестве ключав expandedRowIndices
с true
или false
, указывающим его текущее расширенное состояние.
_filterFunction()
использует это для «отфильтровывания» строк, которые не развернуты, что приводит к эффекту расширения /сворачивание дерева в таблице.
ОК, так что это работает (ууу!), но ...
- это не так гибко, как база
<b-table>
;если вы хотите отобразить разные столбцы данных, вам нужно будет поработать и заново выполнить разделы <template slot="???">
для столбцов, как требуется. - , если вы хотите использовать фильтрацию для фильтрации content (например, с помощью текстового поиска) вам необходимо расширить функцию пользовательского фильтра, чтобы учесть это также
- сортировка данные не являютсячто-то, что я должен был сделать для своего варианта использования, и я не уверен, как это будет работать в контексте древовидной структуры - поддержание родительских / дочерних отношений дерева при изменении порядка строк будет ... забавнои я подозреваю, что это было бы хорошей задачей для тех, кто не так беден, как я.;)
В любом случае, я надеюсь, что это кому-то пригодится.Я довольно новичок в Vue.js, так что, возможно, есть лучший способ приблизиться к этому, но он сделал ту работу, которая мне была нужна.