巧妙运用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 相关文章推荐
本地对象Array的原型扩展实现代码
Dec 04 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 Javascript
js判断undefined变量类型使用typeof
Jun 03 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
JavaScript的六种继承方式(推荐)
Jun 26 Javascript
js微信分享实现代码
Oct 11 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
Oct 26 jQuery
详解在React中跨组件分发状态的三种方法
Aug 09 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
Dec 01 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP 事件机制(2)
2011/03/23 PHP
php表单提交问题的解决方法
2011/04/12 PHP
php中一个完整表单处理实现代码
2011/11/10 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
党员评议表自我评价范文
2014/10/20 职场文书
2014年审计工作总结
2014/11/17 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
分享python函数常见关键字
2022/04/26 Python