zoukankan      html  css  js  c++  java
  • 基于elementUI二次封装下拉框学年组件selecte组件(体验v-model给自身双数据绑定和给组件双数据绑定)

    需求:

    1、封装一个下拉框组件,选择学年

    2、学年list默认是组件自带,如果父组件传值了用父组件传来的

    3、默认选中当前年份

    step:

    1、components中定义SchoolYear.vue

    /**
    * props:
    *    yearList // select数据 格式: [{text, value, checked}]
    *    isSelected  // 是否选中checked: true
    *    v-model // 同步数据 v-model='selected' 等价于 :selectedYear="selected" @yearChange='selected=$event' 将当前选中的值同步到父组件中的schoolYear
    */
    <template>
      <!-- <el-select :value="currentYear" @change="handleChange">
        <el-option v-for="item in tempYearList" :key="item.value" :label="`${item.text}学年`" :value="item.value" />
      </el-select> -->
      <!-- 如果要用v-model替代:value="currentYear" @change="handleChange",需要watch监听currentYear值的变化触发到父组件中selected值同步改变 -->
      <el-select v-model="currentYear">
        <el-option v-for="item in tempYearList" :key="item.value" :label="`${item.text}学年`" :value="item.value" />
      </el-select>
    </template>
    <script>
    export default {
      model: {
        event: 'yearChange'
      },
      props: {
        yearList: Array,
        isSelected: {
          type: Boolean,
          default: false
        }
      },
      data() {
        return {
          currentYear: '',
          tempYearList: []
        }
      },
      watch: {
        currentYear: {
          handler(newVal) {
            this.$emit('yearChange', newVal)
          }
        }
      },
      created() {
        this.yearList && this.yearList.length
          ? this.setYearList(this.yearList)
          : this.setYearList([
              {
                checked: false,
                text: '2022',
                value: 2022
              },
              {
                checked: true,
                text: '2021',
                value: 2021
              },
              {
                checked: false,
                text: '2020',
                value: 2020
              }
            ])
      },
      methods: {
        setYearList(data) {
          this.tempYearList = data
          const { isSelected } = this
          const yearsArr = data.filter((n) => n.checked)
          const { length } = yearsArr
          if (length && isSelected) {
            const [{ value }] = yearsArr
            this.currentYear = value
            // this.handleChange(value)
          }
        }
        // handleChange(val) {
        //   this.$emit('yearChange', val)
        //   this.currentYear = val
        // }
      }
    }
    </script>

      在该组件中,v-model='currentYear'是:value="currentYear" @change="handleChange"的语法糖

    2、引入并使用

      data() {
        return {
          selected: ''
        }
      },
      methods: {
        handleSubmit() {
          console.log('已选年份', this.selected)
        }
      }
        <SchoolYear v-model="selected" isSelected></SchoolYear>
        <!-- <SchoolYear @yearChange='selected=$event' isSelected></SchoolYear> -->
        <button @click="handleSubmit">点击</button>

      在父组件调用该子组件时,使用v-model="selected",其实是:selectedYear="selected" @yearChange='selected=$event'的语法糖,在SchoolYear.vue中需要定义model: { prop: 'selectedYear', event: 'yearChange' }。SchoolYear.vue中没有用到父组件传来的selectedYear,所以model中的prop我就省略了。

    3、效果:

  • 相关阅读:
    【成本管理】成本核算
    CW23:Work Log
    SQLSERVER数据库连接
    Oracle 创建用户 修改用户密码 授权命令
    CW24:WORK LOG
    ORA12560: TNS: 协议适配器错误的解决方法
    需求工程概述
    日语学习1:送气音和不送气音
    junit测试框架简单应用
    Java之Socket编程
  • 原文地址:https://www.cnblogs.com/wuqilang/p/14999636.html
Copyright © 2011-2022 走看看