vue 表单封装的示例

本文介绍了在Vue项目中如何通过简化`v-model`属性实现父组件与子组件之间的数据交互,展示了从`@changeId`到`v-model`的迁移过程。
摘要由CSDN通过智能技术生成

新建vue项目

 main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
}).$mount('#app');

app.vue

<template>
  <div id="app">
    <div class="parent">
      <p>{{ selectId }}</p>
      <!--   @changeId="selectId = $event"   -->
      <base-select :cityId = "selectId" @changeId="handleChange" ></base-select>
    </div>
  </div>
</template>

<script>
import BaseSelect from "@/components/BaseSelect";

export default {
  name: 'App',
  data(){
    return {
      selectId: '102'
    }
  },
  components:{
    BaseSelect
  },
  methods:{
    handleChange(value){
      this.selectId = value;
    }
  }

}
</script>

<style>

</style>

BaseSelect.vue

<template>
    <div>
        <label for="select1">城市</label>
        <select id="select1" :value="cityId" @change="handleChange">
            <option value="101">北京</option>
            <option value="102">上海</option>
            <option value="103">武汉</option>
            <option value="104">广州</option>
            <option value="105">哈尔滨</option>
            <option value="106">漠河</option>
        </select>
    </div>
</template>

<script>
    export default {
        name: "BaseSelect",
        props:{
            cityId: String
        },
        methods:{
            handleChange(e){
                this.$emit("changeId",e.target.value);
            }
        }
    }
</script>

<style scoped>

</style>

这个可以有一种简化写法

app.vue

<template>
  <div id="app">
    <div class="parent">
      <p>{{ selectId }}</p>
      <!--   @changeId="selectId = $event"   -->
      <base-select v-model="selectId"></base-select>
    </div>
  </div>
</template>

<script>
import BaseSelect from "@/components/BaseSelect";

export default {
  name: 'App',
  data(){
    return {
      selectId: '102'
    }
  },
  components:{
    BaseSelect
  },
  methods:{
    handleChange(value){
      this.selectId = value;
    }
  }

}
</script>

<style>

</style>

BaseSelect.vue

<template>
    <div>
        <label for="select1">城市</label>
        <select id="select1" :value="value" @change="handleChange">
            <option value="101">北京</option>
            <option value="102">上海</option>
            <option value="103">武汉</option>
            <option value="104">广州</option>
            <option value="105">哈尔滨</option>
            <option value="106">漠河</option>
        </select>
    </div>
</template>

<script>
    export default {
        name: "BaseSelect",
        props:{
            value: String
        },
        methods:{
            handleChange(e){
                this.$emit("input",e.target.value);
            }
        }
    }
</script>

<style scoped>

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值