vue使用vuedraggable实现tag标签动态添加数据且可拖拽功能

功能描述:
页面上A区域显示标签,点击标签在B区域内进行显示且可以通过拖拽改变排列顺序,点击A区域自定义标签后,在B区域显示可进行输入的标签,如图所示:
在这里插入图片描述
实现:
安装插件vuedraggable

npm install vuedraggable

引入:

import draggable from 'vuedraggable'

页面代码:

<div>A区域</div>
<el-tag
	v-for="(item,index) in tabData"
	:key="item.label"
	:type="item.selected?'':'info'"
	@click="add(item,index)"
	effect="plain">
	{{ item.name }}
</el-tag>

<br/>
<br/>
<br/>
<br/>
<div>B区域</div>
<!--使用draggable组件-->
 <draggable v-model="myArray"  chosenClass="chosen" forceFallback="true" group="people" animation="1000" @start="onStart" @end="onEnd">
    <transition-group>
     	<div class="item" v-for="element in myArray" :key="element.id">
			<el-tag
				v-if="element.id!='zdy'"
				closable
				:disable-transitions="false"
				@close="handleClose(element)">
				{{element.cont}}
			</el-tag>
			<el-tag
				v-if="element.id=='zdy'"
				closable
				:disable-transitions="false"
				@close="handleClose(element)">
				<el-input
					class="input-new-tag"
					v-model="element.cont"
					ref="saveTagInput"
					@keyup.enter.native="handleInputConfirm(element.cont)"
					@blur="handleInputConfirm(element.cont)"
					>
				</el-input>
			</el-tag>
		</div>
    </transition-group>
</draggable>

js

//导入draggable组件
import draggable from 'vuedraggable'
export default {
	components: {
		draggable
	},
	data() {
			//B区域数据,即被拖拽对象的数组
			myArray:[],
			inputVisible: false,
			//A区域数据
			tabData: [
				{cont:'地址-内容',id:1,name:'地址',selected: false},
				{cont:'价钱-内容',id:2,name:'价钱',selected: false},
				{cont:'政策规定-内容',id:3,name:'政策规定',selected: false},
				{cont:'测试后面-内容',id:4,name:'测试后面',selected: false},
				{cont:'词条1-内容',id:5,name:'词条1',selected: false},
				{cont:'词条2-内容',id:6,name:'词条2',selected: false},
				{cont:'词条3-内容',id:7,name:'词条3',selected: false},
				{cont:'词条4-内容',id:8,name:'词条4',selected: false},
				{cont:'',id:'zdy',name:'自定义',selected: false},
			],
	},
	methods: {
		// 添加数据
		add(item,index){
			item.selected = !item.selected;
			if(item.selected){
				this.myArray.push(item)
			}else{
				let filterArr = this.myArray.filter(df => {
					return df.id != item.id
				})
				this.myArray = filterArr;
			}
		},
		// 关闭
		handleClose(tag) {
			this.myArray.splice(this.myArray.indexOf(tag), 1);
			tag.selected = !tag.selected;
			this.tabData.splice(this.tabData.indexOf(tag), 1, tag);
		},
		// 自定义输入框操作
		showInput() {
			this.inputVisible = true;
			this.$nextTick(_ => {
				this.$refs.saveTagInput.$refs.input.focus();
			});
		},
		// 输入框点击回车操作
		handleInputConfirm(value) {
			console.log(this.myArray)
		},
		//开始拖拽事件
      	onStart(){},
      	//拖拽结束事件
       	onEnd() {},
	}
}

css

.item {
	cursor: move;
	display: inline-block;
}
.el-tag{
	margin-right: 10px;
}

.input-new-tag {
	width: 90px;
	vertical-align: bottom;
	height: 100%;
	/deep/ .el-input__inner{
		height: 100%;
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值