网站首页 > 技术文章 正文
在一些情况下,我们可能会需要对一个 prop (父子组件传递数据的属性) 进行“双向绑定”。当一个子组件改变了一个带 .sync 的prop的值时,这个变化也会同步到父组件中所绑定的值。这很方便,但也会导致问题,因为它破坏了单向数据流。(数据自上而下流,事件自下而上走)。
例如:
<child :foo.sync=”msg”></child>
就会被扩展为:
<child :foo=”bar” @update:foo=”val => bar = val”>
当子组件需要更新 foo 的值的时候,他需要显式的触发一个更新事件:
this.$emit( “update:foo”, newValue );
案例:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>.sync的用法</title> <style type="text/css"> .hello { padding: 30px 20px 30px 5px; border: 1px solid #ddd; margin-bottom: 10px; } </style> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="demo"> <child :show.sync='valueChild'></child> <!-- <child :show='valueChild' @update:show="update"></child> --> <button @click="changeValue">toggle</button> </div> <script type="text/javascript"> var child = { props: ['show'], template: `<div v-if="show" class="hello"> <p>默认初始值是{{show}},所以是显示的</p> <button @click.stop="closeDiv">关闭</button> </div>`, methods: { closeDiv() { //上面注释部分@update:show被.sync隐藏掉了,但子组件仍需要显式触发 this.$emit('update:show', false); } } } var vm = new Vue({ el: "#demo", data: { valueChild: true, }, components: { child }, methods: { changeValue() { this.valueChild = !this.valueChild }, // update(val) { // this.valueChild = val // } } }) </script> </body> </html>
1.单向数据:点击toggle的时候是父组件修改了自身数据valueChild,然后通过prop即show属性,单项传递给子组件child,使得v-if="show"控制显示与隐藏。
2.双向数据:点击关闭的时候,子组件触发事件'update:show',并传参数false,父组件监听到@update:show,执行回调函数update(自定义,当然直接写js到模板中可能更简洁),然后修改父组件数据valueChild,继续上述1的步骤。
欢迎关注
猜你喜欢
- 2024-10-12 学习Vue的数据绑定语法,实现动态的用户界面(四)
- 2024-10-12 Vue前端框架:绑定单个复选框。 vue复选框默认选中
- 2024-10-12 vue2响应式原理 vue2.0响应式原理
- 2024-10-12 vue数据绑定语法 vue样式绑定语法
- 2024-10-12 【Vue】第5章 Vue数据绑定和计算属性详解
- 2024-10-12 Vue数据及事件绑定、filter过滤器
- 2024-10-12 Vue开发:组件绑定自定义事件及其应用
- 2024-10-12 vue.js实战之表单绑定-单选按钮 vue表格单选
- 2024-10-12 跟神一起学前端-初识vue、数据绑定
- 2024-10-12 vue.js 动态绑定class的几种方式 vue动态绑定类
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)