Vue 自定義元件使用 v-model

一位不願意透露姓名的楊先生發表於2020-06-15

舉一個封裝餓了麼地址選擇元件的例子

<el-cascader size="large" :options="options" v-model="selectedOptions" @change="handleChange">
</el-cascader>

這是一個餓了麼的地址選擇元件(element-china-area-data),問題在於v-model儲存的地址碼,後端需要的是地址的字串,所以需要對這個元件進行封裝。



先寫好基本結構

<template>
  <div>
    <el-cascader size="large" :options="options" v-model="selectedOptions" @change="handleChange">
    </el-cascader>
  </div>
</template>

<script>
  import {
    provinceAndCityData,
    regionData,
    provinceAndCityDataPlus,
    regionDataPlus,
    CodeToText,
    TextToCode
  } from 'element-china-area-data'
  export default {
    name: "AreaData",
    data() {
      return {

        options: regionData,
        selectedOptions: []

      }
    },
    methods: {

      handleChange(value) {
        console.log(value)
      }

    },
    created() {

    },
    computed: {

    },
    props: {

    },

  }
</script>

<style>

</style>



第一步設定model值(文件:cn.vuejs.org/v2/api/#model)

model: {
    prop: 'autoValue',
    event: 'changeAutoValue'
},

prop代表v-model繫結的值,
event代表監聽prop中的變化事件並修改



第二步設定created中的初始化

created() {

    this.selectedOptions = this.autoValue;
},



第三步監聽子元件的v-model值的變化

watch: {

    selectedOptions(value) {

        this.$emit('changeAutoValue', value)

    }


}



完整程式碼

<template>
  <div>
    <el-cascader size="large" :options="options" v-model="selectedOptions" @change="handleChange">
    </el-cascader>
  </div>
</template>

<script>
  import {
    provinceAndCityData,
    regionData,
    provinceAndCityDataPlus,
    regionDataPlus,
    CodeToText,
    TextToCode
  } from 'element-china-area-data'
  export default {
    name: "AreaData",
    data() {
      return {

        options: regionData,
        selectedOptions: []

      }
    },
    methods: {

      handleChange(value) {
        console.log(value)
      }


    },
    created() {

      this.selectedOptions = this.autoValue;

    },
    computed: {

    },
    props: {

      autoValue: {
        type: Array,
        default: function() {


          return [];
        }

      }


    },
    model: {

      prop: 'autoValue',
      event: 'changeAutoValue'

    },
    watch: {

      selectedOptions(value) {


        this.$emit('changeAutoValue', value)

      }



    }

  }
</script>

<style>

</style>

呼叫

<area-data v-model="item.area"></area-data>

其實這個語法等同於

<area-data  :autoValue='item.area' @changeAutoValue='(val)=>{item.area=val}'></area-data>
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章