Vue.Draggable Не движущийся компонент - PullRequest
0 голосов
/ 10 марта 2019

Так что я борюсь с мини-компоновщиком страниц, над которым я работаю.У меня есть следующий код, над которым я работаю:

Код JavaScript / Vue: http://git.dannysmc.com/snippets/63 - также вставлен ниже:

// Import Vue Data
import Vue from 'vue';
import $ from 'jquery';
import draggable from 'vuedraggable'

// Import page builder registry
import Registry from '../pagebuilder/registry.json';

// Import page builder components
import ComTextBlock from '../pagebuilder/com-text-block.vue';

// Setup new Vuex store
window.vm.content_pages_create = new Vue({
    el: '#content-pages-create',
    name: 'PageBuilder - Create',
    store: window.vm.store,
    components: {
        draggable,
        ComTextBlock,
    },
    data: {

        // Define pagebuilder registry
        registry: Registry,

        // Define the page content
        page: {
            elements: 0,
            rows: [],
        },
    },
    methods: {

        // Add new page row
        addPageRow: function(index) {
            var under_index = (typeof index === 'undefined' ? false : parseInt(index));
            var element_id = this.page.elements++;
            this.page.rows.push({
                id: element_id,
                text: 'Hello #' + element_id,
                columns: [
                    {id: this.page.elements++, width: 6, components: []},
                    {id: this.page.elements++, width: 6, components: [
                        {
                            id: this.page.elements++,
                            data: {},
                            name: 'Text Block',
                        },
                        {
                            id: this.page.elements++,
                            data: {},
                            name: 'Text Block',
                        },
                    ]},
                ],
            });
        },

        // Remove page row
        removeRow: function(index) {
            if (window.confirm('Are you sure you want to remove this row and it\'s contents?')) {
                this.page.rows.splice(index, 1);
            }
        },

        // Clone component
        cloneComponent: function(row_index, col_index, com_index) {
            var component = JSON.parse(JSON.stringify(this.page.rows[row_index].columns[col_index].components[com_index]));
            this.page.rows[row_index].columns[col_index].components.push(component);
        },

        // Remove component
        removeComponent: function(row_index, col_index, com_index) {
            if (window.confirm('Are you sure you want to remove this component?')) {
                this.page.rows[row_index].columns[col_index].components.splice(com_index, 1);
            }
        },

        // Resolve a component name
        resolveComponentName: function(component) {
            var cname = component.name.split(' ');
            for (var i = 0; i < cname.length; i++) {
                cname[i] = cname[i].toLowerCase().charAt(0).toUpperCase() + cname[i].slice(1);
            }
            return 'Com' + cname.join('');
        },
    },
    mounted: function() {

        // Hide sidebar by default
        this.$store.dispatch('toggleSidebar', false);
        $('#content').addClass('sidebar-hidden');
    },
});

Код HTML / Twig: http://git.dannysmc.com/snippets/64 - также вставлено ниже:

    {% block body %}
    <div class="content-container" id="content-pages-create">

        <br /><br /><br />
        <button @click="addPageRow()">Add Row</button>
        <br /><br /><br />

        <!-- Page Holder -->
        <div class="page-holder" v-cloak>
            <draggable v-model="page.rows" handle=".control-drag">
                <transition-group>

                    <!-- Row Item -->
                    <div class="row-item" v-for="(row, row_index) in page.rows" :key="row.id">

                        <!-- Row Controls -->
                        <div class="row-controls">
                            <div class="control-item control-drag"><i class="fas fa-arrows-alt"></i></div>
                            <div class="control-item control-pause"><i class="fas fa-pause"></i></div>
                            <div class="control-item control-clone"><i class="fas fa-clone"></i></div>
                            <div class="control-item control-edit"><i class="fas fa-edit"></i></div>
                            <div class="control-item control-trash" @click="removeRow(row_index)"><i class="fas fa-trash"></i></div>
                        </div>

                        <!-- Row Inner -->
                        <div class="row-inner">

                            <!-- Column Item -->
                            <div class="column-item" :class="['column-width-' + column.width]" v-for="(column, col_index) in row.columns">

                                <!-- Column Inner -->
                                <div class="column-inner">

                                    <!-- Component Item (Draggable) -->
                                    <draggable v-model="column.components" :group="'column.components'" handle=".control-dragcom">

                                        <!-- Component Placeholder -->
                                        <div class="component-placeholder" v-if="column.components.length === 0">
                                            <p class="text">+</p>
                                        </div>

                                        <!-- Component Item -->
                                        <div class="component-item" v-for="(component, com_index) in column.components" :key="component.id">

                                            <!-- Component Controls -->
                                            <div class="component-controls">
                                                <div class="control-item control-dragcom"><i class="fas fa-arrows-alt"></i></div>
                                                <div class="control-item control-clone" @click="cloneComponent(row_index, col_index, com_index)"><i class="fas fa-clone"></i></div>
                                                <div class="control-item control-edit"><i class="fas fa-edit"></i></div>
                                                <div class="control-item control-trash" @click="removeComponent(row_index, col_index, com_index)"><i class="fas fa-trash"></i></div>
                                            </div>

                                            <!-- Component Inner -->
                                            <div class="component-inner">
                                                <component :is="resolveComponentName(component)"></component>
                                            </div>
                                        </div>
                                    </draggable>
                                </div>
                            </div>
                        </div>
                    </div>

                </transition-group>
            </draggable>
        </div>
    </div>
{% endblock %}

Строки перемещаются, как и ожидалось, поэтому я могу полностью переместить строки, как ожидалось, и отсортировать их, и это работает, и он корректно обновляет массив.Но когда я пытаюсь переместить компоненты, кажется, что они движутся, как и ожидалось, поэтому вы можете переместить их, но когда вы отпустите перетаскивание, они не останутся там и вернутся к тому, что было.

Я немного осмотрелся, но не смог найти способов исправить это.

Я действительно застрял в том, что делать, поэтому любые предложения или помощь были бы потрясающими, заранее спасибо.

1 Ответ

1 голос
/ 10 марта 2019

Это связано с заполнителем, содержимое слота defaukt должно точно соответствовать списку.Вы можете попробовать что-то вроде:

<!-- Component Placeholder -->
<div class="component-placeholder" v-if="column.components.length === 0">
   <p class="text">+</p>
</div>

<draggable v-else v-model="column.components" :group="'column.components'" handle=".control-dragcom">
   <!-- Component Item -->
   <div class="component-item" v-for="(component, com_index) in column.components" :key="component.id">

      <!-- Component Controls -->
      <div class="component-controls">
        <div class="control-item control-dragcom"><i class="fas fa-arrows-alt"></i></div>
        <div class="control-item control-clone" @click="cloneComponent(row_index, col_index, com_index)"><i class="fas fa-clone"></i></div>
        <div class="control-item control-edit"><i class="fas fa-edit"></i></div>
        <div class="control-item control-trash" @click="removeComponent(row_index, col_index, com_index)"><i class="fas fa-trash"></i></div>
      </div>

     <!-- Component Inner -->
     <div class="component-inner">
        <component :is="resolveComponentName(component)"></component>
     </div>
    </div>
</draggable>

...