vue 下拉框多选,vue实现下拉框查询

  vue 下拉框多选,vue实现下拉框查询

  本文主要介绍了vue下拉列表的两种实现方法的比较,具有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。

  

vue下拉列表的两种实现

  

第一种采用v-for的方式

  El-select v-model= form . column type placeholder= field type

  el-option v-for=(item,index)in column pearr :key= index :label= item . label :value= item . value

  /el选项

  /el-select

  这样,就需要在数据中定义columeTypeArr,如下所示

  data(){

  返回{

  列标题:[{

  值:“字符串”,

  标签:“字符串”

  },{

  值: Int ,

  标签:“整数”,

  },{

  值:“十进制”,

  标签:“数字”

  }],

  }

  }

  

第二种采用写死的方式

  直接在select下写dead。

  El-select v-model= form . fileorgtype placeholder=请选择

  El选项标签=是值=是/el选项

  El选项标签=否值=N/el选项

  /el-select

  

两种方式的比较:

  两种方法都差不多,只是第一种方法需要在数据中配置,当数据需要从后台回显时,明显比第一种方法好。

  对于参数较少的简单下拉列表,第二种显然更占优势。

  

vue下拉菜单组件的实现

  我们一起来实现一个vue的下拉菜单组件。

  网上已经有很多基础的UI组件了,为什么还要自己实现呢?其实我并没有反复造轮子的意思,只是想通过这个过程回顾一下vue组件开发的一些细节和注意事项。

  为什么选择下拉菜单组件?

  因为:Sparrow虽然小而全,但是这个小组件涉及了很多vue组件开发的知识点。

  好了,我们开始吧!

  首先,创建一个vue-cli项目。作者用的是vue-cli3,创作过程简短。然后创建一个vue组件:DropDownList.vue

  在写模板之前,我们先分析一下这个组件的视图结构和功能。

  下拉菜单组件应该由两部分组成:

  所选项目的文本

  要选择的菜单(默认隐藏)

  它的主要功能包括:

  鼠标经过下拉菜单组件,显示要选择的菜单。

  滑出下拉菜单组件以隐藏要选择的菜单。

  在要选择的菜单项目上单击鼠标,选择要更新文本的项目,组件将发送change事件。

  我们编写如下这样的模板:

  模板

   div class= zq-drop-list @ mouse over= onDplOver($ event) @ mouse out= onDplOut($ event)

  所选项目的文本i/i/span

  保险商实验所

  李北京/李

  上海/李

  广州/李

  /ul

  /div

  /模板

  选择项目文本右侧的I标签,实现下拉菜单的三角形图标。在下面的css中,我们使用背景图片来实现它。

  我们添加了回调函数,用于鼠标传递和滑出根元素div。具体实现见下文。

  接下来,我们为这个下拉菜单编写一个样式,并在模板的底部添加一个样式标签。为了防止与其他组件的样式冲突,我建议您在开发组件时将scoped属性添加到样式中。另外,作者在这里使用了scss,具体代码如下:

  样式范围的语言=scss 。zq-下拉列表{

  显示:内嵌-块;

  最小宽度:100像素;

  位置:相对;

  跨度{

  显示:块;

  高度:30px

  行高:30px

  背景:# f1f1f1

  字体大小:14px

  文本对齐:居中;

  颜色:# 333333;

  边框-半径:4px

  我{

  背景:URL(https://www . easyicon . net/API/resize API . PHP?id=1189852size=16)不重复居中居中;

  左边距:6px

  显示:内嵌-块;

  }

  }

  ul{

  位置:绝对;

  顶配:30px

  左:0;

  宽度:100%;

  边距:0;

  填充:0;

  边框:纯色1px # f1f1f1

  边框-半径:4px

  溢出:隐藏;

  李{

  列表样式:无;

  高度:30px

  行高:30px

  字体大小:14px

  border-bottom:solid 1px # f1 f1 f1;

  背景:# ffffff

  }

  李:最后一个孩子

  边框-底部:无;

  }

  李:盘旋{

  背景:# f6f6f6

  }

  }

  }

  /风格

  关于风格,这里就不详细展开了,只说几点需要注意的地方:

  I元素的样式我用了一张网络图,你可以自己改。

  待选菜单ul并没有隐藏在css中,因为我们要通过js来控制它。具体原因见下文。

  待选菜单ul使用绝对定位,因为当它被展开时,它不应该影响页面上其他元素的布局。

  现在这个组件大概长这个样子:

  让我们继续定义这个组件的属性。很明显,要选择的菜单应该作为属性传入,一定不能内部编写。这些属性定义如下:

  脚本

  导出默认值{

  名称: DropDownList ,

  道具:{

  数据列表:{

  类型:数组,

  默认(){

  返回[

  {name:选项一 },

  {名称:选项二 }

  ]

  }

  },

  标签属性:{

  类型:字符串,

  default(){ return name }

  }

  },

  data(){

  返回{

  activeIndex:0

  }

  },

  }

  DataList是要选择的菜单的数据源属性。在这里,我们为这个属性定义默认值,这也是我建议你养成的习惯。作为一个组件,最好有默认值,因为别人使用你的组件时,不用先设置相关属性,就能看到一个成品的效果,并能快速查看你的组件所需属性的数据细节。

  另一个属性是labelProperty。这个属性的作用是什么?我们实际项目中的数据源并不总是包含字段名,这可能会导致下拉菜单无法呈现数据文本,所以我们定义这个属性来指定实际数据源呈现文本的字段,它必须是一个字符串。该属性的默认值是name,因为它需要与默认数据源一致。相信你也看到了一个组件内部数据,activeIndex,用来表示当前选中项的索引,我们后面会用到。

  现在我们可以在其他地方引入和使用这个组件。虽然还没有完成,但我们不妨先把它展示在界面上:

  模板

  div class=home

  drop list:dataList= DP list label property= city @ change= ondp change($ event)/drop list

  p其他文本内容/p

  /div

  /模板

  脚本

  从“@/components/DropDownList.vue”导入下拉列表

  //其他代码省略。

  /脚本

  该页面介绍并使用我们的DropDownList组件。dataList=dplist 将当前页的dplist数组绑定到组件的dataList属性。该数组中的对象有一个city字段,我们希望在下拉菜单中显示该字段,因此我们将组件的labelProperty设置为city。我们还注册了该组件的变更事件,该事件需要在该组件内部进行调度。见下文。

  现在我们回到组件的模板部分,发现它仍然是静态内容。我们修改这些静态内容,通过属性来呈现。

  模板

   div class= zq-drop-list @ mouse over= onDplOver($ event) @ mouse out= onDplOut($ event)

  span{{dplLable}}i/i/span

  保险商实验所

  li v-for=(item,index)in dataList :key= index @ click= onli click(index,$ event) { { item[label property]} }/Li

  /ul

  /div

  /模板

  要选择的菜单li的文本是项目[labelProperty],以便可以正确显示开发者指定的字段。

  我们来看看选中项的文本表达式:dplLabel。我们不定义这个属性或者这个内部数据。它从哪里来?选中项的文本应该是datalist[active index][label property](这个比较好理解,有问题请留言),但是这个表达式太长了,不能写在模板里,不利于维护。让我们把它写入计算的属性。

  计算值:{

  dplLable(){

  返回this . datalist[this . active index][this . label property]

  }

  }

  所以才有上面的dplLabel,计算属性真的很有用。

  现在我们已经完成了下拉菜单的视图和数据关联部分,接下来我们将实现它的功能。

  第一步是隐藏默认选择的菜单。为什么我们不在这里直接用display:none of css,然后在鼠标经过时显示:block?正因为如此,我们点击时无法隐藏菜单项,体验不好。我们用js来控制,但是vue不支持直接访问dom元素。如果我们想在组件初始化的时候访问dom元素,有一个最方便的方法,就是自定义指令。

  我们使用以下代码为下拉菜单组件添加本地自定义指令:

  指令:{

  dpl:{

  绑定(el){

  El . style . display= none ;

  }

  }

  },

  这个dpl是自定义命令,请忽略我笨拙的命名!然后在自定义指令的hook函数bind方法中,我们访问el元素并控制其样式属性显示:none最后,将这个自定义指令添加到模板中的ul标签。别忘了加上v-。现在看效果。要选择的菜单已被隐藏。

  ul v-dpl

  我们使用自定义指令钩子函数来访问dom元素,实现了对dom的控制,非常实用!

  让我们继续监控一开始为下拉菜单定义的鼠标通过和滑出,实现待选菜单的显示和隐藏。

  onDplOver(事件){

  let ul=event . current target . child nodes[1];

  ul . style . display= block ;

  },

  onDplOut(事件){

  let ul=event . current target . child nodes[1];

  ul . style . display= none ;

  },

  在鼠标事件中,我们访问事件的currentTarget对象,为什么不是Target?因为下拉菜单的子元素也会触发这个事件,如果我们访问target,它可能不是我们预期的顶级元素。

  最后,我们实现了要选择的菜单项的点击事件。点击后,待选菜单被隐藏,内部状态被修改,change事件被分发。

  onLiClick(索引){

  path=event . path (event . composed path event . composed path())//兼容Firefox和safari

  path[1]. style . display= none ;

  this.activeIndex=index

  这个。$emit(change ,{

  索引:索引,

  值:this.dataList[index]

  })

  }

  这里有一个细节需要注意。我们必须通过li元素找到外部的ul元素,但是path不支持Firefox和safari。好在这两个浏览器都支持composedPath,所以第一行代码就有了兼容的写法。然后,通过修改内部数据activeIndex来更新所选项目的文本。最后,调用emit方法将change事件发送到父元素。别忘了把事件对象打包发出去。

  完整的代码如下:

  模板

   div class= zq-drop-list @ mouse over= onDplOver($ event) @ mouse out= onDplOut($ event)

  span{{dplLable}}i/i/span

  ul v-dpl

  li v-for=(item,index)in dataList :key= index @ click= onli click(index,$ event) { { item[label property]} }/Li

  /ul

  /div

  /模板

  脚本

  导出默认值{

  名称: DropDownList ,

  data(){

  返回{

  activeIndex:0

  }

  },

  道具:{

  数据列表:{

  类型:数组,

  默认(){

  返回[

  {name:选项一 },

  {名称:选项二 }

  ]

  }

  },

  标签属性:{

  类型:字符串,

  default(){ return name }

  }

  },

  指令:{

  dpl:{

  绑定(el){

  El . style . display= none ;

  }

  }

  },

  方法:{

  onDplOver(事件){

  let ul=event . current target . child nodes[1];

  ul . style . display= block ;

  },

  onDplOut(事件){

  let ul=event . current target . child nodes[1];

  ul . style . display= none ;

  },

  onLiClick(索引){

  设路径=事件。路径 (事件。合成路径事件。合成路径())//兼容火狐和旅行队

  路径[1]。风格。display= none

  this.activeIndex=index

  这个$emit(change ,{

  索引:索引,

  值:this.dataList[index]

  })

  }

  },

  计算值:{

  dplLable(){

  返回这个。数据表[这个。主动索引】【这个。标签属性]

  }

  }

  }

  /脚本

  样式范围的语言=scss 。zq-下拉列表{

  显示:内嵌-块;

  最小宽度:100像素;

  位置:相对;

  跨度{

  显示:块;

  高度:30px

  行高:30px

  背景:# f1f1f1

  字体大小:14px

  文本对齐:居中;

  颜色:# 333333;

  边框-半径:4px

  我{

  背景:网址(https://www。easyicon。net/API/resize API。PHP?id=1189852size=16)不重复居中居中;

  左边距:6px

  显示:内嵌-块;

  }

  }

  ul{

  位置:绝对;

  顶配:30px

  左:0;

  宽度:100%;

  边距:0;

  填充:0;

  边框:纯色1px # f1f1f1

  边框-半径:4px

  溢出:隐藏;

  李{

  列表样式:无;

  高度:30px

  行高:30px

  字体大小:14px

  边框-底部:实心1px # f1 f1 f1

  背景:# ffffff

  }

  李:最后一个孩子

  边框-底部:无;

  }

  李:盘旋{

  背景:# f6f6f6

  }

  }

  }

  /风格

  以上为大家展示了某视频剪辑软件如何实现一个下拉菜单组件,虽然比较简单,但也基本涉及到了组件开发常用的一些特性。希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: