Vue 自定义组件使用 v-model

举一个封装饿了么地址选择组件的例子

<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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!