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

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

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

需要以下资料私信回复『1』免费获取哦~

父组件 Father.vue

 
        

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

         food = f">    

子组件 Son.vue

 
        

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

        点击更改子组件状态    

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

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

 
        

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

        点击更改子组件状态    

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

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

优化后的父组件

 
        

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

            

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

 
        

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

            

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

作者:木瓜太香 原文出处:博客园

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

vue 父组建获取子组建方法为获得_Vue父子组件状态同步的最佳方式相关推荐

  1. vue父页面调用子页面方法

    1.子页面,文件名MapContainer.vue <template><div class="box"><div style="posit ...

  2. vue父页面调用子页面及方法及传参,鼠标光标定位

    项目场景: vue父页面调用子页面及方法 问题描述 vue中父界面调用子界面及方法时界面可以调用,但是调用方法的时候第一次报错,但是关掉界面再次重新打开就没问题了 原因分析: 在我之前添加鼠标指针定位 ...

  3. 父页面与子ifream传值,父页面获取子页面document元素与方法

    1.父页面获取子ifream中document元素方法 window.document.getElementById('warnIfream').contentWindow.document.getE ...

  4. 父页面调用子页面方法, 子页面加载父页面传送的数据

    先看效果图就明白需求了: 点击search查询结果集, 点击某一条将该条的其他信息分别加载到tab1和tab2中, 即net bill和other amount这两个tab. 点击clear清空查询条 ...

  5. vue父子组件的三种传值方式

    vue父子组件的三种传值方式 函数类型的props传值 //父组件 <template><Children :getChildName="getChildName" ...

  6. js父元素获取子元素img_JS获取子节点、父节点和兄弟节点的方法实例总结

    本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 1. 通过获取dom方式直接获取子节点 其中test的父标签id的值,div为标签的名 ...

  7. 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...

  8. vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)

    1. 子组件向父组件传值 子组件: <template><div>子组件:<span>{{childValue}}</span><!-- 定义一个 ...

  9. vue父组给子子组件传html,vue组件之间互相传值:父传子,子传父

    今看到一篇很不错的vue组件传值文章,便于理解,遂作笔记-vue 通常页面的视图App.vue应为这样 一.父组件向子组件传值浏览器 1.建立子组件,在src/components/文件夹下新建一个C ...

最新文章

  1. python使用正则表达式抽取字符串中最大数值数字
  2. 生物战教训、生物安全问题以及未来监控军民两用生物技术扩散的手段
  3. python type函数
  4. 副业,程序猿的第二职业,聊聊我是怎么做的
  5. POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)
  6. 研发大佬组团带玩生成对抗网络(GAN),B站直播教学
  7. Java黑皮书课后题第6章:**6.3(回文整数)使用下面的方法头编写两个方法:……使用reverse方法实现isPalindrome。如果一个数字的逆序数和它自身相等,这个数就称为回文数。
  8. C++学习之路 | PTA乙级—— 1020 月饼 (25分)(带注释)(精简)
  9. rocketmq教程教程,JDK8 Stream 数据流效率分析
  10. 【LoadRunner技术讲座8】LoadRunner函数中的几个陷阱
  11. 常用算法大全-贪婪算法
  12. Android:单元测试InstrumentationTestRunner
  13. mysql sql长度限制_SQL限制– MySQL限制
  14. html中无序列表做成链接,Beautifulsoup从无序列表中提取文本和链接divulli(斯堪的纳维亚字符)...
  15. java反编译工具jd-gui下载与使用
  16. Dos命令入侵局域网电脑
  17. Java经典小案例(不定时更新)
  18. 中科视拓上榜2019人脸识别技术公司排行TOP 10
  19. usb计算机采集卡,关于usb视频采集卡 hdmi设置你可能不知道
  20. linux 查看内存地址 rw,如何查看Linux内存中的程序所有堆的地址

热门文章

  1. RabbitMQ报错NOT_ALLOWED - access to vhost ‘/‘ refused for user ‘zq‘(10, 40)
  2. python函数递归年龄_Python学习笔记4-递归函数
  3. 运维工程师是桥的护栏_桥梁专家:钢结构桥比混凝土桥易涡振 以后出现涡振可能性会提高...
  4. oracle10 监听日志,windows 清空oracle的监听日志listener.log
  5. keras 多层lstm_《Keras 实现 LSTM》笔记
  6. mysql 存储过程 无限分类,查看新闻/公告--[转帖]mysql存储过程实现的无限级分类,前序遍历树...
  7. golang 线程 Java线程_Golang 学习笔记(06)—— 多线程
  8. Centos 利用yum源安装 nginx 1.20.1
  9. 【javascript】数字相加
  10. linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件