Перетаскиваемая таблица с начальной загрузкой vue

Я искал способ перетаскивать строки в таблице Bootstrap Vue. Мне удалось найти здесь рабочую версию: Codepen

Я попытался реализовать этот код в своей таблице:

Шаблон:

<b-table  v-sortable="sortableOptions" @click="(row) => $toast.open(`Clicked ${row.item.name}`)"  :per-page="perPage" :current-page="currentPage"  striped hover :items="blis" :fields="fields" :filter="filter" :sort-by.sync="sortBy" :sort-desc.sync="sortDesc" :sort-direction="sortDirection" @filtered="onFiltered">
    <template slot="move" slot-scope="row">
        <i class="fa fa-arrows-alt"></i>
    </template>

    <template slot="actions" slot-scope="row">
        <b-btn :href="'/bli/'+row.item.id" variant="light" size="sm" @click.stop="details(cell.item,cell.index,$event.target)"><i class="fa fa-pencil"></i></b-btn>
        <b-btn variant="light" size="sm" @click.stop="details(cell.item,cell.index,$event.target)"><i class="fa fa-trash"></i></b-btn>
    </template>

    <template slot="priority" slot-scope="row">
        <input v-model="row.item.priority" @keyup.enter="row.item.focussed = false; updatePriority(row.item), $emit('update')" @blur="row.item.focussed = false" @focus="row.item.focussed = true" class="form-control" type="number" name="priority" >
    </template>
</b-table>

Сценарий:

import Buefy from 'buefy';
Vue.use(Buefy);

const createSortable = (el, options, vnode) => {

    return Sortable.create(el, {
    ...options
    });
};

const sortable = {
    name: 'sortable',
    bind(el, binding, vnode) {
    const table = el.querySelector('table');
    table._sortable = createSortable(table.querySelector('tbody'), binding.value, vnode);
    }
};
export default {
    name: 'ExampleComponent',
    directives: { sortable },
    data() {
        let self = this;
        return {
            blis: [],
            currentPage: 1,
            perPage: 10,
            pageOptions: [ 5, 10, 15 ],
            totalRows: 0,
            sortBy: null,
            sortDesc: false,
            sortDirection: 'asc',
            sortableOptions: {
                chosenClass: 'is-selected'
            },
            filter: null,
            modalInfo: { title: 'Title', content: 'priority' },
            fields: [ 
                {
                    key: 'move',
                    sortable: true
                },
                ///...rest of the fields
            ]
    }
};

Теперь я получаю эту ошибку: Ошибка в директиве сортируемой привязки привязки: «TypeError: не удается прочитать свойство 'querySelector', равное нулю»

Почему не может найти <tbody>?

Изменить: https://jsfiddle.net/d7jqtkon/


person Ari    schedule 13.02.2019    source источник
comment
Можете ли вы создать скрипку или ручку для своего кейса? может быть queySelector не может прочитать, потому что tbody недоступен, попробуйте добавить код в document.addEventListener('DOMContentLoaded',function(){ });   -  person karthickj25    schedule 13.02.2019
comment
Я получаю ту же ошибку jsfiddle.net/d7jqtkon @ karthickj25   -  person Ari    schedule 13.02.2019


Ответы (1)


В строке const table = el.querySelector('table'); вы пытаетесь получить элемент таблицы. Var el - это элемент таблицы. Вот почему он возвращает null, когда вы используете querySelector

после назначения правильной табличной переменной ошибка исчезает

  const table = el;    
  table._sortable = createSortable(table.querySelector("tbody"), binding.value, vnode);

Ссылка на рабочую скрипку

person karthickj25    schedule 14.02.2019
comment
Это действительно имеет смысл. Спасибо за помощь, теперь все работает как надо. :-) @ karthickj25 - person Ari; 14.02.2019
comment
Я тоже пробовал это решение, но получаю сообщение об ошибке, потому что мой скрипт не знает тег Sortable из return Sortable.create - person HTLWelsITLover99; 20.02.2020
comment
Затем установите Sortable с npm install sortablejs и импортируйте его import Sortable from 'sortablejs' в свой app.js или любой другой файл, который является файлом входа для вашего проекта vue js. Официальную документацию можно найти здесь, ссылка. - person Vidral Bonvi; 22.04.2021