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. CLI命令行应用

    前言 针对golang这门高级语言,主要想了解它的语言特性还有服务器建站还有微服务搭建方面的用途,以下都可以算是使用记录. 一.命令行应用的标准库实现 很多语言都有针对命令行参数的功能包,比如pyth ...

  2. STM32 DMA中的DMA_BufferSize和DMA_MemoryDataSize   

    示例代码1 采集2通道ADC数据 查看代码 extern uint16_t ADC3ConvertedValue[2]; /* DMA2 Stream0 channel2 配置 *********** ...

  3. Mono GC

    1.虽然是stw但mark阶段可以concurrent 2.并行mark就需要写屏障 3.unity的gc也不是扫描整个堆内存 https://schani.wordpress.com/2012/12 ...

  4. Spring的基础结构和核心接口

    目录 1.BeanDefinition 2.BeanDefinitionReader 3.BeanDefinitionRegistry 4.BeanFactory 5.ApplicationConte ...

  5. 【笔记】Python3|(一)Python 申请并调用国内百度、阿里、腾讯、有道的翻译 API 的教程和测试情况(第三方库 translate 和 腾讯 API 篇)

    var code = "dccf4c95-7458-4b38-b8ae-d45b3e59c218" 价格和 API 申请参考: 免费翻译接口最新最全汇总(百度翻译,腾讯翻译,谷歌翻 ...

  6. 【代码】Android|获取存储权限并创建、存储文件

    版本:Android 11及以上,gradle 7.0以上,Android SDK > 29 获取存储权限 获取存储权限参考:Android 11 外部存储权限适配指南及方案,这篇文章直接翻到最 ...

  7. P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解

    题意: 给定一个长度为 \(n=2^k\) 的数组 \(a\),下标从 \(0\) 开始,维护 \(m\) 次操作: 给定 \(x\),设数列 \(a'\) 满足 \(a'_i=a_{i\oplus ...

  8. 一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库

    前言 今天大姚给大家分享一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库:Bootstrap Blazor. 项目介绍 BootstrapBlazor 是一套基于 Boot ...

  9. C#之BitConverter.ToInt16

    byte[] bytes = { 1,3 }; short s = BitConverter.ToInt16(bytes,0); Console.WriteLine(s); 从低位到高位填充: 000 ...

  10. Possible data inputs to DataFrame constructor

    Possible data inputs to DataFrame constructor: import pandas as pd import numpy as np (1) 2D ndarray ...