Elementui el-input 实现自定义 v-model

Vue 本身支持自定义组件实现 v-model ,但 el-input 作为 Elementui 的自定义组件也已经实现 v-model ,那么如果在自定义组件中使用 el-input ,但自定义组件也想实现 v-model ,应该怎么做?

更多精彩

错误的方式

  1. Vue 中让自定义组件实现 v-model 可参考 Vue自定义v-model
  2. 但如果按照这种方式想要让以下代码实现 v-model ,是不可取的
    • 可以用,但每次在页面第一次渲染的时候都没有值,非要手动输入一次,才会触发变化
    • 这是因为下面这个 in-player 组件中的 el-input 已经实现了自定义的 v-model ,当 in-player 再次通过同样的方式实现时,就出现了两次 watch 操作
<template>
  <div class="in-player-panel">
    <el-input placeholder="请输入视频vid" v-model="videoId">
      <el-button slot="append" @click="changePlayAuth">播放</el-button>
    </el-input>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    name: 'in-player',
    props: {
      value: {
        type: String,
        value: ' '
      }
    },
    data () {
      return {
        videoId: ''
      }
    },
    watch: {
      'value' (val) {
        if (val == this.videoId) { return false }
        this.videoId = val
      },
      'videoId' (val) { this.$emit('input', val) }
    }
  }
</script>

正确的方式

  1. 如果在自定义组件中,既想使用 el-input 的样式和规则,又想让组件本身实现自定义 v-model
  2. 那么就应该像如下代码一样,不直接使用 el-input 的 v-model 实现,转而使用其 @input 函数
<template>
  <div class="in-player-panel">
    <el-input placeholder="请输入视频vid" :value="value" @input="update">
      <el-button slot="append" @click="changePlayAuth">播放</el-button>
    </el-input>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    name: 'in-player',
    props: {
      value: {
        type: String,
        value: ' '
      }
    },
    methods: {
      update (val) {
        this.$emit('input', val)
      }
    }
  }
</script>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,240评论 0 6
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,375评论 0 25
  • 深入响应式 追踪变化: 把普通js对象传给Vue实例的data选项,Vue将使用Object.defineProp...
    冥冥2017阅读 4,892评论 6 16
  • 目标:1、了解v-model的本质。2、了解v-model的实现原理。 我们知道Vue的核心特性之一是双向绑定,v...
    LoveBugs_King阅读 222,487评论 3 38
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,171评论 0 1