巧妙运用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 相关文章推荐
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
说说JSON和JSONP 也许你会豁然开朗
Sep 02 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
JavaScript判断数组是否存在key的简单实例
Aug 03 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
May 07 Javascript
javascript获取select值的方法完整实例
Jun 20 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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
php 清除网页病毒的方法
2008/12/05 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
js 火狐下取本地路径实现思路
2013/04/02 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
Python调用JavaScript代码的方法
2020/10/27 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
小学教师的自我评价范例
2013/10/31 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
Python pyecharts绘制条形图详解
2022/04/02 Python
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS