vuejs2.0 购物车数量增减 类radio单选框

vuejs2.0 购物车数量增减 类radio单选框_第1张图片


主要讲解 购买数量 选择 以及 有效时间选择 模块

数量增减 主要涉及到 最小最大范围 以及手动输入 只能输入数字的计算

有效时间选择 模块类radio 单选框 比较简单 监控当前选中的index


父组件

<div class="sales-board-line">
              <div class="sales-board-line-left">
                  购买数量:
              div>
              <div class="sales-board-line-right">
                on-change="onParamChange('buyNum', $event)">
              div>
          div>
<div class="sales-board-line">
              <div class="sales-board-line-left">
                  有效时间:
              div>
              <div class="sales-board-line-right">
                  "periodList"
                  @on-change="onParamChange('period', $event)">
              div>
          div>

mounted 页面渲染完毕 加载默认选项 以及 调取数据接口


子组件

<template>
    <div class="counter-component">
      <div class="counter-btn" @click="minus"> - div>
      <div class="counter-show">
        <input type="text" v-model="number" @keyup="fixNumber">
      div>
      <div class="counter-btn" @click="add"> + div>
    div>
template>

<script>
export default {
  props: {
    max: {
      type: Number,
      default: 5
    },
    min: {
      type: Number,
      default: 1
    }
  },
  data () {
    return {
      number: this.min
    }
  },
  watch: {
    number () {
      this.$emit('on-change', this.number)
    }
  },
  methods: {
    fixNumber () {
      let fix
      if (typeof this.number === 'string') {
        fix = Number(this.number.replace(/\D/g, ''))
      }
      else {
        fix = this.number
      }
      if (fix > this.max || fix < this.min) {
        fix = this.min
      }
      this.number = fix
    },
    minus () {
      if (this.number <= this.min) {
        return
      }
      this.number --
    },
    add () {
      if (this.number >= this.max) {
        return
      }
      this.number ++
    }
  }
}
script>

<style scoped>
.counter-component {
  position: relative;
  display: inline-block;
  overflow: hidden;
  vertical-align: middle;
}
.counter-show {
  float: left;
}
.counter-show input {
  border: none;
  border-top: 1px solid #e3e3e3;
  border-bottom: 1px solid #e3e3e3;
  height: 23px;
  line-height: 23px;
  width: 30px;
  outline: none;
  text-indent: 4px;
}
.counter-btn {
  border: 1px solid #e3e3e3;
  float: left;
  height: 25px;
  line-height: 25px;
  width: 25px;
  text-align: center;
  cursor: pointer;
}
.counter-btn:hover {
  border-color: #4fc08d;
  background: #4fc08d;
  color: #fff;
}

style>

类radio单选框

子组件

<template>
    <div class="chooser-component">
        <ul class="chooser-list">
          <li
          v-for="(item, index) in selections"
          @click="chosenSelection(index)"
          :title="item.label"
          :class="{active:index === nowIndex}"
          >{{ item.label }}li>
        ul>
      div>
    div>
template>

<script>
export default {
  props: {
    selections: {
      type: Array,
      default: [{
        label: 'test',
        value: 0
      }]
    }
  },
  data () {
    return {
      nowIndex: 0
    }
  },
  methods: {
    chosenSelection (index) {
      this.nowIndex = index
      this.$emit('on-change', this.selections[index])
    }
  }
}
script>

<style scoped>
.chooser-component {
  position: relative;
  display: inline-block;
}
.chooser-list li{
  display: inline-block;
  border: 1px solid #e3e3e3;
  height: 25px;
  line-height: 25px;
  padding: 0 8px;
  margin-right: 5px;
  border-radius: 3px;
  text-align: center;
  cursor: pointer;
}
.chooser-list li.active {
  border-color: #4fc08d;
  background: #4fc08d;
  color: #fff;
}
style>

你可能感兴趣的:(vuejs2.0)