filter-node-method 的逻辑不需要变动

以下为我的html结构

        <div>
            <el-input placeholder="输入关键字进行过滤" v-model="filterText"> </el-input>
            <el-checkbox style="margin-top: 10px" v-model="treeChecked" @change="treeCheckedChange"
                >全选/反选</el-checkbox
            >

            <el-tree
                v-loading="treeLoading"
                class="tree"
                ref="tree"
                :props="defaultProps"
                :data="list"
                node-key="id"
                show-checkbox
                @check="currentChecked"
                :filter-node-method="filterNode"
                :default-checked-keys="form.cardIDs"
                :default-expanded-keys="form.cardIDs"
            >
            </el-tree>
        </div>

我通过判断 treeChecked  是否选中

以下为data部分

    data() {
        return {
            // 筛选内容
            filterText: "",
            defaultProps: {
                label: "name"
            },
            list: [],
            // 全选/反选
            treeChecked: false,
            form: {
                // 选中的值
                cardIDs: [],
                managerID: "" //当前用户
            },
            loading: false,
            // 回显加载
            treeLoading: false,
   
        }
    },

filterText 为筛选的值

list 为全部数据

以下我们直接上重点,逻辑都在全选/反选按钮中

        treeCheckedChange() {
            // 全选
            if (this.treeChecked) {
                // 获取当前筛选文本
                const filter = this.filterText.toLowerCase() //toLowerCase转为小写  保证了匹配不区分大小写
                // 筛选出可见节点的 ID
                const visibleKeys = this.list
                    .filter(item => item.name.toLowerCase().includes(filter))
                    .map(item => item.id)

                // 设置选中状态
                this.$refs.tree.setCheckedKeys(visibleKeys)
                this.$nextTick(() => {
                    this.currentChecked(this.$refs.tree.getCheckedNodes(), {
                        checkedKeys: visibleKeys // 更新为筛选后的节点
                    })
                })
            } else {
                this.$refs.tree.setCheckedKeys([])
                this.form.cardIDs = []
            }
        }

在全选反选逻辑中,发现有 currentChecked 事件,也就是选中,每次选中的值,我都会赋值到 form.cardIDs 中,

  // 选中
        currentChecked(nodeObj, SelectedObj) {
            this.form.cardIDs = SelectedObj.checkedKeys
            // console.log(SelectedObj.checkedNodes) // 这是选中的节点数组
        },

以下为 js 完整代码

 data() {
        return {
            // 筛选内容
            filterText: "",
            defaultProps: {
                label: "name"
            },
            list: [],
            // 全选/反选
            treeChecked: false,
            form: {
                // 选中的值
                cardIDs: [],
                managerID: "" //当前用户
            },
            loading: false,
            // 回显加载
            treeLoading: false,
        
        }
    },



    methods: {
  
        // 取消
        cancel() {
            this.close()
        },
        close() {
            this.form.cardIDs = []
            this.$refs.tree.setCheckedKeys([])
            this.$emit("update:dialogVisible", false)
            this.treeChecked = false
        },
        // 选中
        currentChecked(nodeObj, SelectedObj) {
            this.form.cardIDs = SelectedObj.checkedKeys
            // console.log(SelectedObj.checkedNodes) // 这是选中的节点数组
        },
        // 筛选
        filterNode(value, data) {
            if (!value) return true
            // console.log("帅选!!", data.name.indexOf(value))

            return data.name.indexOf(value) !== -1
        },
        treeCheckedChange() {
            // 全选
            if (this.treeChecked) {
                // 获取当前筛选文本
                const filter = this.filterText.toLowerCase() //toLowerCase转为小写  保证了匹配不区分大小写
                // 筛选出可见节点的 ID
                const visibleKeys = this.list
                    .filter(item => item.name.toLowerCase().includes(filter))
                    .map(item => item.id)

                // 设置选中状态
                this.$refs.tree.setCheckedKeys(visibleKeys)
                this.$nextTick(() => {
                    this.currentChecked(this.$refs.tree.getCheckedNodes(), {
                        checkedKeys: visibleKeys // 更新为筛选后的节点
                    })
                })
            } else {
                this.$refs.tree.setCheckedKeys([])
                this.form.cardIDs = []
            }
        }
    },
    watch: {
        // 筛选
        filterText(val) {
            this.$refs.tree.filter(val)
        }

    }
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐