v-model双向绑定的实现原理

在前端处理表单时,我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦,这里我们先用input属性写入输入框,代码如下:

<template>
	<view class="out">
		<input type="text" :value="iptvalue" @focus="isActive = true" @blur="isActive = false"
		@input = "onInput">
		<image src="../../static/chicken.gif" class="pic"
		:class = "isActive?'active':''"></image>
	</view>
</template>

<script setup>
import {ref} from "vue" ;
const iptvalue = ref("") ;
const isActive = ref(false) ;
function onInput(e){
	console.log(e) ;
}
</script>

<style lang="scss" scoped>
	.out{
		 padding: 0 20px;
		 margin-top: 40px;
		 position: relative;
		 input{
			 border: 1px solid #ccc;
			 height: 40px;
			 position: relative;
			 z-index: 2;
			 background: #fff;
		 }
		 .pic{
			 width: 24px;
			 height: 24px;
			 z-index: 1;
			 position: absolute;
			 top: 0px;
			 left: calc(50% - 12px);
			 transition: top 0.3s;
		 }
		 .pic.active{  
			 top: -24px;
		 }
	} 
	
</style>

在输入框中输入内容,注意去看,我们每输入一次控制台就会获取数据,更新一次:
在这里插入图片描述
拿到这些回传的数据,我们可以让它在另一区域实时预览,代码如下:

<template>
	<view class="out">
		<input type="text" :value="iptvalue" @focus="isActive = true" @blur="isActive = false"
		@input = "event => iptvalue = event.detail.value">
		<image src="../../static/chicken.gif" class="pic"
		:class = "isActive?'active':''"></image>
	</view>
	<view>预览:{{iptvalue}}</view>
</template>

<script setup>
import {ref} from "vue" ;
const iptvalue = ref("") ;
const isActive = ref(false) ;
// function onInput(e){
// 	iptvalue.value = e.detail.value ;
// }
</script>

<style lang="scss" scoped>
	.out{
		 padding: 0 20px;
		 margin-top: 40px;
		 position: relative;
		 input{
			 border: 1px solid #ccc;
			 height: 40px;
			 position: relative;
			 z-index: 2;
			 background: #fff;
		 }
		 .pic{
			 width: 24px;
			 height: 24px;
			 z-index: 1;
			 position: absolute;
			 top: 0px;
			 left: calc(50% - 12px);
			 transition: top 0.3s;
		 }
		 .pic.active{  //pic active同时满足时
			 top: -24px;
		 }
	} 
	
</style>

效果如下:
在这里插入图片描述

v-model

接下来,通过v-model简化这段代码,用v-model替换掉value属性,就实现了我们刚刚用事件来监听的方法,代码如下:

<template>
	<view class="out">
		<input type="text"  @focus="isActive = true" @blur="isActive = false"
		v-model="iptvalue">
		<image src="../../static/chicken.gif" class="pic"
		:class = "isActive?'active':''"></image>
	</view>
	<view>预览:{{iptvalue}}</view>
</template>

<script setup>
import {ref} from "vue" ;
const iptvalue = ref("") ;
const isActive = ref(false) ;
// function onInput(e){
// 	iptvalue.value = e.detail.value ;
// }
</script>

<style lang="scss" scoped>
	.out{
		 padding: 0 20px;
		 margin-top: 40px;
		 position: relative;
		 input{
			 border: 1px solid #ccc;
			 height: 40px;
			 position: relative;
			 z-index: 2;
			 background: #fff;
		 }
		 .pic{
			 width: 24px;
			 height: 24px;
			 z-index: 1;
			 position: absolute;
			 top: 0px;
			 left: calc(50% - 12px);
			 transition: top 0.3s;
		 }
		 .pic.active{  //pic active同时满足时
			 top: -24px;
		 }
	} 
	
</style>

confirm事件

input的confirm事件会在输入完内容,敲击回车键后触发,会获取输入框的数据,加上confirm事件,代码如下:

<template>
	<view class="out">
		<input type="text"  @focus="isActive = true" @blur="isActive = false"
		v-model="iptvalue"
		@confirm = "onConfirm">
		<image src="../../static/chicken.gif" class="pic"
		:class = "isActive?'active':''"></image>
	</view>
	<view>预览:{{iptvalue}}</view>
</template>

<script setup>
import {ref} from "vue" ;
const iptvalue = ref("") ;
const isActive = ref(false) ;
// function onInput(e){
// 	iptvalue.value = e.detail.value ;
// }
	function onConfirm(e){
		console.log(e) ;
	}
</script>

<style lang="scss" scoped>
	.out{
		 padding: 0 20px;
		 margin-top: 40px;
		 position: relative;
		 input{
			 border: 1px solid #ccc;
			 height: 40px;
			 position: relative;
			 z-index: 2;
			 background: #fff;
		 }
		 .pic{
			 width: 24px;
			 height: 24px;
			 z-index: 1;
			 position: absolute;
			 top: 0px;
			 left: calc(50% - 12px);
			 transition: top 0.3s;
		 }
		 .pic.active{  //pic active同时满足时
			 top: -24px;
		 }
	} 
	
</style>

输入内容,敲击回车键后,会获取到数据:
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值