巧妙运用v-model实现父子组件传值的方法示例


Posted in Javascript onApril 07, 2019

v-model介绍

熟悉Vue的小伙伴们都知道 v-model 是Vue的一个很大的特色,可以实现双向数据绑定。但本质上呢,它不过是语法糖,它负责监听用户的输入事件以更新数据。
以下摘取自Vue官方文档

v-model 在内部使用不同的属性为不同的输入元素并抛出不同的事件:

  • text 和 textarea 使用 value 属性和 input 事件;
  • checkbox 和 radio 使用 checked 属性和 change 事件;
  • select 字段将 value 作为 prop 并将 change 作为事件。

如何巧妙利用 v-model实现父子组件传值

通常子组件某个变量更新,并需要告知父组件时,需要子组件触发事件并父组件监听该事件。

但是熟悉上面 v-model 的实现原理后,我们可以巧妙地运用这一原理(v-model 在内部使用不同的属性为不同的输入元素并抛出不同的事件)。

方法总结:

1.子组件设 value 为props属性,并且不主动改变 value 值
2.子组件通过 this.$emit('input', 'updateValue') 将 updateValue 值传给父组件
3.父组件通过 v-model="localValue" 绑定一个本地变量,即可实现子组件value值与父组件updateValue 值同步更新

举例

子组件

子组件,包含一个button,并且将 value 属性设为props( 因为v-model使用的是 value属性 )。

点击button时,sum值加1,同时通过 this.$emit('input', ++sum) 将更新后的值传给父组件(前提:传给父组件的值一定是你想赋给 value 的)

<template>
 <div>
  <button @click="increase" style="border: 1px solid black">increase</button>
 </div>
</template>
<script>
let sum = 0
export default {
 name: 'vmodel',
 props: {
  value: {
   type: Number,
   default: 0
  }
 },
 methods: {
  increase () {
   this.$emit('input', ++sum)
   console.log('value1', this.value)
  
   setTimeout(() => {
    console.log('value2', this.value)
   }, 50)
  }
 }
}
</script>

父组件

父组件中,通过 v-model 绑定一个本地变量,即可实现子父组件同步更新

<div>
  <increase v-model="rangeValue"></increase>
  <p>value:{{rangeValue}}</p>
</div>
<script>
data () {
  return {
   rangeValue: 0
  }
}
</script>

实际上,这个过程是首先子组件通过 $emit('input') 更新父组件的本地变量,然后子组件中的 value 属性通过 props 得以更新

总结

这种方式尤其适合子父组件传参的情况(子父组件同步更新)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript传递变量: 值传递?引用传递?
Feb 22 Javascript
jQuery 过滤not()与filter()实例代码
May 10 Javascript
js判断为空Null与字符串为空简写方法
Feb 24 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
Mar 25 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 Javascript
node.js中fs文件系统模块的使用方法实例详解
Feb 13 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 #Javascript
vue自定义指令directive的使用方法
Apr 07 #Javascript
浅谈express.js框架中间件(middleware)
Apr 07 #Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 #Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 #Javascript
javascrit中undefined和null的区别详解
Apr 07 #Javascript
详解服务端预渲染之Nuxt(介绍篇)
Apr 07 #Javascript
You might like
德生PL330测评
2021/03/02 无线电
小偷PHP+Html+缓存
2006/11/25 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
Node 代理访问的实现
2019/09/19 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python正则表达式知识汇总
2017/09/22 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
详解Python IO口多路复用
2020/06/17 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
普通员工辞职信
2014/01/17 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
小学教育见习报告
2014/10/31 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python