Newer
Older
smartwell_app_front / src / components / ui / picker / Picker.vue
StephanieGitHub on 6 Aug 2019 9 KB first commit
<template>
  <transition name="slide">
    <div class="picker-wrap">
      <mt-header class="header" title="Picker" :fixed="headerConf.fixed">
        <div slot="left">
          <mt-button icon="back" @click="back">返回</mt-button>
        </div>
      </mt-header>
      <div class="content" ref="content">
        <div class="row">
          <div class="title">普通示例</div>
          <mt-picker :slots="pickerConf1.slot"
                     :visibleItemCount="pickerConf1.visibleItemCount"
                     :itemHeight="pickerConf1.itemHeight"
                     @change="onValuesChange"
          ></mt-picker>
        </div>
        <div class="row">
          <div class="title">两级</div>
          <mt-picker :slots="pickerConf2.slot" @change="onValuesChange"></mt-picker>
        </div>
        <div class="row">
          <div class="title">多级</div>
          <mt-picker :slots="pickerConf3.slot" @change="onValuesChange"></mt-picker>
        </div>
        <div class="row">
          <div class="title">多级联动</div>
          <mt-picker :slots="pickerConf4.slot" @change="linkage"></mt-picker>
          <div class="result">选择的是:{{pickerConf4.value}}</div>
        </div>
        <div class="row">
          <div class="title">滚动展示</div>
          <mt-picker class="dynamic" :slots="pickerConf5.slot" ref="dynamic"></mt-picker>
        </div>
        <div class="row">
          <mt-button class="pickerBtn" type="default" @click="pickerBtn">点击弹出</mt-button>
        </div>
        <div class="from-bottom" ref="bottomWrap" v-show="pickerConf6.flag">
          <div>
            <mt-button class="close-pop" type="danger" @click="closePop">关闭</mt-button>
            <mt-picker :slots="pickerConf6.slot" @change="linkage"></mt-picker>
          </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script type="text/ecmascript-6">
  import { Button, Picker } from 'mint-ui'
  import { headerMixin } from 'assets/js/mixins'
  import { prefixStyle } from 'assets/js/utils'

  const transform = prefixStyle('transform')

  export default {
    mixins: [headerMixin],
    data () {
      return {
        pickerConf1: {
          slot: [
            {
              flex: 1,
              values: ['2015-01', '2015-02', '2015-03', '2015-04', '2015-05', '2015-06'],
              className: 'slot1',
              textAlign: 'center'
            }
          ],
          visibleItemCount: 3,  // 选项可见个数
          showToolbar: false, // 是否在组件顶部显示一个 toolbar,内容自定义(组件内部写该插槽)
          itemHeight: 50, // 选项高度
        },
        pickerConf2: {
          slot: [
            {
              flex: 1,
              values: ['2015-01', '2015-02', '2015-03', '2015-04', '2015-05', '2015-06'],
              className: 'slot1',
              textAlign: 'right'
            }, {
              divider: true,
              content: '-',
              className: 'slot2'
            }, {
              flex: 1,
              values: ['2015-01', '2015-02', '2015-03', '2015-04', '2015-05', '2015-06'],
              className: 'slot3',
              textAlign: 'left'
            }
          ],
        },
        pickerConf3: {
          slot: [
            {
              flex: 1,
              values: ['2015', '2016', '2017', '2018', '2019', '2020'],
              className: 'slot1',
              textAlign: 'center'
            }, {
              divider: true,
              content: '-',
              className: 'slot2'
            }, {
              flex: 1,
              values: ['2015', '2016', '2017', '2018', '2019', '2020'],
              className: 'slot3',
              textAlign: 'center'
            },
            {
              divider: true,
              content: '-',
              className: 'slot4'
            }, {
              flex: 1,
              values: ['2015', '2016', '2017', '2018', '2019', '2020'],
              className: 'slot5',
              textAlign: 'center'
            }
          ]
        },
        pickerConf4: {
          value: '四川省成都市区',
          slot: [
            {
              flex: 1,
              values: ['四川省', '北京市'],
              className: 'slot1',
              textAlign: 'center'
            },
            {
              divider: true,
              content: '-',
              className: 'slot2'
            },
            {
              flex: 1,
              values: ['成都', '雅安'],
              className: 'slot3',
              textAlign: 'center'
            },
            {
              divider: true,
              content: '-',
              className: 'slot4'
            },
            {
              flex: 1,
              values: ['市区', '双流'],
              className: 'slot5',
              textAlign: 'center'
            }
          ]
        },
        pickerConf5: {
          slot: [
            {
              flex: 1,
              values: ['1', '2', '3', '4', '5', '6'],
              className: 'slot1',
              textAlign: 'center'
            }
          ],
          timer: null
        },
        pickerConf6: {
          flag: false,
          value: '四川省成都市区',
          slot: [
            {
              flex: 1,
              values: ['四川省', '北京市'],
              className: 'slot1',
              textAlign: 'center'
            },
            {
              divider: true,
              content: '-',
              className: 'slot2'
            },
            {
              flex: 1,
              values: ['成都', '雅安'],
              className: 'slot3',
              textAlign: 'center'
            },
            {
              divider: true,
              content: '-',
              className: 'slot4'
            },
            {
              flex: 1,
              values: ['市区', '双流'],
              className: 'slot5',
              textAlign: 'center'
            }
          ]
        },
      }
    },
    mounted () {
      let dynamicLen = this.pickerConf5.slot[0].values.length
      let jumpLen = 36
      let initPosition = 72
      let currentPositon = 72
      let count = 0
      this.pickerConf5.timer = setInterval(() => {
        this.$refs.dynamic.$children[0].$refs.wrapper.style[transform] = `translate(0px, ${currentPositon}px) translateZ(0px)`
        currentPositon -= jumpLen
        count++
        if (count === dynamicLen) {
          currentPositon = initPosition
          count = 0
        }
      }, 1000)
    },
    beforeDestroy () {
      clearInterval(this.pickerConf5.timer)
      this.pickerConf5.timer = null
    },
    methods: {
      onValuesChange (picker, values) { // 这里log与vconsole冲突会导致内存溢出,这里看log需要先移除vconsole
      },
      linkage (picker, values) { // 这里log与vconsole冲突会导致内存溢出,这里看log需要先移除vconsole
        switch (values[0]) {
          case "四川省":
            picker.setSlotValues(1, ['成都', '雅安'])
            break
          case "北京市":
            picker.setSlotValues(1, ['市辖区'])
            break
        }
        switch (values[1]) {
          case "成都":
            picker.setSlotValues(2, ['市区', '双流'])
            break
          case "雅安":
            picker.setSlotValues(2, ['市区', '名山'])
            break
          case "市辖区":
            picker.setSlotValues(2, ['市区'])
            break
        }
        this.pickerConf4.value = values.join('')
      },
      pickerBtn () {
        this.pickerConf6.flag = true
        setTimeout(() => {
          this.$refs.bottomWrap.style[transform] = `translate(0px, -200px) translateZ(0px)`
        }, 500)
      },
      closePop () {
        setTimeout(() => {
          this.pickerConf6.flag = false
        }, 500)
        this.$refs.bottomWrap.style[transform] = `translate(0px, 0px) translateZ(0px)`
      }
    }
  }
</script>

<style scoped lang="stylus" rel="stylesheet/stylus">
  @import "~assets/css/variable.styl"
  @import "~assets/css/transition.styl"
  @import "~assets/css/flex.styl"
  .picker-wrap {
    position absolute
    z-index 100
    top 0
    left 0
    right 0
    bottom 0
    background-color $color-background
    .content {
      padding-top 50px
      padding-bottom 20px
      .row {
        position relative
        width 90%
        margin 10px auto
        .title {
          height 30px
          line-height 30px
          padding 5px 10px
          margin-top 20px
          font-weight bold
          font-size $font-size-medium-x
          letter-spacing 1px
        }
        .result {
          height 40px
          line-height 40px
          padding 5px 0
          text-align center
        }
        .picker {
          background-color white
        }
        .pickerBtn {
          display block
          width 80%
          height 40px
          line-height 40px
          margin 50px auto
        }
      }
      .from-bottom {
        z-index 999999
        position fixed
        top 100%
        left 0
        width 100%
        height 200px
        background-color white
        border-top 1px solid $color-shadow
        transition all .5s
        .close-pop {
          z-index 1000
          position absolute
          right 10px
          top 10px
          width 100px
          height 30px
        }
      }
    }
  }
</style>