微信小程序和vue双向绑定哪里不一样_个人理解Vue和React区别

a114a9ca528e3157f5e2891215b82a20.gif

fdf8cf7ced5a48f5cff7aa660836f4be.png

本文转载自掘金,作者:binbinsilk,

监听数据变化的实现原理不同

  • Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的优化就能达到很好的性能

  • React 默认是通过比较引用的方式进行的,如果不优化(PureComponent/shouldComponentUpdate)可能导致大量不必要的VDOM的重新渲染

为什么 React 不精确监听数据变化呢?这是因为 Vue 和 React 设计理念上的区别,Vue 使用的是可变数据,而React更强调数据的不可变。所以应该说没有好坏之分,Vue更加简单,而React构建大型应用的时候更加鲁棒。

因为一般都会用一个数据层的框架比如 Vuex 和 Redux,所以这部分不作过多解释,在最后的 vuex 和 redux的区别 中也会讲到。

数据流的不同

343ff5d7a8c8750e5db6c35befbd84ea.png

大家都知道Vue中默认是支持双向绑定的。在Vue1.0中我们可以实现两种双向绑定:

  • 父子组件之间,props 可以双向绑定

  • 组件与DOM之间可以通过 v-model 双向绑定

在 Vue2.x 中去掉了第一种,也就是父子组件之间不能双向绑定了(但是提供了一个语法糖自动帮你通过事件的方式修改),并且 Vue2.x 已经不鼓励组件对自己的 props 进行任何修改了。

所以现在我们只有 组件 ↔ DOM 之间的双向绑定这一种。

然而 React 从诞生之初就不支持双向绑定,React一直提倡的是单向数据流,他称之为 onChange/setState()模式。

不过由于我们一般都会用 Vuex 以及 Redux 等单向数据流的状态管理框架,因此很多时候我们感受不到这一点的区别了。

HoC 和 mixins

在 Vue 中我们组合不同功能的方式是通过 mixin,而在React中我们通过 HoC (高阶组件)。

React 最早也是使用 mixins 的,不过后来他们觉得这种方式对组件侵入太强会导致很多问题,就弃用了 mixinx 转而使用 HoC,关于mixin究竟哪里不好,可以参考React官方的这篇文章 Mixins Considered Harmful

而 Vue 一直是使用 mixin 来实现的。

为什么 Vue 不采用 HoC 的方式来实现呢?

高阶组件本质就是高阶函数,React 的组件是一个纯粹的函数,所以高阶函数对React来说非常简单。

但是Vue就不行了,Vue中组件是一个被包装的函数,并不简单的就是我们定义组件的时候传入的对象或者函数。比如我们定义的模板怎么被编译的?比如声明的props怎么接收到的?这些都是vue创建组件实例的时候隐式干的事。由于vue默默帮我们做了这么多事,所以我们自己如果直接把组件的声明包装一下,返回一个高阶组件,那么这个被包装的组件就无法正常工作了。

组件通信的区别

b38dd4dcd5fba24e4fe6cce4217d906b.png

其实这部分两个比较相似。

在Vue 中有三种方式可以实现组件通信:

  • 父组件通过 props 向子组件传递数据或者回调,虽然可以传递回调,但是我们一般只传数据,而通过 事件的机制来处理子组件向父组件的通信

  • 子组件通过 事件 向父组件发送消息

  • 通过 V2.2.0 中新增的 provide/inject来实现父组件向子组件注入数据,可以跨越多个层级。

另外有一些比如访问 $parent/$children等比较dirty的方式这里就不讲了。

在 React 中,也有对应的三种方式:

  • 父组件通过 props 可以向子组件传递数据或者回调

  • 可以通过 context 进行跨层级的通信,这其实和 provide/inject 起到的作用差不多。

可以看到,React 本身并不支持自定义事件,Vue中子组件向父组件传递消息有两种方式:事件和回调函数,而且Vue更倾向于使用事件。但是在 React 中我们都是使用回调函数的,这可能是他们二者最大的区别。

模板渲染方式的不同

在表层上, 模板的语法不同

  • React 是通过JSX渲染模板

  • 而Vue是通过一种拓展的HTML语法进行渲染

但其实这只是表面现象,毕竟React并不必须依赖JSX。

在深层上,模板的原理不同,这才是他们的本质区别:

  • React是在组件JS代码中,通过原生JS实现模板中的常见语法,比如插值,条件,循环等,都是通过JS语法实现的

  • Vue是在和组件JS代码分离的单独的模板中,通过指令来实现的,比如条件语句就需要 v-if 来实现

对这一点,我个人比较喜欢React的做法,因为他更加纯粹更加原生,而Vue的做法显得有些独特,会把HTML弄得很乱。举个例子,说明React的好处:

react中render函数是支持闭包特性的,所以我们import的组件在render中可以直接调用。但是在Vue中,由于模板中使用的数据都必须挂在 this 上进行一次中转,所以我们import 一个组件完了之后,还需要在 components 中再声明下,这样显然是很奇怪但又不得不这样的做法。

Vuex 和 Redux 的区别

从表面上来说,store 注入和使用方式有一些区别。

在 Vuex 中,$store 被直接注入到了组件实例中,因此可以比较灵活的使用:

  • 使用 dispatch 和 commit 提交更新

  • 通过 mapState 或者直接通过 this.$store 来读取数据

在 Redux 中,我们每一个组件都需要显示的用 connect 把需要的 props 和 dispatch 连接起来。

另外 Vuex 更加灵活一些,组件中既可以 dispatch action 也可以 commit updates,而 Redux 中只能进行 dispatch,并不能直接调用 reducer 进行修改。

从实现原理上来说,最大的区别是两点:

  • Redux 使用的是不可变数据,而Vuex的数据是可变的。Redux每次都是用新的state替换旧的state,而Vuex是直接修改

  • Redux 在检测数据变化的时候,是通过 diff 的方式比较差异的,而Vuex其实和Vue的原理一样,是通过 getter/setter来比较的(如果看Vuex源码会知道,其实他内部直接创建一个Vue实例用来跟踪数据变化)

而这两点的区别,其实也是因为 React 和 Vue的设计理念上的区别。React更偏向于构建稳定大型的应用,非常的科班化。相比之下,Vue更偏向于简单迅速的解决问题,更灵活,不那么严格遵循条条框框。因此也会给人一种大型项目用React,小型项目用 Vue 的感觉。

cbcdfdd1f05f16f4b8a1b61865da1eaf.gif

———END———

你可能还想看

cb4b64b481a98380fed894d6033fa56e.png4ea76581686e1401517cab01963eb648.png9b25a886250201a1c66bb4327b3e8b5d.png

关注我们

获取更多信息

016e16dd859fdd6f0a9b1b3013c8ca3f.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS 省,市,区

1 // 纯JS省市区三级联动2 // 2011-11-30 by http://www.cnblogs.com/zjfree3 var addressInit function (_cmbProvince, _cmbCity, _cmbArea, defaultProvince, defaultCity, defaultArea) {4 var cmbProvince document.getElementById(_cmbProvince);5 var cmbCity…

使用极链/AutoDL云服务器复盘caffe安装

继上一次倒腾caffe安装以后,因为博士毕业等原因,旧的服务器已经不能再使用,最近因论文等原因,不得不继续来安装一下我的caffe。这次运气比较好,经历了一晚上和一早上的痛苦之后,最终安装成功了,…

ibatis中使用List作为传入参数的使用方法及 CDATA使用

ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用: (List)getSqlMapClientTemplate().queryForList("sqlName", paraName); 并经类型转换即可,做入参还需要稍微调整下,本文主要讲list做入参碰到的几…

Samba服务

####################samba####################1.samba作用提供cifs协议实现共享文件2.安装yum install samba samba-common samba-client -ysystemctl start smb nmbsystemctl enable smb nmb3.添加smb用户smb用户必须是本机用户[rootlocalhost ~]# smbpasswd -a student New…

wpf 窗口的返回值_WPF Tips: Window.ShowDialog() 返回 true

Window.ShowDialog() 返回值为bool?。希望在窗口点击OK时返回True。解决方法:ShowDialog()的注释为:// Returns:// A System.Nullable value of type System.Boolean that specifies whether// the activity was accepted (true) or canceled (false). …

CodeForces 543D 树形DP Road Improvement

题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数。 对于n个所有可能的x,输出n个答案。 分析&am…

理解Javascritp中的引用

Author: bugall Wechat: bugallF Email: 769088641qq.com Github: https://github.com/bugall一: 函数中的引用传递 我们看下下面的代码的正确输出是什么 function changeStuff(a, b, c) {a a * 10;b.item "changed";c {item: "changed"}; …

通过扩展改善ASP.NET MVC的验证机制[实现篇]

通过扩展改善ASP.NET MVC的验证机制[实现篇] 原文:通过扩展改善ASP.NET MVC的验证机制[实现篇]在《使用篇》中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离、多语言的支持和多验证规则的支持,我们现在来看…

canopen和1939区别_CAN 和 CANopen的区别和联系

1、CAN与CANopen的共同点与不同点:CAN只定义了物理层与链路层,而没有定义用户层,用户可根据自己的需要定义一些网络上的通信约定; CANopen是在CAN的基础上定义了用户层,即规定了用户、软件、网络终端等之间用来进行信…

ONOS系统架构演进,实现高可用性解决方案

上一篇文章《ONOS高可用性和可扩展性实现初探》讲到了ONOS系统架构在高可用、可扩展方面技术概况,提到了系统在分布式集群中怎样保证数据的一致性。在数据终于一致性方面,ONOS採用了Gossip协议。这一部分的变化不大,而在强一致性方案的选择方…

Struts2_day01

Java Web开发常用框架 SSH(Struts2 Spring Hibernate)SSM(Struts2 Spring MyBatis)SSI(Struts2 Spring iBatis) 多种框架协同工作 Web层 -- Service层 -- Dao层 Struts2框架: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MV…

使用 python 开发 Web Service

使用 python 开发 Web Service Python 是一种强大的面向对象脚本语言,用 python 开发应用程序往往十分快捷,非常适用于开发时间要求苛刻的原型产品。使用 python 开发 web service 同样有语言本身的简捷高速的特点,能使您快速地提供新的网络服…

python中输出n开始的5个奇数_送你99道Python经典练习题,练完直接上手做项目,免费送了来拿吧...

学python没练习题怎么行、今天,给大家准备一个项目: 99道编程练习,这些题如果能坚持每天至少完成一道,一定可以帮大家轻松 get Python 的编程技能。目前,这个项目已经获得了 2924 Stars,2468 Forks。首先&a…

java 基础5

一、 什么是数组及其作用? 定义:具有相同数据类型的一个集合 作用:存储连续的具有相同类型的数据 二、 java中如何声明和定义数组 2.1 声明和定义的语法: 数据类型[ ] 数组名;( int[ ] nums ; ) 或 数…

TFS(Team Foundation Server)介绍和入门

在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的。 作为一名软件开发者,在我的职业生涯中,我常常会用到支持软件开发过程的大量开发工具&#x…

逆函数求导公式_反函数求导法则

反函数的求导法则是:反函数的导数是原函数导数的倒数。例题:求yarcsinx的导函数。首先,函数yarcsinx的反函数为xsiny,所以:y‘1/sin’y1/cosy,因为xsiny,所以cosy√1-x2,所以y‘1/√…

SpringXML方式配置bean的懒加载lazy-init

lazy-init&#xff08;懒加载&#xff09;&#xff0c;表示该bean在容器初始化的时候不进行初始化。例如&#xff1a;<bean name"role1" class"com.fz.entity.Role" lazy-init"true">以上配置表示&#xff1a;spring容器在初始化的时候不会…

windows下system函数的使用

system函数 是可以调用一些DOS命令,比如system("cls");//清屏,等于在DOS上使用cls命令写可执行文件路径&#xff0c;可以运行它 下面列出常用的DOS命令,都可以用system函数调用: ASSOC 显示或修改文件扩展名关联。AT 计划在计算机上运行的命令和程序。ATTRIB 显示或更…

WWDC2017 笔记 - Cocoa Touch 中的新特性

这篇文章是 What’s New in Cocoa Touch / UIKit Session 201 的一些整理。【基于OC】 转自我的 Blog: Dannys Dream Drag Drop 新的交互方式 拖拽 Drag 需要 Drag 的对象要 add 一个 UIDragInteraction &#xff0c;用法类似于 UIGestureRecognizer 。UIDragInteraction 有一个…

[Hadoop] - 自定义Mapreduce InputFormatOutputFormat

在MR程序的开发过程中&#xff0c;经常会遇到输入数据不是HDFS或者数据输出目的地不是HDFS的&#xff0c;MapReduce的设计已经考虑到这种情况&#xff0c;它为我们提供了两个组建&#xff0c;只需要我们自定义适合的InputFormat和OutputFormat&#xff0c;就可以完成这个需求&a…