vue支持双向数据流吗?
除了最开始angularJs支持数据的双向流动之外,其他两大框架是均不支持的
vue之所以被常说数据流,其实是错误的。是因为它是双向绑定被有些人理解为双向数据流。
如果发现了一下的错误信息,那就是你违反了不能双向数据流的规定
vue.runtime.esm.js?2b0e:619 [Vue warn]:
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders.
Instead, use a data or computed property based on the prop's value. Prop being mutated: "userName"

双向数据流的利弊
首先肯定,弊肯定是大于利的,不然vue直接就支持‘双向数据流’了。
弊端是数据流动不可追踪,无法保证数据源的唯一性,一旦出现问题很难找到错误的位置。
优点是有的时候,在某些特定的场景下,会很方便。比如封装的弹窗显隐控制,表单数据等。

vue如何使用双向数据流
1、props传入引用类型
vue检测props只能检测基本类型的值,而对于复合类型(即对象),只能检测引用地址有没有变化,而属性值变化,不会被加测到。
利用这一特性,我们可以偷偷的绕过“props是只读的”这一检测,来达到“双向数据流”目的。
子组件

<template>
<div class="hello">
姓名:<input type="text" v-model="formData.name"><br/>
年龄:<input type="text" v-model="formData.age">
</div>
</template>
<script>
export default {
name: 'userInfo',
props: {
formData: Object
}
}
</script>

父组件

<template>
<div id="app">
<user-info :formData="userInfoForm"/>
<button @click="getUserInfoForm">提交</button>
</div>
</template>
<script>
import UserInfo from './components/user-info.vue'; // 用户信息表单 export default {
name: 'app',
components: { UserInfo },
data(){return{
userInfoForm:{
name:'小丁',
age: 20
}
}},
methods:{
getUserInfoForm(){
console.log(this.userInfoForm);
}
}
}
</script>

效果图

2.利用.async来支持双向数据流(原自定组件使用v-model)
父组件

<template>
<div class="hello">
姓名:<input type="text" :value="userName" @input="userNameChange"><br/>
</div>
</template>
<script>
export default {
name: 'userInfo',
props: {
userName: String
},
methods:{
userNameChange(e){
// 会直接修改父组件的数据
this.$emit('update:userName', e.target.value)
}
} }
</script>

子组件

<template>
<div class="hello">
姓名:<input type="text" :value="userName" @input="userNameChange"><br/>
</div>
</template>
<script>
export default {
name: 'userInfo',
props: {
userName: String
},
methods:{
userNameChange(e){
// 会直接修改父组件的数据
this.$emit('update:userName', e.target.value)
}
}
}
</script>

原理

<user-info :userName.sync="userNameVal"/>
<!-- 会被扩展为: -->
<user-info :userName="userNameVal" @update:userName="val => userNameVal = val"/> 当子组件需要更新 userName 的值时,它需要显式地触发一个更新事件:
this.$emit('update:userName', newValue)

vue双向数据流的更多相关文章

  1. vue 单向数据流 & 双向绑定

    在react中是单向数据绑定,而在vue中的特色是双向数据绑定.但是其实就我个人的理解是: 其实无论是vue还是react其实还是提倡单向数据流去管理状态,这一点在vuex和redux状态管理器上体现 ...

  2. Vue.js实现数据的双向数据流

    众所周知,Vue.js一直使用的是单向数据流的,和angularJs的双向数据流相比,单向数据流更加容易控制.Vue.js允许父组件通过props属性传递数据到子组件.但是有些情况下我们需要在子组件里 ...

  3. react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)

    第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能) #课程目标 理解因为react的单向数据流 理解表单组件会因为react数据流变的不好维护 理解受控组件与非受控组件的实质区别 理解 ...

  4. 单向绑定vs双向绑定、单向数据流vs双向数据流

    参考文章:http://www.qb5200.com/article/482839.html 单双向绑定指的是View层跟Model层之间的映射关系 单向绑定vs双向绑定 react采用单向绑定,vu ...

  5. vue双向绑定的原理及实现双向绑定MVVM源码分析

    vue双向绑定的原理及实现双向绑定MVVM源码分析 双向数据绑定的原理是:可以将对象的属性绑定到UI,具体的说,我们有一个对象,该对象有一个name属性,当我们给这个对象name属性赋新值的时候,新值 ...

  6. vue 双向数据绑定的实现学习(二)- 监听器的实现

    废话:上一篇https://www.cnblogs.com/adouwt/p/9928278.html 提到了vue实现的基本实现原理:Object.defineProperty() -数据劫持 和  ...

  7. vue 双向数据绑定的实现学习(一)

    前言:本系列学习笔记从以下几个点展开 什么是双向数据绑定 双向数据绑定的好处 怎么实现双向数据绑定 实现双向数据数据绑定需要哪些知识点 数据劫持 发布订阅模式 先看看我们要实现的目标是什么,如下动图: ...

  8. IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题

    先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...

  9. Vue双向绑定原理,教你一步一步实现双向绑定

    当今前端天下以 Angular.React.vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋. 所以我们要时刻保持好奇心,拥抱变化,只有在不断的变 ...

  10. 梳理vue双向绑定的实现原理

    Vue 采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后 ...

随机推荐

  1. 【Java异步编程利器】CompletableFuture完全指南

    Java异步编程利器:CompletableFuture完全指南 图:传统同步 vs 异步编程模式对比 一.为什么需要异步编程? 同步 vs 异步的餐厅点餐比喻 同步方式 异步方式 顾客站在柜台前等待 ...

  2. Rubymine搭建Ruby开发环境

    1.下载和安装Ruby 下载链接:https://rubyinstaller.org/downloads/ 安装示意图: 注意勾选图示的两个选项 安装完成后在cmd窗口运行:ruby -v命令显示当前 ...

  3. Redis 分布式锁的正确实现原理演化历程与 Redission的源码

    当线程A,加锁并设置过期时间-->执行业务-->判断锁id完成后,但这时CPU线程调度其它工作了在这里卡住了, 而且也到了锁的过期时间了被动被删除,当线程B,加锁并设置过期时间--> ...

  4. 如何处理 MySQL 的主从同步延迟?

    如何处理 MySQL 的主从同步延迟? MySQL 的主从同步延迟通常是由主库与从库之间的网络延迟.从库的处理能力.主库的写操作量等因素导致的.长时间的同步延迟可能会影响系统的稳定性和数据一致性.以下 ...

  5. async/await Task.Delay 和Thread.Sleep的理解

    async/await Task.Delay 和Thread.Sleep的理解 相关学习资料: 第十七节:从状态机的角度async和await的实现原理(新) - Yaopengfei - 博客园 ( ...

  6. Python3_模块(一)

    脚本是用 python解释器来编程,如果从 Python解释器退出再进入,那么你定义的所有的方法和变量就都消失了.为此 Python提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器 ...

  7. 【Linux】Linux内核模块开发

    Linux内核模块开发 零.关于 1.概述 最近在学习Linux相关的东西,学习了U-Boot的编译,Linux的编译,能够在开发板上运行自己编译的U-Boot和Linux了,那么接下来就是在自己编译 ...

  8. Java编程--抽象类和接口的区别

    No. 区别 抽象类 接口 1 关键字 abstract class interface 2 组成 构造方法.普通方法.抽象方法.static方法.常量.变量 抽象方法.全局常量 3 子类使用 cla ...

  9. heapdump敏感信息提取工具-JDumpSpider(一) ,附下载链接

    ​ 介绍 HeapDump敏感信息提取工具 在日常得渗透测试工作中,经常遇到spring actuator未授权漏洞,而且在实际过程中也常常会下载到heapdump这个文件.了解过这个文件的人知道,H ...

  10. 【记录】日常|shandianchengzi的三周年创作纪念日

    机缘   接触 CSDN 之前,我已经倒腾过 hexo 搭建 github 博客.本地博客.图床:   接触 CSDN 之后,我还倒腾过纸质笔记.gitee 博客.博客园.知乎.b站.Notion.腾 ...