平时我们在使用Vue开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面也要用,今天我们就来看看怎么优雅的解决这个问题吧!

一般来说我们实现这个功能,只需要父组件通过 props 传递给子组件就好了,但是理想很丰满,现实很骨感,如果我们直接在子组件更改传进来的 props ,不出意外浏览器会给你一坨大红色的报错,因为在Vue中我们的数据流动是自上而下的,而子组件直接更改父组件传来的 props 则是自下而上的数据流动,这是Vue不允许的。

所以通常我们的解决办法是,父组件通过 props 传入状态给子组件,子组件通过 props 来初始化另外一个内部的状态,子组件每次更改状态之后都通知父组件,然后由父组件来更改自己的状态,其实就是 props on emit 的应用,接下来我们来上代码。

父组件 Father.vue

"father">

父组件维护的状态:{{food}}

"food" @update:food="f => food = f">


子组件 Son.vue

"son">

子组件中维护的状态:{{innerFood}}

"innerFood = '100斤牛肉'">点击更改子组件状态

可以看到我们上述的写法,其实是维护了父子组件中的不同的两个状态,我们做的工作只是将这两个状态同步了,这种写法没有任何问题,其实对于子组件的部分我们也可以通过 computed 来实现,下面我们来看一看另一种子组件内维护同步状态的方法:

子组件 Son.vue 的另一种写法

"son">

子组件中维护的状态:{{innerFood}}

"innerFood = '100斤牛肉'">点击更改子组件状态

好了,两种写法我们都已经演示完毕,现在我们来优化一下父组件中的写法。

父组件中可以看到我们之前在上面绑定了一个 update:food 事件,并且使用箭头函数做了一个赋值,其实这里我们可以稍微优化一下,不要箭头函数直接赋值,因为我们触发的是自定义事件,而我们触发的时候给的第一个参数就是新值,我们可以直接通过 $event 拿到这个值,所以可以写成如下形式:

优化后的父组件

"father">

父组件维护的状态:{{food}}

"food" @update:food="food = $event">


到这里你以为就结束了?其实我们还可以更近一步,只要满足我们以上的事件命名方式,我们实际上可以使用 sync 修饰符代替事件的绑定,也就是我们不用写事件绑定了,但是子组件内部的事件触发依然不能少,最终优化的结果如下:

"father">

父组件维护的状态:{{food}}

"food">


到此我们就真的完成了父子组件的同步,当然在子组件中维护一个状态不一定是必须的,如果我们只用父组件传给我们的 props 做展示,而子组件没有对这个 props 直接更改的行为,那么我们就不用在子组件创建另外一个状态,我们子组件想改他的时候只需要在合适的时机提交合适的事件即可,但是有一种情况我们不得不在子组件中创建另一个状态,就是我们父组件传入的状态在子组件中用于 v-model 这种双向数据绑定的功能时,由于 v-model 会自动更改值所以直接填入从父组件接受的 props 就不合适了。

最后

喜欢本文可以点赞、收藏、在看、转发到您的朋友圈,可以关注公众号加入交流群,大家一起交流学习!

vue中 点击事件的写法_Vue父子组件状态同步的最佳方式相关推荐

  1. vue 父组建获取子组建方法为获得_Vue父子组件状态同步的最佳方式

    平时我们在使用Vue开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面也要用,今天我们就来看看怎么优雅的解决这个问题吧! 一 ...

  2. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

  3. vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解

    一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...

  4. vue中 点击事件的写法_vue基础之事件v-onclick=函数用法示例

    本文实例讲述了vue基础之事件v-οnclick=函数用法.分享给大家供大家参考,具体如下: v-on:click/mouseout/mouseover/dblclick/mousedown..... ...

  5. vue中mixin 感觉很牛逼(父子组件融合成一个新组件)

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别? 组件在引 ...

  6. vue中enter回车键事件

    项目中在搜索商品时,在没有搜索按钮的情况下,刚开始是写的当用户输入完成后,input框失去焦点blur事件处理,产品提议用户输入后,按enter回车键返回搜索结果. vue中失去焦点事件写法:@blu ...

  7. Vue中监听键盘事件

    Vue中监听键盘事件 在一些搜索框中,我们往往需要监听键盘的按下(onkeydown)或抬起(onkeyup)事件以进行一些操作.在原生js或者jQuery中,我们需要判断e.keyCode的值来获取 ...

  8. vue 事件调用 传参_对vue下点击事件传参和不传参的区别详解

    如下所示: {{btn_text1}} {{btn_text2}} var _vm = new Vue({ data : { btn_text1 : '点击1' , btn_text2 : '点击2' ...

  9. click传值vue_对vue下点击事件传参和不传参的区别详解

    如下所示: {{btn_text1}} {{btn_text2}} var _vm = new Vue({ data : { btn_text1 : '点击1' , btn_text2 : '点击2' ...

  10. vue鼠标移动上去提示_关于如何处理vue中鼠标悬停事件的详细说明

    最后,在查看结果中,发现滑过鼠标事件将触发该事件,但它将闪烁并清除. 当鼠标停留在单元格上时鼠标滑过事件,遮罩层将消失并重复出现. 开关. 为了缓解这种情况,setTimeout也用于延迟显示和隐藏在 ...

最新文章

  1. [android] androidPN开源项目介绍
  2. 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)
  3. MFC拖拽文件到任意EDIT控件
  4. HDOJ 1298 T9(trie树简单应用)
  5. wordpress 显示数学公式 (MathJax-LaTeX)
  6. springcloud~Eureka实例搭建
  7. 当你和你女朋友闹矛盾时......
  8. USB HID学习:MFC检测USB拔插事件
  9. Forking AfterBurn into Maya
  10. 【Paper】A Comprehensive Survey of Clustering Algorithms
  11. mongodb mongoose 的使用
  12. my97DatePicker选择年、季度、月、周、日(转)
  13. python输入球的半径_python程序设计:输入球体半径r,计算球体的体积和表面积
  14. 《红楼梦》的香气韵调
  15. 替身机器人,看我用脑电波控制你
  16. linux(x64)下安装Matlab 2015b破解版(含安装包)
  17. github加速神器
  18. Unity3D——游戏序列化
  19. Ubuntu 20.04 grub更换windows10为默认启动项
  20. 在windows系统上安装双系统

热门文章

  1. 给物体赋值 只改变transform.position的某一维,访问另一个脚本的变量以及给物体用脚本动态添加属性
  2. 190318每日一句
  3. HCI实验图常见类型
  4. 一个简单的Matlab面向对象编程实例
  5. Atitit 数据出入管理法v3 目录 1.1. 边界检查:web边界和sql边界 1 2. 检查条目 1 2.1. 数据种类检查 整数 小数 字符串(带长度,字符白名单校验) 1 2.2. 字符黑
  6. paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
  7. paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
  8. paip.AJAX回调函数不起作用的解决
  9. FIS如何成为制霸北美的金融科技航母?丨亿欧解案例
  10. “腾讯基因”讨论:为什么我常说做to C的人很难去做to B?