当前位置:首页 > VUE

vue实现列表联动插件

2026-02-23 11:48:21VUE

Vue 列表联动插件实现方案

基于 v-model 的双向绑定

通过 Vue 的 v-model 实现父子组件数据同步,适用于简单联动场景。

<template>
  <div>
    <parent-list v-model="selectedItems" :items="parentItems" />
    <child-list :items="filteredChildItems" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedItems: [],
      parentItems: [...],
      allChildItems: [...]
    }
  },
  computed: {
    filteredChildItems() {
      return this.allChildItems.filter(item => 
        this.selectedItems.includes(item.parentId)
      )
    }
  }
}
</script>

使用事件总线通信

通过 Vue 的 EventBus 实现跨组件通信,适合复杂层级结构。

// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()

// ParentComponent.vue
EventBus.$emit('parent-selected', selectedIds)

// ChildComponent.vue
EventBus.$on('parent-selected', ids => {
  this.filteredItems = this.allItems.filter(item => ids.includes(item.parentId))
})

封装可复用插件

创建独立插件实现标准化列表联动功能。

// list-linkage.js
const ListLinkage = {
  install(Vue) {
    Vue.mixin({
      methods: {
        $updateLinkedList(sourceKey, targetKey, filterFn) {
          this.$watch(sourceKey, newVal => {
            this[targetKey] = this.allItems.filter(item => filterFn(item, newVal))
          }, { deep: true })
        }
      }
    })
  }
}

// main.js
import ListLinkage from './list-linkage'
Vue.use(ListLinkage)

// 组件内使用
this.$updateLinkedList('selectedParents', 'filteredChildren', (child, parents) => {
  return parents.some(p => p.id === child.parentId)
})

基于 Provide/Inject 的层级传递

适合深层嵌套组件结构,通过依赖注入实现数据共享。

// 祖先组件
export default {
  provide() {
    return {
      listLinkage: {
        selected: Vue.observable([]),
        update: this.updateSelection
      }
    }
  }
}

// 后代组件
export default {
  inject: ['listLinkage'],
  methods: {
    handleSelect(item) {
      this.listLinkage.update(item.id)
    }
  }
}

性能优化建议

对于大数据量场景应添加防抖处理和虚拟滚动。

import debounce from 'lodash/debounce'

export default {
  methods: {
    updateFilter: debounce(function(searchTerm) {
      this.filtered = this.items.filter(i => 
        i.name.includes(searchTerm)
      )
    }, 300)
  }
}

完整插件示例

以下是封装成 npm 包的完整插件结构示例:

// index.js
export default {
  install(Vue, options = {}) {
    const defaultOptions = {
      debounceTime: 200,
      linkageKey: 'linkageId'
    }

    const config = { ...defaultOptions, ...options }

    Vue.directive('list-linkage', {
      bind(el, binding, vnode) {
        const source = binding.value.source
        const target = binding.value.target
        const filterFn = binding.value.filter || defaultFilter

        vnode.context.$watch(
          source, 
          debounce(newVal => {
            vnode.context[target] = vnode.context.allItems
              .filter(item => filterFn(item, newVal))
          }, config.debounceTime),
          { deep: true }
        )
      }
    })

    function defaultFilter(item, sourceVal) {
      return sourceVal.includes(item[config.linkageKey])
    }
  }
}

使用时可全局注册或按需引入,通过指令方式实现列表联动:

<template>
  <div v-list-linkage="{ source: 'selected', target: 'filtered' }">
    <!-- 联动列表内容 -->
  </div>
</template>

vue实现列表联动插件

标签: 插件列表
分享给朋友:

相关文章

idea制作css插件

idea制作css插件

使用IDEA制作CSS插件 在IntelliJ IDEA中制作CSS插件可以通过以下方法实现,主要涉及插件开发工具和流程。 准备开发环境 确保已安装IntelliJ IDEA Ultimate版本…

vue插件实现

vue插件实现

Vue 插件实现方法 Vue 插件通常用于扩展 Vue 的功能,可以添加全局方法、指令、过滤器或混入等。以下是实现 Vue 插件的基本步骤: 插件基本结构 一个 Vue 插件通常是一个对象或函数,…

vue实现插件

vue实现插件

Vue 插件的基本实现 Vue 插件是一种扩展 Vue 功能的机制,通常用于添加全局功能或组件。插件可以是一个对象或函数,需要提供 install 方法。 const MyPlugin = {…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaS…

h5 实现列表

h5 实现列表

列表实现方法 在HTML5中,可以通过多种方式实现列表,包括无序列表、有序列表和自定义列表。以下是具体的实现方法。 无序列表 无序列表使用<ul>标签,列表项使用<li>标签…

vue 实现列表多选

vue 实现列表多选

Vue 实现列表多选的方法 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动处理多选逻辑。适用于复选框(checkbox)场景。 <template>…