Так что я борюсь с мини-компоновщиком страниц, над которым я работаю.У меня есть следующий код, над которым я работаю:
Код 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 %}
Строки перемещаются, как и ожидалось, поэтому я могу полностью переместить строки, как ожидалось, и отсортировать их, и это работает, и он корректно обновляет массив.Но когда я пытаюсь переместить компоненты, кажется, что они движутся, как и ожидалось, поэтому вы можете переместить их, но когда вы отпустите перетаскивание, они не останутся там и вернутся к тому, что было.
Я немного осмотрелся, но не смог найти способов исправить это.
Я действительно застрял в том, что делать, поэтому любые предложения или помощь были бы потрясающими, заранее спасибо.