微信小程序和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.pswp.cn/news/258470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258470.shtml
英文地址,請注明出處:http://en.pswp.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…