Vue.Draggable 不移动组件
Vue.Draggable Not Moving Component
所以我正在努力使用我正在开发的迷你页面构建器。我正在处理以下代码:
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 %}
行按预期移动,因此我可以按预期完全移动行并对它们进行排序,它可以正常工作并正确更新数组。但是当我尝试移动组件时,它似乎按预期移动,所以你可以移动它,但是当你放开拖动时,它不会停留在那里,而是恢复到原来的样子。
我环顾四周,但找不到任何修复方法。
我真的不知道该怎么做,所以任何建议或帮助都会很棒,在此先感谢。
这是由于占位符,默认槽的内容应该与列表完全匹配。您可以尝试类似的操作:
<!-- 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>
所以我正在努力使用我正在开发的迷你页面构建器。我正在处理以下代码:
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 %}
行按预期移动,因此我可以按预期完全移动行并对它们进行排序,它可以正常工作并正确更新数组。但是当我尝试移动组件时,它似乎按预期移动,所以你可以移动它,但是当你放开拖动时,它不会停留在那里,而是恢复到原来的样子。
我环顾四周,但找不到任何修复方法。
我真的不知道该怎么做,所以任何建议或帮助都会很棒,在此先感谢。
这是由于占位符,默认槽的内容应该与列表完全匹配。您可以尝试类似的操作:
<!-- 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>