前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue中封装input组件

Vue中封装input组件

原创
作者头像
愤怒的小鸟
修改2021-09-15 09:55:58
2.2K0
修改2021-09-15 09:55:58
举报
文章被收录于专栏:web shareweb share

input 实现v-model 的精髓:通过修改 AST 元素,给 el添加了一个prop,相当于在 input 上动态绑定了value ,又给 el 添加了事件处理,相当于在 input 上绑定了input事件,其实转换成模板如下:

代码语言:javascript
复制
<input
 v-bind:value="message" 
 v-on:input="message=$event.target.value"> 

子组件的模板设置

方法一:

代码语言:javascript
复制
let Child = {
  template: '<div>'
    + '<input :value="value" @input="updateValue" placeholder="edit me">'
    + '</div>',
  props: ['value'],
  methods: {
    updateValue(e) {
      this.$emit('input', e.target.value)
    } 
  }
}

let vm = new Vue({
  el: '#app',
  template: '<div>' 
    + '<child v-model="message"></child>' 
    + '<p>Message is: {{ message }}</p>' 
    + '</div>',
  data () {
    return {
      message: '' 
    }
  },
  components: {
    Child 
  }
})

方法二:

代码语言:javascript
复制
<template>
  <div>
    <input type="text" :value="value" @input="$emit('input', $event.target.value)">
  </div>
</template>
<script>
export default {
  props: {
    value: {
      type: String,
      default: ''
    }
  }
}
</script>

父组件模板

代码语言:javascript
复制
<template>
  <div>
    <easy-input v-model="easy"></easy-input>
    {{easy}}
  </div>
</template>
<script>
import EasyInput from './EasyInput'
export default {
  components: {
    EasyInput
  },
  data () {
    return {
      easy: ''
    }
  }
}
</script>

vue 3.x

代码语言:javascript
复制
<template>
  <div>
    <input type="text" :value="inputRef.val" @input="updateValue">
  </div>
</template>
<script>
export default {
  props: {
    modelValue: String
  },
  setup(props, context) {
    const inputRef = reactive({
      val: props.modelValue || ''
    })
  
    updateValue = (e: KeybordEvent) => {
      const targetValue = (e.target as HTMLInputElement).value
      inputRef.val = targetValue
      context.emit('update: modelValue', targetValue)
    }
    
    return {
      inputRef,
      updateValue,
    }
  }
}
</script>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 子组件的模板设置
  • 父组件模板
  • vue 3.x
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档