当前位置: 首页 > news >正文

前端-v-model原理

目录

一.v-model原理

二.表单类组件封装

三.父组件v-model简化代码,实现子组件和父组件数据的双向绑定


一.v-model原理

        原理:v-model本质上是一个语法糖。例如应用在输入框上,就是value属性和input事件的和写。

        作用:提供双向的数据绑定

        数据变了,视图中的数据也跟着变:value

        视图中的数据变了,数据也跟着变@input

        详解事件对象https://blog.csdn.net/weixin_52159554/article/details/151317800?spm=1001.2014.3001.5501

        注意:$event用于在模板上,获取事件的形参

        这里$event不可以直接替换为e,通过$event可以直接拿到当前事件的形参,而这个形参就是事件对象e

        Vue 模板里写事件绑定时,比如 @click="myFn('参数1', '参数2')",Vue 会把你写的内容直接当作一段 JS 表达式来处理,它不会自动把事件对象塞进去

👉 所以你需要手动告诉 Vue:我要事件对象! —— 这时候就得用 $event

二.表单类组件封装

        父传子:数据应该是父组件props传递过来的,v-model拆解绑定数据

        子传父:监听输入,子传父传值给父组件修改    

        创建父子代码并通过v-model来将父组件中的选择响应给子组件:

<script lang="ts">
import {defineComponent} from 'vue'
import Father from '@/components/Father.vue'export default defineComponent({name: "GrandfatherComponent",components: {Father},data() {return {key: '我是Grendfather的孙子',userInfo: {name: '张三',age: 99,},cityId: '102',}},provide() {return {key: this.key,userInfo: this.userInfo}},methods: {kit() {this.userInfo.name = '李四'console.log(this.userInfo)},handleClick(e) {console.log("事件类型是:", e.type);         // clickconsole.log("点击位置是:", e.clientX, e.clientY);console.log("点击的元素是:", e.target);}}
})
</script><template><div>我是爷爷组件<div><button @click="kit">点击孙子的姓名发生变化</button></div><div><input type="text" v-model="userInfo.age"><input type="text" :value="userInfo.age" @input="userInfo.age = $event.target.value"/></div><div><button @click="handleClick">点击我</button></div><Father :cityId="cityId"></Father></div>
</template><style scoped lang="less"></style>
<script lang="ts">
import {defineComponent} from 'vue'
import Son from '@/components/Son.vue'export default defineComponent({name: "FatherComponent",components: {Son},props: {cityId: {type: String,required: true,default: ''}}
})
</script><template><div>我是父亲组件<select v-model="cityId"><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">深圳</option><option value="105">广州</option></select><Son></Son></div>
</template><style scoped lang="less"></style>

        但是会报错:

        原因是我们使用v-model来连接的,这样就会导致视图改变了,数据也会跟着改变,所以就会导致子组件修改了父组件中的数据,因为组件的独立性,所以是会报错的。

        此时可以通过v-model的拆解来解决这个报错:

                我们都知道v-model其实就是一个语法糖,是将数据绑定和事件响应绑定到了一起的,所以由此我们就可以得出解决办法:

                使用:value来绑定数据 然后在使用@change="事件名"来实现v-model的效果

<script lang="ts">
import {defineComponent} from 'vue'
import Son from '@/components/Son.vue'export default defineComponent({name: "FatherComponent",components: {Son},props: {cityId: {type: String,required: true,default: ''}},methods: {changeCityId(e) {this.$emit('changeCityId', e.target.value)}}
})
</script><template><div>我是父亲组件<select :value="cityId" @change="changeCityId"><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">深圳</option><option value="105">广州</option></select><Son></Son></div>
</template><style scoped lang="less"></style>

三.父组件v-model简化代码,实现子组件和父组件数据的双向绑定

        子组件中:props通过value接收,事件触发input

        父组件中:v-model给组件直接绑定数据(:value + @input)

<script lang="ts">
import {defineComponent} from 'vue'
import Father from '@/components/Father.vue'export default defineComponent({name: "GrandfatherComponent",components: {Father},data() {return {key: '我是Grendfather的孙子',userInfo: {name: '张三',age: 99,},cityId: '102',}},provide() {return {key: this.key,userInfo: this.userInfo}},methods: {kit() {this.userInfo.name = '李四'console.log(this.userInfo)},handleClick(e) {console.log("事件类型是:", e.type);         // clickconsole.log("点击位置是:", e.clientX, e.clientY);console.log("点击的元素是:", e.target);}}
})
</script><template><div>我是爷爷组件<div><button @click="kit">点击孙子的姓名发生变化</button></div><div><input type="text" v-model="userInfo.age"><input type="text" :value="userInfo.age" @input="userInfo.age = $event.target.value"/></div><div><button @click="handleClick">点击我</button><br><input type="text" v-model="cityId"></div><Father v-model="cityId"></Father></div>
</template><style scoped lang="less"></style>
<script lang="ts">
import {defineComponent} from 'vue'
import Son from '@/components/Son.vue'export default defineComponent({name: "FatherComponent",components: {Son},props: {value: {type: String,required: true,default: ''}},methods: {changeCityId(e) {this.$emit('input', e.target.value)}}
})
</script><template><div>我是父亲组件<select :value="value" @change="changeCityId"><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">深圳</option><option value="105">广州</option></select><Son></Son></div>
</template><style scoped lang="less"></style>


         

             


文章转载自:

http://SgeUmFBp.kdfnd.cn
http://E9sWwehJ.kdfnd.cn
http://MfPnWp3I.kdfnd.cn
http://u99tlf9R.kdfnd.cn
http://Rj6s2q6I.kdfnd.cn
http://ow0MGtYL.kdfnd.cn
http://n4Ytb1Nh.kdfnd.cn
http://8UTniBY4.kdfnd.cn
http://x6m8p71r.kdfnd.cn
http://eoHHOuRr.kdfnd.cn
http://QHVdTeMS.kdfnd.cn
http://3MhNDBwj.kdfnd.cn
http://oAZdM0nI.kdfnd.cn
http://3cETLYdT.kdfnd.cn
http://ZR4YFI9U.kdfnd.cn
http://86YvEDPM.kdfnd.cn
http://GB34uEDV.kdfnd.cn
http://wtH0sinw.kdfnd.cn
http://MOsrk7Nh.kdfnd.cn
http://JbMnu9Dy.kdfnd.cn
http://iLKacyyB.kdfnd.cn
http://T4QaJeZ9.kdfnd.cn
http://Q3v3Hest.kdfnd.cn
http://0BQzYJ9n.kdfnd.cn
http://WzAKAshH.kdfnd.cn
http://Phcjinnf.kdfnd.cn
http://fA6Mbvm8.kdfnd.cn
http://sEnWV2jX.kdfnd.cn
http://KhRzMN3f.kdfnd.cn
http://hPeFRowO.kdfnd.cn
http://www.dtcms.com/a/378631.html

相关文章:

  • 格式刷+快捷键:Excel和WPS表格隔行填充颜色超方便
  • 链表基础与操作全解析
  • GitHub 热榜项目 - 日榜(2025-09-11)
  • 中山GEO哪家好?技术视角解析关键词选词
  • 从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录
  • 当DDoS穿上马甲:CC攻击的本质
  • 【ThreeJs】【自带依赖】Three.js 自带依赖指南
  • STM32短按,长按,按键双击实现
  • Flutter与原生混合开发:实现完美的暗夜模式同步方案
  • AT_abc422_f [ABC422F] Eat and Ride 题解
  • 面试问题详解十八:QT中自定义控件的三种实现方式
  • sql 中的 over() 窗口函数
  • Nginx优化与 SSL/TLS配置
  • Git远程操作(三)
  • 深入解析Spring AOP核心原理
  • 虫情测报仪:通过自动化、智能化的手段实现害虫的实时监测与预警
  • Python快速入门专业版(二十二):if语句进阶:嵌套if与条件表达式(简洁写法技巧)
  • 研发文档分类混乱如何快速查找所需内容
  • Java Web实现“十天内免登录”功能
  • CH347使用笔记:CH347在Vivado下的使用教程
  • 【linux内存管理】【基础知识 1】【pgd,p4d,pud,pmd,pte,pfn,pg,ofs,PTRS概念介绍】
  • 详解mcp以及agent java应用架构设计与实现
  • 硬件开发2-ARM裸机开发2-IMX6ULL
  • 电商网站被DDoS攻击了怎么办?
  • Java NIO的底层原理
  • QT 常用控件(概述、QWidget核心属性、按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
  • MATLAB2-结构化编程和自定义函数-台大郭彦甫视频
  • 鸿蒙的编程软件的介绍
  • 鸿蒙审核问题——Scroll中嵌套了List/Grid时滑动问题
  • REDPlayer 鸿蒙原生视频播放库组件介绍与使用指南