vue组件—支持单选或者多选

之前做了一个单页面的单选和多选,这里我整理了一下,封装成组件,能够同时支持单选和多选。

我这里的代码是在vue脚手架(vue-cli)上开发完成的,搭建方法这里就不细说了。

这个组件的名字呢命为 option.vue

option.vue

HTML:

  • {{ item }}

 CSS:

ul, li {
  margin: 0;
  padding:0;
  list-style: none;
}
.chooser {
  position: relative;
  display: inline-block;
}
.chooser-list li{
  margin: 5px;
  width: 80px;
  height: 40px;
  line-height: 40px;
  border-radius: 7px;
  display: inline-block;
  border: 1px solid #9C9C9C;
  color: #9C9C9C;
  text-align: center;
  background: #fff;
}
.chooser-list li.active {
  border-color: #097fe0;
  color: #097fe0;
  background: #fff;
}

  JS:

export default {
  name: 'options',
  data () {
    return {
       currValArr: []
    }
  },
  props: {
    options: Array, //传入的数组
    isMultiply: { //是否是多选。默认为false:单选;true:多选
      type: Boolean,
      default: false
    },
    cssStyle: Object //可以自定义单选或者多选的样式
  },
  methods: {
    optionsClick (item) {
},
checkActive (item) {
}
}
}

到这里为止呢,我们需要把两个方法里的逻辑补齐。

optionClick(),这个方法要实现点击然后选中,传的参数是当前数组值,在里面我们需要判断是单选还是多选

optionsClick (item) {
      if (this.isMultiply === false) { //单选
        this.$set(this.currValArr, 0, item) // 将该值设为当前数组的第一项
      } else { //多选
        if (this.currValArr.indexOf(item) === -1) {
          // 当前数组中没有该值则push到数组
          this.currValArr.push(item)
        } else { 
          //当前数组中有该值,找到该值下标并删除
          this.currValArr.splice(this.currValArr.indexOf(item), 1)
        }
      }
}

那么在checkActive方法中,需要得到一个布尔值,来确定是否添加类名active

checkActive (item) {
      if (this.isMultiply === false) {
        this.currValArr.length = 1
      }
      return this.currValArr.indexOf(item) !== -1
}

 App.vue



 效果图如下:

vue组件—支持单选或者多选_第1张图片

虽然现在看上去基本OK了,单选多选都能实现,但我们还希望他能实现双向绑定,现在视图可以更新数据,我们接下来完成数据更新视图

App.vue 中,

      template:

当前选中值:{{value}}

当前选中值:{{value1}}

  js:

data () {
   return {
    // 代码省略
     value: ['赵雅芝'],
     value1: ['卫玠','潘安',]
   }
}

 option.vue中

export default {
  name: 'options',
   model: {
     prop: 'currValArr',
     event: 'input'
  },
  props: {
    currValArr: Array,
    options: Array,
    isMultiply: {
      type: Boolean,
      default: false
    },
    cssStyle: Object
  },
  methods: {
    // ...
  }
}

 这样,就实现了双向绑定了。使用了自定义组件的v-model,利用model选项,来指定prop和event。不了解自定义组件model的可以去官网看,上面讲解的很详细。

 

 

转载于:https://www.cnblogs.com/ddkei/p/9802907.html

你可能感兴趣的:(vue组件—支持单选或者多选)