Vue v-model语法糖

v-model语法糖

我们可以使用v-model对input进行双向绑定

 <input v-model="message"></input>

v-model 语法糖本质是 :value="message" @input="onInput"

<input :value="message" @input="onInput"></input>

如果使子组件接收 props: value 并且 $emit('input', value) 事件,那么就直接使用v-modle语法糖

<div id="app">
  {{message}}
  <field :value="message" @input="onInput"></field>
  <field v-model="message"></field>
</div>

:value="message" @input="onInput" 与 v-model="message" 效果相同

field子组件:

 Vue.component('field', {
    props: {
      value: {
        type: String
      }
    },
    template: `
      <input :value="value" @input="onInput">
    `,
    methods: {
      onInput (e) {
        var value = e.target.value
        this.$emit('input', value)
      }
    }
  })

vue实例:

var app = new Vue({
    el: '#app',
    data: {
      message: 'hello vue !'
    },
    methods: {
      onInput (val) {
        this.message = val
      }
    }
  })

model

如果使用v-model想要监听checkbox的onchange事件,则需要model来自定义v-model语法糖

Vue.component('checkbox', {
    model: {
      prop: 'checked',
      event: 'change'
    },
    props: {
      checked: {
        type: Boolean,
        default: false
      }
    },
    template:
          `
      <input type="checkbox" @input="onInput" @change="onChange"/>
    `,
    methods: {
      onInput (e) {
        console.log('onInput', e)
      },
      onChange (e) {
        console.log('onChange', e)
        this.$emit('change', e.target.checked)
      }
    }
  })

由于v-model需要在props里面定义value来接受值,emit input来更新值,所以需要model来重新自定义prop和event

使用checkbox组件

 <checkbox v-model="toggle"></checkbox>
  <p v-show="toggle">hello</p>

vue实例:

  var app = new Vue({
    el: '#app',
    data: {
      message: 'hello vue !',
      toggle: false
    },
    methods: {
      onInput (val) {
        this.message = val
      }
    }
  })

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>v-model语法糖</title>
  <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
  {{message}}
  <field :value="message" @input="onInput"></field>
  <field v-model="message"></field>
  <checkbox v-model="toggle"></checkbox>
  <p v-show="toggle">hello</p>
</div>
<script>
  /**
   * v-model 语法糖本质是 :value="message" @input="onInput"
   * 如果使用v-modle语法糖,则需要子组件接收 props: value 并且 $emit('input', value) 事件
   */
  Vue.component('field', {
    props: {
      value: {
        type: String
      }
    },
    template: `
      <input :value="value" @input="onInput">
    `,
    methods: {
      onInput (e) {
        var value = e.target.value
        this.$emit('input', value)
      }
    }
  })
  /**
   * model
   * 如果使用v-model想要监听checkbox的onchange事件,则需要model来自定义v-model语法糖
   * 由于v-model需要在props里面定义value来接受值,emit input来更新值,所以需要model来重新自定义prop和event
   */
  Vue.component('checkbox', {
    model: {
      prop: 'checked',
      event: 'change'
    },
    props: {
      checked: {
        type: Boolean,
        default: false
      }
    },
    template:
          `
      <input type="checkbox" @input="onInput" @change="onChange"/>
    `,
    methods: {
      onInput (e) {
        console.log('onInput', e)
      },
      onChange (e) {
        console.log('onChange', e)
        this.$emit('change', e.target.checked)
      }
    }
  })
  var app = new Vue({
    el: '#app',
    data: {
      message: 'hello vue !',
      toggle: false
    },
    methods: {
      onInput (val) {
        this.message = val
      }
    }
  })
</script>
</body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方文档讲的比较模糊,自己通过例子进行理解。 v-model是语法糖 首先明确一点,v-model仅仅是语法糖。 ...
    DeeJay_Y阅读 14,854评论 3 6
  • 目标:1、了解v-model的本质。2、了解v-model的实现原理。 我们知道Vue的核心特性之一是双向绑定,v...
    LoveBugs_King阅读 222,548评论 3 38
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 6,646评论 0 6
  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 8,645评论 0 3
  • 下载安装搭建环境 可以选npm安装,或者简单下载一个开发版的vue.js文件 浏览器打开加载有vue的文档时,控制...
    冥冥2017阅读 11,257评论 0 42