vue 自动添加栏与select过滤选择

<template>
    <div class="app-container">
        <div v-for="(item, index) in selectList" :key="index">
            <el-select v-model="item.fruits" style="width:200px">
                <el-option v-for="it in showFruitsList(item.fruits)" :value="it.value" :key="it.value">{{ it.label }}</el-option>
            </el-select>
            <el-input v-model="item.area" style="width:200px"></el-input>
            <el-button icon="md-add-circle" v-if="index == '0'" @click="listAdd()">加</el-button>
            <el-button icon="md-trash" v-if="index != '0'" @click="listDelete(item)">减</el-button>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            selectList: [{ fruits: "", area: "", }],
            fruitsList: [
                {
                    value: "香蕉",
                    label: "香蕉"
                },
                {
                    value: "葡萄",
                    label: "葡萄"
                },
                {
                    value: "芒果",
                    label: "芒果"
                },
                {
                    value: "柠檬",
                    label: "柠檬"
                }
            ],
        };
    },
    computed: {
        showFruitsList() {
            return (val) => {
                //讲option的显示数据进行深拷贝
                let newList = JSON.parse(JSON.stringify(this.fruitsList));
                //处理selectList数据,返回一个新数组arr
                //arr数组就相当于所有Select选中的数据集合(没有选中的为'',不影响判断),只要在这个集合里面,其他的下拉框就不应该有这个选项
                const arr = this.selectList.map(item => {
                    //将其格式{fruits:'柠檬'}变成['柠檬'],方便使用indexOf进行判断
                    return (item = item.fruits);
                });

                //过滤出newList里面需要显示的数据
                newList = newList.filter(item => {
                    //当前下拉框的选中的数据需要显示
                    //val就是当前下拉框选中的值
                    if (val == item.value) {
                        return item;
                    }
                    else {
                        //再判断在arr这个数组中是不是有这个数据,如果不在,说明是需要显示的
                        if (arr.indexOf(item.value) == -1) {
                            return item;
                        }
                    }
                });
                //返回Options显示数据
                return newList;
            };
        }
    },
    methods: {
        // 增加
        listAdd() {
            if (this.selectList.length < this.fruitsList.length) {
                this.selectList.push({
                    fruits: "",
                    area: "",
                });
            }
            else {
                alert("不能再加啦");
            }
        },
        // 减少
        listDelete(index) {
            this.selectList = this.selectList.filter(f => f.fruits != index.fruits)
        },
    },
}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现树结构的拖拽功能,可以使用Element UI库中的Tree组件和Drag and Drop API。具体步骤如下: 1. 首先,确保你已经安装了Element UI库和Vue.js,并正确引入了相关组件。 2. 在Vue组件中,定义一个包含树结构数据的数组。每个节点对象应该包含一个唯一的标识符和一个子节点数组。 ```javascript data() { return { treeData: [ { id: 1, label: 'Node 1', children: [ { id: 2, label: 'Node 1-1', children: [ { id: 3, label: 'Node 1-1-1', }, { id: 4, label: 'Node 1-1-2', }, ], }, { id: 5, label: 'Node 1-2', }, ], }, // ... ], }; }, ``` 3. 在模板中使用`el-tree`组件渲染树结构,并设置`draggable`属性为`true`以启用拖拽功能。使用`node-key`属性指定节点对象中唯一标识符的字段名。 ```html <el-tree :data="treeData" :draggable="true" :node-key="'id'" ></el-tree> ``` 4. 添加一个监听拖拽事件的方法,用于更新树结构数据。 ```javascript methods: { handleDragEnd(event) { const { treeData } = this; // 获取拖拽的节点信息 const node = event.target; const nodeId = node.getAttribute('data-node-key'); // 获取目标节点信息 const targetNode = event.relatedContext.$el; const targetNodeId = targetNode.getAttribute('data-node-key'); // 找到拖拽的节点和目标节点在树结构数据中的位置 let dragNode, dragNodeParent, targetNodeParent; findNodeAndParent(treeData, nodeId, null, (node, parent) => { dragNode = node; dragNodeParent = parent; }); findNodeAndParent(treeData, targetNodeId, null, (node, parent) => { targetNodeParent = parent; }); // 在目标节点前或后插入拖拽的节点 const index = targetNodeParent.children.indexOf(dragNode); if (event.dropPosition === 'before') { targetNodeParent.children.splice(index, 0, dragNode); dragNodeParent.children.splice(dragNodeParent.children.indexOf(dragNode), 1); } else if (event.dropPosition === 'after') { targetNodeParent.children.splice(index + 1, 0, dragNode); dragNodeParent.children.splice(dragNodeParent.children.indexOf(dragNode), 1); } }, }, ``` 5. 在`created`生命周期钩子中,为`el-tree`组件绑定拖拽事件。 ```javascript created() { this.$nextTick(() => { const treeEl = this.$el.querySelector('.el-tree'); treeEl.addEventListener('dragend', this.handleDragEnd); }); }, ``` 6. 最后,记得在销毁组件前移除拖拽事件的监听器。 ```javascript beforeDestroy() { const treeEl = this.$el.querySelector('.el-tree'); treeEl.removeEventListener('dragend', this.handleDragEnd); }, ``` 上述方法通过监听`dragend`事件,获取拖拽节点和目标节点的信息,并在树结构数据中更新节点的位置关系,实现了树结构的拖拽功能。请根据自己的具体需求进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值