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

更新日期: 2021-03-04阅读: 2.4k标签: 列表

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



注册组件


注册 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

链接: https://fly63.com/article/detial/10167

CSS实现无外边框列表效果

使用外层容器切割:给每一个 li 设定右边框和下边框线,使用CSS选择器此方法仅适用于每行固定显示两个li的情况,不需要计算宽高,也不需要设置父容器。使用table通过CSS选择器li:nth-last-child(2)和li:last-child隐藏最后两个li的下边框

html列表简单介绍

无序列表使用标签:<ul>,<li>属性:disc,circle,square;有序列表使用标签:<ol>,<li>属性:A,a,I,i,start;嵌套列表使用标签:<ul>,<ol>,<li> ;自定义列表使用标签:<dl>,<dt>,<dd>

css样式li不显示点点什么原因?怎么解决?

实际上用了overflow:hidden 会影响 list-style,即当ul 中的li 的overflow 为hidden的时候, list-style不起作用,不显示前面的点、圈等样式。

React列表中实现文案多行收起展开的功能

在我们平时的业务开发中经常会用到文案超出只有收起,点击在展示全部文案;通常的使用时使用css来实现

如何让10万条数据的小程序列表如丝般顺滑

某天闲着无聊想练一下手速,去上拉一个小程序项目中一个有1万多条商品数据的列表。在数据加载到1000多条后,是列表居然出现了白屏。看了一下控制台:

了解虚拟列表背后原理,轻松实现虚拟列表

比如 umy-ui (ux-table)虚拟列表table组件, vue-virtual-scroller 以及 react-virtualized 这些优秀的插件快速满足业务需要。为了理解插件背后的原理机制,我们实现一个自己简易版的虚拟列表,希望在实际业务项目中能带来一些思考和帮助。

React 中的列表渲染为什么要加 key

常用写法是用 Arrary.prototype.map 方法,将数组形式的数据映射为 JSX.Element 数组,并嵌入到组件要返回的 JSX.Element 中,如下:

浅说虚拟列表的实现原理

在正文之前,先对虚拟列表做个简单的定义。根据上文,虚拟列表是按需显示思路的一种实现,即虚拟列表是一种根据滚动容器元素的可视区域来渲染长列表数据中某一个部分数据的技术。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!