vue3.x初探之v-model的詳細使用

一、用於自定義組件時,v-model的prop和默認事件名更改了,而且移除了model選項

//父組件
<template>
  <div>
    <Child v-model="message" />
    <div>綁定的值:{{message}}</div>
  </div>
</template>


//子組件
<template>
  <div>
    <input 
      type="text" 
      :value="modelValue" 
      @input="$emit('update:modelValue', $event.target.value)"
    >
  </div>
</template>
<script>
export default {
  //2.x用法,能夠修改prop和觸發的事件名稱,model以廢棄
  // model: {
  //   prop: 'value', //3.x默認值改成了modelValue
  //   event: 'input' //3.x默認值改成了update:modelValue
  // },
  props:['modelValue']
}
</script>

2.x移除了model配置,3.x那又該怎麼配置其餘prop呢?vue

//父組件
<template>
  <div>
    <Child v-model:text="message" />
    <div>綁定的值:{{message}}</div>
  </div>
</template>

//子組件
<template>
  <div>
    <input 
      type="text" 
      :value="text" 
      @input="$emit('update:text', $event.target.value)"
    >
  </div>
</template>
<script>
export default {
  //3.x 接收v-model冒號後面的值,相應的觸發的方法改成update:text
  props:['text']
}
</script>

二、3.x新增,能夠定義多個v-model

//父組件
<template>
  <div>
    <Child 
      v-model="message1"
      v-model:text="message2" 
    />
    <div>綁定的值1:{{message1}}</div>
    <div>綁定的值2:{{message2}}</div>
  </div>
</template>

//子組件
<template>
  <div>
    <input 
      type="text" 
      :value="modelValue" 
      @input="$emit('update:modelValue', $event.target.value)"
    >
    <input 
      type="text" 
      :value="text" 
      @input="$emit('update:text', $event.target.value)"
    >
  </div>
</template>
<script>
export default {
  //v-model冒號後面不寫值,默認就是modelValue
  props:['modelValue','text']
}
</script>

三、去掉了.sync 修飾符,新增自定義v-model修飾符

非自定義組件中,v-model除了.sync之外,其餘依然仍是能夠使用的,好比:.lazy、.trim等this

//父組件
<template>
  <div>
    <Child 
      v-model.toUpperCase="message1" 
      v-model:text.toLowerCase="message2" 
    />
    <div>綁定輸入的字母全爲大寫:{{message1}}</div>
    <div>綁定輸入的字母全爲小寫:{{message2}}</div>
  </div>
</template>

//子組件
<template>
  <div>
    <input 
      type="text" 
      :value="modelValue" 
      @input="handleInput1"
    >
    <input 
      type="text" 
      :value="text" 
      @input="handleInput2"
    >
  </div>
</template>
<script>
export default {
  props:['modelValue','modelModifiers','text','textModifiers'],
  created(){
    //對不帶參數的v-model綁定,檢查對象名稱爲:modelModifiers
    //對於帶prop參數的v-model綁定,檢查對象名稱爲:prop + modelModifiers
    console.log(this.modelModifiers); //{toUpperCase: true}
    console.log(this.textModifiers); //{toLowerCase: true}
  },
  methods: {
    handleInput1(e){
      let value = e.target.value;
      if(this.modelModifiers.toUpperCase){
        value = value.toUpperCase();
      }
      this.$emit("update:modelValue", value)
    },
    handleInput2(e){
      let value = e.target.value;
      if(this.textModifiers.toLowerCase){
        value = value.toLowerCase();
      }
      this.$emit("update:text", value)
    }
  }
}
</script>
相關文章
相關標籤/搜索