网站首页 > 技术文章 正文
### v-model机制详解
我们都知道vue的双向数据绑定,当你改变它的值时,视图层就跟着变化。
```vue
<input type="text" v-model="value" />
```
其实它只是语法糖,主要是通过input事件来触发input标签value值来实现我们说的“双向数据绑定”,其实它还是单向数据流。上面的实际相当于
```vue
<input type="text" :value="value" @input=v=>$emit('input', v)/>
```
#### 在自定义组件中使用v-model的几种方法
我们在封装输入框input、下拉选择select、单选多选radio等多会使用到自定义v-model功能。下面介绍几种常用方法的使用:
**1. prop + $emit**
搞过vue开发的同志们都知道我们经常用prop 和 $emit进行组件间通信,这方面不在本文具体阐述,详细请自行到[cn.vuejs.org]()了解
```vue
<template>
<input type="text" :value="value" @input="handleInput" :placeholder="placehodler" />
</template>
<script>
export default {
name: 'kInput',
props: {
value: ['String', 'Number'],
placeholder: String
},
methods: {
handleInput ($event) {
// 通过input标签的原生事件input将值emit出去,以达到值得改变实现双向绑定
this.$emit('input', $event.target.value)
}
}
}
</script>
<style scoped type="less">
</style>
```
**2. prop + $emit + model选项**
```vue
<template>
<input type="text" :value="value" @input="handleInput" />
</template>
<script>
export default {
name: 'kInput',
model: {
prop: 'value',
event: 'input'
},
props: {
value: ['String', 'Number'],
placeholder: String
},
methods: {
handleInput ($event) {
// 通过input标签的原生事件input将值emit出去,以达到值得改变实现双向绑定
this.$emit('input', $event.target.value)
}
}
}
</script>
<style scoped type="less">
</style>
```
**3. prop + $emit + computed**
```vue
<template>
<input type="text" :value="value2" @input="handleInput" />
</template>
<script>
export default {
name: 'kInput',
props: {
value: ['String', 'Number'],
placeholder: String
},
computed: {
value2: {
get() {
const v = JSON.parse(JSON.stringify(this.value)) //利用深拷贝原理使得修改prop值不会报错,因为prop是单向数据流,2.0版本上不允许在组件内部直接修改
return v
},
set(val) {
const v = JSON.parse(JSON.stringify(this.value))
return v = val
}
}
},
methods: {
handleInput () {
// 通过input标签的原生事件input将值emit出去,以达到值得改变实现双向绑定
this.$emit('input', this.value2)
}
}
}
</script>
<style scoped type="less">
</style>
```
三种方式则在父组件中使用
```vue
<template>
<div class="main">
<k-input v-model="search" placeholder="请输入搜索关键词"></k-input>
</div>
</template>
<script>
import kInput from '@/components/common/kInput' //引入这个自定义组件(根据自己项目具体位置引入)
export default {
data () {
return {
search: ''
}
},
components: {
kInput // 局部注册组件
}
}
</script>
```
有什么不对的地方欢迎批评指正。
猜你喜欢
- 2025-01-23 自定义的拖拽式智能大屏(springboot+VUE)
- 2025-01-23 手把手教你在 Vue3 中自定义指令(vue自定义指令两种方式)
- 2025-01-23 如何实现 Vue 自定义组件中 hover 事件以及 v-model
- 2025-01-23 尝鲜 Vue3.0+Vite 自定义导航栏+弹窗组件
- 2025-01-23 VUE工具箱:定制组件的 V-MODEL(vue必备插件)
- 2025-01-23 Vue短文:如何在HTTP请求时传递自定义头部
- 2025-01-23 20 道必看的 Vue 面试题 | 原力计划
- 2025-01-23 浅析vue封装自定义插件(vue封装一个组件需要哪些步骤)
- 2025-01-23 Vue3实战笔记(62)—Vue3自定义指令入门:10分钟学会基础用法
- 2025-01-23 高质量 Vue.js 自定义美化滚动条VueScroll
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)