Vue封裝組件標簽上使用v-model完成雙向綁定


1.普通v-model實現雙向綁定的使用

<input type="text" v-model="message">

vue在解釋v-model的時候會做一個轉化工作,實質是下面這樣:

<div id="app">
   <input type="text" :value="message" @input="message = $event.target.value">
   <span>{{message}}</span>
</div>
<script>
   var app2 = new Vue({
        el:'#app',
         data:{
             message:"Hello Vue"
         }
   });
</script>

 

2.封裝組件標簽上使用v-model完成雙向綁定

仿照v-model的實現方法,在自定義組件標簽上實現v-model功能
 
子組件:
<template>
  <div>
    <!--1 el-下拉選擇框 -->
    <el-select v-model="content" @change="handleInput" placeholder="請選擇">
      <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"
        :disabled="item.disabled">
      </el-option>
    </el-select>

    <!--2 原生下拉框 -->
    <!-- <select name="" id="" v-model="content" @change="handleInput">
      <option value="11">11</option>
      <option value="22">22</option>
      <option value="33">33</option>
    </select> -->

    <!--3 el-輸入框 -->
    <!-- <el-input v-model="content" @input="handleInput" placeholder="請輸入內容"></el-input> -->

    <!--4 原生輸入框 -->
    <!-- <input v-model="content" @input="handleInput" /> -->
  </div>
</template>

<script>
  export default {
    name: "HelloWorld",
    prop: ['newValue'],
    model: {
      event: 'input-change',
      prop: 'newValue'
    },
    data() {
      return {
        options: [{
          value: '選項1',
          label: '黃金糕'
        }, {
          value: '選項2',
          label: '雙皮奶',
          disabled: true
        }, {
          value: '選項3',
          label: '蚵仔煎'
        }, {
          value: '選項4',
          label: '龍須面'
        }, {
          value: '選項5',
          label: '北京烤鴨'
        }],
        content: this.newValue
      }
    },
    methods: {
      handleInput(e) {
        this.$emit('input-change', this.content)
      }
    }
  };
</script>
  
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

 

父組件調用
<HelloWorld v-model="name" />更新了:{{ name }}

data(){
    return{
        name:'',
    }
}

 

結果 
原生html 和element框架里的組件都可以實現
 
 
我是馬丁的車夫,歡迎轉發收藏!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM