• 技术文章 >web前端 >Vue.js

    了解vue中的单项数据流和双向数据绑定,两种冲突吗?

    青灯夜游青灯夜游2022-04-14 21:17:58转载261
    本篇文章带大家了解一下vue中的单项数据流和双向数据绑定,分析一下Vue的双向绑定和单向数据流冲突吗?希望对大家有所帮助!

    众所周知,Vue中更加推荐单向数据流的状态管理模式(比如Vuex),但Vue同时支持通过v-model实现双向数据绑定。(学习视频分享:vuejs教程

    那么问题来了,单项数据流和双向数据绑定的概念,这两种不是相互冲突的吗?即然能用v-model双向数据绑定,不应该就是双向数据流了吗?

    本文主要包括以下内容

    单向绑定 vs 双向绑定

    单双向绑定,指的是View层和Model层之间的映射关系。

    react采取单向绑定,如图所示:

    1.png

    React中,当View层发生更改时,用户通过发出Actions进行处理,Actions中通过setStateState进行更新,State更新后触发View更新。可以看出,View层不能直接修改State,必须要通过Actions来进行操作,这样更加清晰可控

    单向绑定的方式的优点在于清晰可控,缺点则在于会有一些模板代码,Vue则同时支持单向绑定和双向绑定

    实际上v-model只是v-bind:valuev-on:input的语法糖,我们也可以采取类似react的单向绑定。两者各有利弊,单向绑定清晰可控,但是模板代码过多,双向绑定可以简化开发,但是也会导致数据变化不透明,优缺点共存,大家可以根据情况使用。

    单向数据流 vs 双向数据流

    数据流指的是组件之间的数据流动。

    VueReact都是单向数据流的模型,虽然vue有双向绑定v-model,但是vuereact父子组件之间数据传递,仍然还是遵循单向数据流的,父组件可以向子组件传递props,但是子组件不能修改父组件传递来的props,子组件只能通过事件通知父组件进行数据更改,如图所示:

    2.png

    通过单向数据流的模型,所有状态的改变可记录、可跟踪,相比于双向数据流可加容易维护与定位问题

    为什么说v-model只是语法糖

    你可以用 v-model 指令在表单 <input><textarea><select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理

    正如上面所述,Vue文档中说v-model只是语法糖

    <input v-model=“phoneInfo.phone”/>
    
    //在组件中使用时,实际相当于下面的简写
    <input :value="PhoneInfo.phone" @input="val => { PhoneInfo.phone = val }"

    那么问题来了,为什么说v-model不是真正的双向数据流呢?按照这道理,是不是可以认为model->view的单向数据流也是语法糖啊,也是vue作者通过一定方法实现的而已

    真正的原因上面已经说了,数据绑定是ViewModel之间的映射关系,数据流指的是组件之间的数据流动

    v-model不是真正的双向数据流,是因为它不能直接修改父组件的值,比如你在v-model中绑定props中的值是会报错的,它只能绑定组件的值

    而真正的双向数据流,比如AngularJs,是允许在子组件中直接更新父组件的值的,这就是为什么说v-model只是语法糖的原因

    总结

    总得来说,单双向数据绑定与数据流是两个不同维度的概念,数据绑定是ViewModel之间的映射关系,数据流指的是组件之间的数据流动。因此,单向数据流也可有双向绑定,双向数据流也可以有双向绑定,两者不应该混为一谈

    3.png

    本文转载自:https://juejin.cn/post/7085139499767840782

    作者:程序员江同学

    (学习视频分享:web前端开发编程入门

    以上就是了解vue中的单项数据流和双向数据绑定,两种冲突吗?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    上一篇:Vue3计算属性是如何实现的?聊聊实现原理 下一篇:手把手带你使用Vue + Laravel开发一个简单的 CRUD 应用
    Web大前端开发直播班

    相关文章推荐

    • 什么是单元测试?Vue 组件怎么进行单元测试?• 记录一个使用Vue 3开发Fimga插件的过程• react项目中如何运行vue组件?方法介绍• Vue.js中如何优化性能?9个小技巧分享• Vue3计算属性是如何实现的?聊聊实现原理

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网