Vue.js 多选列表(Multi-Select)组件

搬运公众号早前文章

多选列表 (Multi-Select) 是一种将所有选项列出,并允许用户利用 Ctrl/Shift 键进行多选的 UI 元素。这是一种常见的设计元素。有时候为了节省空间,我们会将选项折叠于 Combo Box 中。为了方便用户操作,这个组件还将添加 Select All 和 Clear All 两个按钮,允许用户快速选择或清除选择。这个 UI 元素曾被运用于 Correlation Plot App 中。

preview gif

注册组件

注册 Multi-Select 组件,简单来说就是复制粘贴已封装好的代码部分。此处建议注册全局组件。

设计该元素的时候考虑了两种模式:第一种是每次点击新选项将保留旧选项并添加新选项,如上述示例图形。这种是较为常见的一种方式。第二种是每次点击新选项则清除旧选项仅保留新选项。若使用这种方式进行多选,则需要利用Ctrl/Shift键。这种设计能便于用户在每一次的点击中消除旧选项。若使用第二方式,需要替换事件 @click.exact="AddToOrDeleteFromSelectedColumns"
@click.exact="ClickOnColumnListItem"

<script type="text/x-template" id="multi-select-template">
…
      <tr v-for = "(item,index) in columns" 
          @click.exact="AddToOrDeleteFromSelectedColumns"
          @click.shift.exact="AddMultipleToSelectedColumns"
          @click.ctrl.exact="AddToOrDeleteFromSelectedColumns"
          :title="function(item){if(item.longname){return 'Short Name: ' + item.name + '\n----------------\n' + item.longname}else{return item.name}}(item)"
          class="column-list-entry">
      ...
      </tr>
</script>
<script>
Vue.component("multi-select", {
    template: "#multi-select-template",
…
</script>



调用组件

直接添加自定义标签 调用组件。

<multi-select :legend_name="legend_name"
              :columns="columns"
              :selected_columns="selected_columns"
              @update_selected_columns="onSelectedColumnsChange">
</multi-select>


传递数据

最后还需要对组件传递数据。我们可以利用 v-bind 动态绑定数据到父级组件的数据中。

props 中 legend_name 绑定 Multi-Select 的所需显示的名称,columns 绑定 Multi-Select 的选项, selected_columns 绑定当前的已选项。另外我们还需要在父级实例中定义事件 “onSelectedColumnsChange”,用于刷新 Multi-Select 组件的显示。

data: function(){
      return {
          legend_name: "Input Columns",
          columns: 
          [
              {"name":"A","longname":"Copper"},
              {"name":"B","longname":"Aluminum Aluminum"},
              {"name":"C","longname":"Calcium"},
              {"name":"D","longname":"Calcium"},
     ],
          selected_columns: [],
      }
  },
...  
methods:{ 
      onSelectedColumnsChange:function(new_columns) {
          this.selected_columns = new_columns;
      },
 },
...


源代码

Github

<think>好的,我需要详细解释j-multi-select-tag的使用方法。首先,我需要确认这个组件是什么,可能是一个前端的标签组件,可能基于某个框架,比如Vue、React或者原生JavaScript。用户需要的是使用详解,所以应该包括安装、基本用法、配置项、事件、自定义样式、数据绑定、注意事项等部分。 由于用户提到的是“j-multi-select-tag”,可能是一个特定库或自定义组件,但可能没有公开文档,所以可能需要基于常见的标签组件进行推测。我需要确保内容结构清晰,分步骤说明,同时提醒用户可能需要根据实际情况调整。 接下来要组织内容,分为简介、安装引入、基本用法、配置项、数据绑定、事件处理、自定义样式、注意事项、示例代码等部分。同时注意使用正确的LaTeX格式,虽然可能这部分用不上,但如果有数学公式需要的话,比如在说明某些算法时,但这里可能不需要。 需要检查是否有错别字,步骤是否合理,是否覆盖了用户可能需要的所有方面。同时使用中文,保持口语化,避免专业术语堆砌,让用户容易理解。</think>以下为$j$-$multi$-$select$-$tag$组件的使用详解,结构分步说明便于理解: --- ### 一、组件简介 $j$-$multi$-$select$-$tag$是基于常见前端框架(如Vue/React)实现的标签组件,支持: - 层级数据绑定 - 标签动态增删 - 搜索过滤功能 - 自定义样式模板 --- ### 二、安装与引入 #### 1. NPM安装(假设为npm包) ```bash npm install j-multi-select-tag --save ``` #### 2. 组件引入 ```javascript // Vue示例 import JMultiSelectTag from 'j-multi-select-tag' export default { components: { JMultiSelectTag } } ``` --- ### 三、基础用法 ```html <j-multi-select-tag v-model="selectedItems" :options="optionList" placeholder="请择标签" /> ``` --- ### 四、核心配置项 | 属性 | 类型 | 说明 | |------|------|------| | `options` | Array | 数据源(需含`label`和`value`字段) | | `v-model` | Array | 双向绑定的中值 | | `max` | Number | 最大可数量(如`max=5`) | | `disabled` | Boolean | 禁用状态 | --- ### 五、数据绑定示例 ```javascript data() { return { selectedItems: [1, 3], // 默认中项 optionList: [ { label: '标签1', value: 1 }, { label: '标签2', value: 2 }, { label: '标签3', value: 3 } ] } } ``` --- ### 六、事件处理 ```html <j-multi-select-tag @change="handleChange" @exceed="handleMaxExceed" /> ``` ```javascript methods: { handleChange(selectedItems) { console.log('当前中:', selectedItems) }, handleMaxExceed() { alert('已达最大择数量!') } } ``` --- ### 七、样式自定义 通过CSS覆盖默认样式: ```css .j-multi-select-tag { --primary-color: #409eff; /* 修改主题色 */ --tag-radius: 8px; /* 标签圆角 */ } ``` --- ### 八、注意事项 1. 数据源`options`必须包含`value`和`label`字段 2. 使用`v-model`时确保绑定的是数组类型 3. 需要处理异步数据时建议使用`watch`监听项变化 --- ### 九、完整示例 ```html <template> <j-multi-select-tag v-model="selectedTags" :options="dynamicOptions" :max="3" searchable @change="updateSelection" /> </template> <script> export default { data() { return { selectedTags: [], dynamicOptions: [] // 可通过API异步加载 } }, mounted() { this.fetchOptions() }, methods: { async fetchOptions() { const res = await api.getTags() this.dynamicOptions = res.data }, updateSelection(items) { // 提交中项到后端 api.submitSelection(items) } } } </script> ``` --- ### 十、常见问题 Q: 项无法正确渲染? A: 检查数据格式是否符合`[{value, label}]`要求 Q: 搜索功能失效? A: 1. 确认是否添加`searchable`属性 2. 检查数据项是否包含`label`字段 建议通过官方文档验证具体实现细节,不同版本可能存在配置差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值