vue中 点击事件的写法_Vue父子组件状态同步的最佳方式
平时我们在使用Vue开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面也要用,今天我们就来看看怎么优雅的解决这个问题吧!
一般来说我们实现这个功能,只需要父组件通过 props 传递给子组件就好了,但是理想很丰满,现实很骨感,如果我们直接在子组件更改传进来的 props ,不出意外浏览器会给你一坨大红色的报错,因为在Vue中我们的数据流动是自上而下的,而子组件直接更改父组件传来的 props 则是自下而上的数据流动,这是Vue不允许的。
所以通常我们的解决办法是,父组件通过 props 传入状态给子组件,子组件通过 props 来初始化另外一个内部的状态,子组件每次更改状态之后都通知父组件,然后由父组件来更改自己的状态,其实就是 props on emit 的应用,接下来我们来上代码。
父组件 Father.vue
"father">
父组件维护的状态:{{food}}
父组件维护的状态:{{food}}
"food" @update:food="f => food = f">
子组件 Son.vue
"son">
子组件中维护的状态:{{innerFood}}
子组件中维护的状态:{{innerFood}}
"innerFood = '100斤牛肉'">点击更改子组件状态
可以看到我们上述的写法,其实是维护了父子组件中的不同的两个状态,我们做的工作只是将这两个状态同步了,这种写法没有任何问题,其实对于子组件的部分我们也可以通过 computed 来实现,下面我们来看一看另一种子组件内维护同步状态的方法:
子组件 Son.vue 的另一种写法
"son">
子组件中维护的状态:{{innerFood}}
子组件中维护的状态:{{innerFood}}
"innerFood = '100斤牛肉'">点击更改子组件状态
好了,两种写法我们都已经演示完毕,现在我们来优化一下父组件中的写法。
父组件中可以看到我们之前在上面绑定了一个 update:food 事件,并且使用箭头函数做了一个赋值,其实这里我们可以稍微优化一下,不要箭头函数直接赋值,因为我们触发的是自定义事件,而我们触发的时候给的第一个参数就是新值,我们可以直接通过 $event 拿到这个值,所以可以写成如下形式:
优化后的父组件
"father">
父组件维护的状态:{{food}}
父组件维护的状态:{{food}}
"food" @update:food="food = $event">
到这里你以为就结束了?其实我们还可以更近一步,只要满足我们以上的事件命名方式,我们实际上可以使用 sync 修饰符代替事件的绑定,也就是我们不用写事件绑定了,但是子组件内部的事件触发依然不能少,最终优化的结果如下:
"father">
父组件维护的状态:{{food}}
父组件维护的状态:{{food}}
"food">
到此我们就真的完成了父子组件的同步,当然在子组件中维护一个状态不一定是必须的,如果我们只用父组件传给我们的 props 做展示,而子组件没有对这个 props 直接更改的行为,那么我们就不用在子组件创建另外一个状态,我们子组件想改他的时候只需要在合适的时机提交合适的事件即可,但是有一种情况我们不得不在子组件中创建另一个状态,就是我们父组件传入的状态在子组件中用于 v-model 这种双向数据绑定的功能时,由于 v-model 会自动更改值所以直接填入从父组件接受的 props 就不合适了。
最后
喜欢本文可以点赞、收藏、在看、转发到您的朋友圈,可以关注公众号加入交流群,大家一起交流学习!
vue中 点击事件的写法_Vue父子组件状态同步的最佳方式相关推荐
- vue 父组建获取子组建方法为获得_Vue父子组件状态同步的最佳方式
平时我们在使用Vue开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面也要用,今天我们就来看看怎么优雅的解决这个问题吧! 一 ...
- vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js
模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...
- vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解
一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...
- vue中 点击事件的写法_vue基础之事件v-onclick=函数用法示例
本文实例讲述了vue基础之事件v-οnclick=函数用法.分享给大家供大家参考,具体如下: v-on:click/mouseout/mouseover/dblclick/mousedown..... ...
- vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别? 组件在引 ...
- vue中enter回车键事件
项目中在搜索商品时,在没有搜索按钮的情况下,刚开始是写的当用户输入完成后,input框失去焦点blur事件处理,产品提议用户输入后,按enter回车键返回搜索结果. vue中失去焦点事件写法:@blu ...
- Vue中监听键盘事件
Vue中监听键盘事件 在一些搜索框中,我们往往需要监听键盘的按下(onkeydown)或抬起(onkeyup)事件以进行一些操作.在原生js或者jQuery中,我们需要判断e.keyCode的值来获取 ...
- vue 事件调用 传参_对vue下点击事件传参和不传参的区别详解
如下所示: {{btn_text1}} {{btn_text2}} var _vm = new Vue({ data : { btn_text1 : '点击1' , btn_text2 : '点击2' ...
- click传值vue_对vue下点击事件传参和不传参的区别详解
如下所示: {{btn_text1}} {{btn_text2}} var _vm = new Vue({ data : { btn_text1 : '点击1' , btn_text2 : '点击2' ...
- vue鼠标移动上去提示_关于如何处理vue中鼠标悬停事件的详细说明
最后,在查看结果中,发现滑过鼠标事件将触发该事件,但它将闪烁并清除. 当鼠标停留在单元格上时鼠标滑过事件,遮罩层将消失并重复出现. 开关. 为了缓解这种情况,setTimeout也用于延迟显示和隐藏在 ...
最新文章
- [android] androidPN开源项目介绍
- 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)
- MFC拖拽文件到任意EDIT控件
- HDOJ 1298 T9(trie树简单应用)
- wordpress 显示数学公式 (MathJax-LaTeX)
- springcloud~Eureka实例搭建
- 当你和你女朋友闹矛盾时......
- USB HID学习:MFC检测USB拔插事件
- Forking AfterBurn into Maya
- 【Paper】A Comprehensive Survey of Clustering Algorithms
- mongodb mongoose 的使用
- my97DatePicker选择年、季度、月、周、日(转)
- python输入球的半径_python程序设计:输入球体半径r,计算球体的体积和表面积
- 《红楼梦》的香气韵调
- 替身机器人,看我用脑电波控制你
- linux(x64)下安装Matlab 2015b破解版(含安装包)
- github加速神器
- Unity3D——游戏序列化
- Ubuntu 20.04 grub更换windows10为默认启动项
- 在windows系统上安装双系统
热门文章
- 给物体赋值 只改变transform.position的某一维,访问另一个脚本的变量以及给物体用脚本动态添加属性
- 190318每日一句
- HCI实验图常见类型
- 一个简单的Matlab面向对象编程实例
- Atitit 数据出入管理法v3 目录 1.1. 边界检查:web边界和sql边界	1 2. 检查条目	1 2.1. 数据种类检查 整数 小数 字符串(带长度,字符白名单校验)	1 2.2. 字符黑
- paip. 混合编程的实现resin4 (自带Quercus ) 配置 php 环境
- paip.编程语言方法重载实现的原理及python,php,js中实现方法重载
- paip.AJAX回调函数不起作用的解决
- FIS如何成为制霸北美的金融科技航母?丨亿欧解案例
- “腾讯基因”讨论:为什么我常说做to C的人很难去做to B?