2021-12-06 Vue v-model 双向绑定

一、v-model 双向绑定

1.v-model的理解:

1、v-model实现原理
2、自定义组件使用v-model

2.v-model原理:
vue中,对<input>标签使用v-model指令可以实现数据的双向绑定;其原理是利用<input>标签的value属性和input事件;

下面是我们使用v-model的方式:

<input v-model= "inputVal"  type="text">
<div class="show-panel">{{inputval}}</div> 
export default {
data() {
     return {
            inputVal:  ' '
         }
     }
}

效果如下:


20200114142402735.gif

为了更好的理解v-model的原理,我们先模拟v-model的实现:

利用vue模拟v-model的实现:

< input :value="inputVal" type="text" @input=" inputVal = $event.target.value">
<div class="show- panel">{{ inputVal }}</div>

<input>标签添加了value属性以及input事件,当我们在输入内容时,触发input事件,将<input>标签中的值赋给inputVal变量。

原生js模拟v-model的实现

<input id="input" type="text" oninput= "handleInput()">
<div class=" show- panel"></div>
let inputEle = document. queryselector( ' #input ' )
let showPanelEle = document. querySelector( ' .show- panel ' )
let inputval =  ''
//将inputVal 的值赋给input标签的value属性
inputEle.value = inputVal
function handleInput() { 
//获取input标签的value属性值,并赋给inputVal、 showPanelEle
inputval = inputEle.value 
showPanelEle.innerHTML = inputEle.value
}

最开始将inputVal的值赋给<input>标签的value属性,当输入内容时,触发input事件,获取<input>标签中最新的value属性值,并将输入值赋给inputVal变量和showPanelEle元素。

结合上面v-model的实现,可以看出v-model利用了表单元素(<input>)的value属性和input事件,通过定义一个变量inputVal,并将inputVal赋给表单元素的value属性,当触发表单元素的input事件时将最新的输入值更新给变量inputval,进而实现双向绑定。

自定义组件使用v-model

我们知道表单元素本身具有input事件,在输入内容时,可以触发,但是在vue中,对于自定义组件,当自身没有input事件时,还可以使用v-model吗?

答案是可以使用的,对于自定义组件,当我们使用v-model后,组件会自动多了一个value属性值和名为input的自定义事件(这一切都是vue帮我们实现的),具体如下:

如下是一个HelloWorld.vue组件:

// HelloWord.vue 
< template>
<div>
<h1>{{ value }}</h1>
<button @click="handleClick" >点击更新文本</button>
</div>
</template>

<script>
export default {
name: Helloworld,
props: {
     value: {
            type: string,
                   default: '',
      }
},
methods: {
        handleClick() {
},
         this.$emit(' input', 'Hi, Vue')
}
</script>


<!-- Add "scoped" attribute to limit CSS  to this component only  -->
<style scoped>
<style>

我们在使用HelloWorld.vue组件时候用了v-model

<hello-world v-model="inputval">< /hello-world>
< script>
import HelloWorld from './components/Helloworld.vue
export default {
name : 'app',
components: {
    HelloWorld
},
data() {
       return {
           inputval: 'hello, V-model'
    }
}
</script>

我们在HelloWorld.vue中可以获取一个名为value的属性,当我们需要改变该属性值时,通过触发一个名为input的自定义事件即可,这就是在自定义组件中使用v-model的方法。

效果如下:


hello.gif

如果不使用v-model还想达到相同的效果,我们需要这样做:

<hello-world :value="inputVal" @input="handleInput"></hello-world>
import HelloWorld from ' ./components /Helloworld.vue
export default {
name : 'app',
components: { 
HelloWorld,
   data() {
       return {
            inputval: ' hello, v-model '
      }
},
methods: {
      handleInput(val) {
           this. inputVal = val
}

综上所述,我们可以知道v-model是一种语法糖,它利用了标签(表单元素、自定义元素)的value属性和input事件(对于表单元素,input事件是本身原有的事件,对于自定义组件,input事件就是一个名为input的自定义事件)实现了双向绑定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341