前端框架经历了十多年的竞争,包括JSP、jQuery、Ember、Angular、React、Vue、Solid、Svelte等。今天每个人都必须承认的一个事实是,在数百个前端框架中,最有影响力的只剩下两个,Vue和React。Vue进入3.x时代已经快2年了,而React也在今年3月29日发布了React18版本。今天就来聊聊2022年两者的区别吧,我们从头对比一下,看看谁更胜一筹。1、安装启动先从两个框架的安装开始。VueVue提供了VueCLI来创建Vue项目。安装命令如下:npminstall-g@vue/cli安装成功后可以查看版本确认安装成功。vue--version创建一个新项目,运行以下命令:vuecreateprojectcdprojectnpmrunserveReact创建React项目的工具是create-react-app,简称CRA。npminstall-gcreate-react-app创建一个新项目运行如下命令:npxcreate-react-appprojectcdprojectnpmrunstart结论两者在安装和启动项目方面几乎是一样的,打成平手。2.两个Props框架都是以组件为基础开发的,所以父子组件之间传值就成了问题。Props是将数据从父组件传递到子组件的关键技术。Vue在Vue中,道具以纯字符串形式传递。变量也可以通过v-bind指令传递,缩写为冒号(:)。父组件传值:子组件需要使用defineProps函数来访问props:{{title}}
React在React中,props变量在花括号中传递。父组件传值:子组件通过参数获取props:functionModal({isOpen,title}){return({isOpen&&
);}结语Vue在传递props的时候需要在property前面加上额外的说明。如果忘记添加指令,会导致传递字符串。React不是这种情况。Vue在子组件取值的时候需要调用defineProps函数,React通过函数的参数获取,这样比较自然。综合比较,Vue的精神负担更大,而React则更自然。React赢得了这一轮。3、EventVue使用模板语法,React使用JSX语法。所以写HTML有一个变化。但是我们还需要给元素添加鼠标事件,键盘事件等。事件处理也是必须的。VueVue通过v-on指令来处理事件,缩写为AT符号(@)。
ReactReact创建事件的方式和原生HTML几乎一样,区别绑定事件的属性名要求是驼峰式。functionNameAlert(){constdisplayName=()=>{//TODO}return(ShowName);}结论React更自然,Vue仍然需要额外的运算符,如果你忘记加运算符,会变成props传字符串,React没有这个问题。React赢得了这一轮。4.State两者都是数据驱动的响应式框架,因此状态管理成为关键问题。Vue在Vue中,状态是由ref或reactive创建的。两者的用法略有不同。ref用于处理基本类型的状态,而reactive通常处理引用类型的状态。使用ref状态时,需要通过ref.value访问状态。{{firstname}}
{{lastname}}
监视状态变化的方法是watch和watchEffect。两者的区别在于watchEffect一开始会运行一次。从'vue'导入{watch,watchEffect};watch(firstname,()=>alert('firstnamechanged!');watchEffect(lastname,()=>alert('lastnamechanged!');ReactReact使用useState从'react'创建state.import{useState};functionShowName(){const[firstName,setFirstName]=useState('张');const[lastName,setLastName]=useState('three');console.log(firstName,lastName);return()}React使用useEffectHook来监听状态变化。这个Hook接受一个回调函数和一个依赖数组。当依赖中的任何状态数组改变,会触发回调函数。从'React'导入{useEffect};useEffect(()=>{console.log('名字变了!');},[firstName,lastName]);结论Vue提供了多种方式,我们需要考虑在什么情况下使用哪种API,而React只提供了一种方式,但它也可以应对各种情况。综合比较,Vue的精神负担更高,React更简单。React赢得了这一轮。5.Ref虽然这两个框架都使用组件进行编程,但是我们还是不可避免地需要访问DOM,比如添加动画,控制输入框的焦点等等。为了解决这类问题,两个框架都提供了ref的概念,可以用来创建对DOM的引用。VueVue提供了一个refAPI。
ReactReact提供了useRefHook。但是要访问DOM,需要使用ref.current属性。import{useRef}from'react';functionMyName(){constname=useRef(null);handleBtnClick(()=>{name.current.focus();});return(开始输入)}结论差别不大,ping。6.双向数据绑定当我们使用input、select、textarea等元素时,输入值需要和状态同步。当状态改变时,元素的值也应该同步。此功能称为数据双向绑定。VueVue提供了v-model指令来创建双向绑定。ReactReact不提供此功能API是单独提供的,但我们也可以实现它。import{useState}from'react';functionMyComponent(){[searchQuery,setSearchQuery]=useState('');consthandleChange=(event)=>{setSearchQuery(event.target.value);}return();}结论从句法上讲,Vue更简洁。但这违背了单向数据流的原则,因为改变数据的方式不再只有一种。React的代码没有那么简洁,但更容易跟踪状态。这也是React和Vue在设计理念上的区别。在“让开发者少写代码”和“代码结构更清晰、更易维护”之间,Vue选择了前者,React选择了后者。至于谁好谁坏,个人更倾向于后者,但也有人更倾向于前者。因为这是一个取舍的问题,持平。7、动态渲染有时候我们的组件是根据一定的条件进行渲染的,这就是动态渲染。VueVue提供了三个指令:v-if、v-else和v-show。ReactReact没有为该函数提供任何API,而是使用原生的JavaScript条件语句、if、&&或三元运算符等。functionMyComponent(){return({isLoggedIn?Welcome
:Pleaselogin
}{!isLoggedIn&&});}结论Vue的语法是在元素上添加特殊属性,而React的语法是纯JavaScript。从语法上讲,没有太大区别。但是Vue会有额外的学习成本。整体来说,这一轮React略胜一筹。8.渲染子组件有时我们需要将子组件传递给组件中的其他组件一起渲染。VueVue提供了slots来传递子组件。容器组件:Welcome
父组件:Welcometomywebsite
ReactReact的子组件是props上的一个属性:children。容器组件:functionModal({children}){return(Welcome
{children});}父组件:functionUserPage(){return(Welcometomywebsite
);}结论从上面的例子中看不出明显的差距两者之间太大了。但在更复杂的情况下,比如传递N个子组件。React可以通过属性传递,操作组件和操作变量一样;Vue有namedslots、slotdynamicnames、scopedslots等概念,操作繁琐,精神负担大。React赢得了这一轮。总结通过这篇文章,我比较了两个框架中的大部分概念和语法。每个都有自己的优势。很难说哪个更好。2016年左右第一次对比两者的时候,感觉差距挺大的。那时候的React还处于类组件时代,通过this.setState来更新状态,组件也有很多复杂的生命。循环。Vue还处在OptionsAPI时代,不是很好用,比如this的问题;数据必须传递一个函数,然后返回一个对象;一切都要定义,使用组件必须定义,使用事件必须定义……再来看今天的React和Vue,似乎是朝着同一个方向发展的,越来越像了。虽然有相互借鉴的成分,但是从几年前就有质疑的声音,说Vue抄袭了React。尤其是Vue3推出了CompositionAPI之后,越来越像React了。甚至有人说Vue3的代号是OnePiece,比喻从React偷了很多东西。你认为呢?