首页 > 其他分享 >vue的model选项

vue的model选项

时间:2023-09-14 10:46:59浏览次数:42  
标签:选项 vue val 绑定 value 组件 input model

vue中的v-model指令实现了表单的双向绑定,官网例子:

<input type="text" v-model="message" />
<p>{{message}}</p>

其实v-model只是语法糖,真正的实现形式:

<input type="text" :value="message" @input="message = $event.target.value" />
  1. 将输入框的值绑定到message变量上,这只是单向的,改变message的值可以改变inputvalue,但是改变input的输入不会改变message
  2. 监听input事件,当输入内容时,改变message变量,从而实现了双向绑定。

从官网上看到,v-model在内部为不同的输入元素使用不同的属性并抛出不同的事件:

  • texttextarea元素使用value属性和input事件
  • checkboxradio使用checked属性和change事件
  • select使用valuechange事件

实现自定义输入框组件v-model,即双向绑定

Vue.component('custom-input', {
  // 监听input,输入时触发自定义组件内部的updateVal事件
  template: `<input :value="value" @input="updateVal($event.target.value)" type="text"></input>`,
  // 通过props传递,实现父组件值绑定到输入框的value
  props: ["value"],
  methods: {
    // 触发父组件上的input事件
    updateVal(val) {
      this.$emit("input", val);
    }
  }
});
<template>
  <div id="app">
    // 父组件的value值绑定price
    <price-input :value="price" @input="onInput"></price-input>
  </div>
</template>
<script>
var app = new Vue({
  el: '#app',
  data() {
    price: ''
  },
  methods: {
    // 传递过来的值赋给父组件的price变量,实现了输入框到父元素的单向绑定
    onInput(val) {
      this.price = val;
    }
  }
})
</script>
  • 通过上面的分析,默认情况下,一个组件上的v-model会把value用作prop且把input用作event
  • 所以当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定义组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显示的去声明定义这些东西。
  • 这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。
<template>
  <input type="text" :value="uname" @input="updateVal($event.target.value)" />
</template>
<script>
Vue.component('my-input', {
  model: {
    prop: 'uname',
    event: 'changeXXX' // 随便命名事件,对应下面的```$emit```即可
  },
  props: {
    uname: {
      type: String,
      default: 'tom'
    }
  },
  methods: {
    updateVal(val) {
      this.$emit('changeXXX', val);
    }
  }
})
</script>

然后,父组件使用v-model就可以了

<template>
  <my-input v-model="name" value="some value"></my-input>
  <p>{{name}}</p>
</template>

等价于

<my-input :uname="name" @changeXXX="val => {foo = val}" value="some value"></my-input>

标签:选项,vue,val,绑定,value,组件,input,model
From: https://www.cnblogs.com/m2maomao/p/17701831.html

相关文章

  • Vue二维码组件
    1.前言该组件依赖qrcode.js与element-ui支持二维码大小配置,点击大图预览该组件以vue文件形式进行封装,需要配置httpVueLoader插件进行引入,其他格式请自行更改源码2.使用方法引入依赖<linkhref="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.13/theme-chalk/index......
  • vue2实现pc端自适应分辨率
    思路:使用lib-flexible结合postcss-pxtorem实现第一步在项目utils下建立flexible.js文件(直接下载则不用新建该文件)第二部复制以下代码到刚建好的文件中或者直接yarninstalllib-flexible-pc-y//基于libflexible用来适配pc端(function(win,lib){ vardoc=win.docu......
  • VueX写法对比
    原始写法<template><div><h1>当前求和为:{{sum}}</h1><selectv-model.number="n"><optionvalue="1">1</option><optionvalue="2">2</opti......
  • 【Vuejs】Date()常用方法
    Date()常用方法vardate=newDate()console.log(date);//FriOct29202114:18:13GMT+0800(中国标准时间)console.log(date.getMonth());//获取月份(0-11,0代表1月,所以在显示当前时间的时候需要date.getMonth()+1)console.log(date.getYear());......
  • vue实现tab标签选中
    tabs实现<template><div><divv-for="(item,index)intabs":key="index"class="coursespecialtyView-tabs-txt":class="{active:isActive(index)}"@click="changeTab(item......
  • 如何在Vue项目中引入avue进行开发?
    Avue的官网官网地址:​ ​https://avuejs.com/​安装3.1安装npmi@smallwei/avue-S$3.2在main.js中引入//引入importAvuefrom'@smallwei/avue';import'@smallwei/avue/lib/index.css';Vue.use(Avue)4使用4.1官方文档4.2实际应用<template><div&g......
  • Vue H5 Swiper 动画
    简介及使用教程VueH5Swiper是一个H5移动滑块组件,适用于H5应用程序,轻量。安装Npmnpmivue-h5-swiperYarnyarnaddvue-h5-swiper使用引入import{Swiper,SwiperItem}from'vue-h5-swiper';注册exportdefault{components:{Swiper,Swiper......
  • Vue 文本字幕组件(Marquee Text Component)
    简介及使用教程Vue文本字幕组件(MarqueeTextComponent)是一个Vue.js的字幕文本组件,具有CSSGPU动画、快速、功能强大等特点。安装Npmnpmivue-marquee-text-componentYarnyarnaddvue-marquee-text-component 使用全局注册importVuefrom'vue'importMa......
  • vue 大转盘旋转效果
    场景如下:用户点击抽奖,转盘立刻线性提速转动,同时请求抽奖接口,旋转过程中等待接口返回抽奖信息接口返回信息后,转盘减速至停转网上找到animejs动画框架,想钻研的同学可以看一下,我没有用此框架实现,是手写的这个demo没有实现停在指定奖品上也没有实现完全停止后,正好停在0°<temp......
  • 记录--用 Vue 实现原神官网的角色切换效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言为了更好的了解原神角色,我模仿官网做了一个角色切换效果,在做的过程当中也总结了一些技术点。为了让大家更好的体验,我兼容了PC端和移动端,建议在PC端查看效果更佳。接下来就为大家简单的分享一下!话不多说,......