vue.draggable多列拖拽支持模糊搜索及重置

本文展示了如何使用 Vue.draggable 库创建一个具备模糊搜索功能的双栏可拖拽列表。通过 Vue 文件和 JavaScript 代码,实现了在两个列表之间拖放元素的功能,同时提供了输入框进行模糊查询。CSS 样式定义了拖拽过程中的视觉反馈,如拖动、选中和空提示元素的样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue.draggable官网:https://www.itxst.com/vue-draggable/fueijmfy.html

实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

vue文件中
  <div class="itxst">
              <div class="col">
                <!-- <div class="title">主体(可模糊查询)</div> -->
                <el-input
                  v-model="inputValue1"
                  size="mini"
                  clearable
                  style="margin-bottom: 5px"
                  placeholder="网站(可模糊查询)"
                ></el-input>
                <draggable
                  v-model="arr1"
                  group="site"
                  animation="300"
                  dragClass="dragClass"
                  ghostClass="ghostClass"
                  chosenClass="chosenClass"
                  @start="onStartOne"
                  @end="onEndOne"
                >
                  <transition-group>
                    <template v-for="item in arr1">
                      <div
                        class="item"
                        v-if="
                          !inputValue1 || item.name.indexOf(inputValue1) != -1
                        "
                        :key="item.id"
                      >
                        {{ item.name }}
                      </div>
                    </template>
                    <div v-if="!arr1.length" key="emptyTips" class="emptyItem">
                      <img src="@/assets/images/drag.png" /><br />
                      <span>可将右侧类别拖放至这个类别</span>
                    </div>
                  </transition-group>
                </draggable>
              </div>
              <div class="col">
                <div class="title" style="margin-top: 5px">
                  <span>网站</span>
                  <el-tooltip
                    effect="dark"
                    content="点击可重置该定制化查询条件"
                    placement="top-end"
                  >
                    <el-button
                      style="float: right; padding: 0"
                      @click="initForm"
                      type="text"
                      icon="el-icon-refresh-right"
                    ></el-button>
                  </el-tooltip>
                </div>
                <draggable
                  v-model="arr2"
                  group="site"
                  animation="100"
                  dragClass="dragClass"
                  ghostClass="ghostClass"
                  chosenClass="chosenClass"
                  @start="onStartOne"
                  @end="onEndOne"
                >
                  <transition-group>
                    <div class="item" v-for="item in arr2" :key="item.id">
                      {{ item.name }}
                    </div>
                    <div key="emptyTips" v-if="!arr2.length" class="emptyItem">
                      <img src="@/assets/images/drag.png" /><br />
                      <span>可将左侧类别拖放至这个类别</span>
                    </div>
                  </transition-group>
                </draggable>
              </div>
            </div>
js文件中data
           dragOne: false,
            inputValue1: '',
            arr1: [
                { id: 1, name: 'www.google.com' },
                { id: 2, name: 'www.msn.com' },
                { id: 3, name: 'www.ebay.com' },
                { id: 4, name: 'www.yahoo.com' },
                { id: 5, name: 'www.itxst.com' },
                { id: 6, name: 'www.jd.com' },
                { id: 7, name: 'www.baidu.com' },
                { id: 8, name: 'www.taobao.com' },
             ],
            arr2: [ ],
js methods中
  // 拖拽组件1
        onStartOne () {
            this.dragOne = true;
        },
        onEndOne () {
            this.dragOne = false;
        },
    // 重置
          initForm () {
              arr1: [
                { id: 1, name: 'www.google.com' },
                { id: 2, name: 'www.msn.com' },
                { id: 3, name: 'www.ebay.com' },
                { id: 4, name: 'www.yahoo.com' },
                { id: 5, name: 'www.itxst.com' },
                { id: 6, name: 'www.jd.com' },
                { id: 7, name: 'www.baidu.com' },
                { id: 8, name: 'www.taobao.com' },
             ],
            arr2: [ ],
            this.arr2 = []
        },
css文件中
/*定义要拖拽元素的样式*/
.ghostClass {
  background-color: rgb(144, 144, 226) !important;
}
.chosenClass {
  background-color: rgb(228, 168, 168) !important;
  opacity: 1 !important;
}
.dragClass {
  background-color: rgb(191, 158, 223) !important;
  opacity: 1 !important;
  box-shadow: none !important;
  outline: none !important;
  background-image: none !important;
}
.itxst {
  margin: 10px;
  /* min-height: 200px; */
  overflow: auto;
  max-height: 350px;
  width: 45%;
  padding: 10px 0 10px 30px;
  border-radius: 5px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
  background-color: #f5fafa;
  border: 1px solid #eee;
}
.title {
  margin-bottom: 10px;
  color: #92d9d9;
  /* color: #e4b2b2; */
  font-size: 14px;
  font-weight: 600;
  text-align: center;
}
.col {
  width: 40%;
  flex: 1;
  padding: 10px;
  border: solid 1px #eee;
  border-radius: 5px;
  float: left;
}
.col + .col {
  margin-left: 10px;
}
.itemBox {
  max-height: 400px;
  overflow-y: scroll;
}
.item {
  text-align: center;
  padding: 6px 0;
  color: #000;
  font-size: 10px;
  margin: 0px 10px 0px 10px;
  border: solid 1px #eee;
  background-color: #f1f1f1;
}
.item:hover {
  background-color: #fdfdfd;
  cursor: move;
}
.item + .item {
  border-top: none;
  margin-top: 6px;
}
.emptyItem {
  min-height: 300px;
  text-align: center;
  width: 100%;
  color: #9dccf1;
  font-size: 12px;
  /* -webkit-animation: Tada 1s 2s both infinite;
  -moz-animation: Tada 1s 2s both infinite;
  -ms-animation: Tada 1s 2s both infinite;
  animation: Tada 1s 2s both infinite; */
}
.emptyItem img {
  margin-top: 100px;
  margin-bottom: 10px;
}
### VueDraggable 组件拖拽时出现的圆角问题解决方案 当使用 `vuedraggable` 进行拖拽操作时,可能会遇到被拖动元素显示为带有圆角的情况。这通常是因为 CSS 样式中的 `border-radius` 属性影响了拖拽效果。 为了确保拖拽过程中不出现不必要的圆角,可以通过调整样式来解决问题: #### 方法一:移除或覆盖默认圆角样式 如果父级容器或其他地方设置了全局样式的 `border-radius`,可以在特定情况下重置这些设置。例如,在 `.drag-item` 类中明确指定无边框半径: ```css .drag-item { border-radius: 0 !important; } ``` 此方法适用于希望所有可拖拽项都保持直角外观的情形[^1]。 #### 方法二:动态控制样式 对于更复杂的需求,比如仅在拖拽期间临时去除圆角,则可以利用 Vue 的事件监听机制配合条件渲染功能实现这一目标。创建一个布尔类型的响应式变量用于追踪当前是否有正在进行的拖拽动作,并据此切换类名: ```javascript data() { return { isDragging: false, }; }, methods: { onStartDrag() { this.isDragging = true; }, onStopDrag() { this.isDragging = false; } } ``` 接着修改 HTML 结构以反映新的逻辑: ```html <draggable @start="onStartDrag" @end="onStopDrag"> <div :class="{ 'no-border-radius': isDragging }">...</div> </draggable> ``` 最后定义对应的 CSS 规则: ```css .no-border-radius { border-radius: 0 !important; } ``` 这种方法允许更加灵活地管理界面状态变化而不干扰其他部分的设计[^2]。 #### 方法三:自定义拖拽代理 另一种方式是通过配置选项来自定义拖拽过程中的占位符(placeholder),即所谓的“克隆节点”。这样做的好处是可以完全掌控该阶段下的 DOM 特性,包括但不限于形状、尺寸等视觉特性。具体做法是在初始化插件实例时传递相应参数: ```javascript new Sortable(el, { // ... other options ... ghostClass: "sortable-ghost", // 定义一个特殊 class 名字给到正在移动的对象 }); ``` 随后针对这个新加入的选择器编写专属样式表条目,确保其始终呈现方形边缘: ```css .sortable-ghost { opacity: .8; background-color: #c8ebfb; border-radius: 0px!important; } ``` 上述三种策略可以根据实际应用场景和个人偏好选用最合适的方案来修正因意外应用 `border-radius` 所带来的困扰[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyduan200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值