当前位置: 首页 > Web前端 > HTML5

使用React和Vue创建相同的应用程序,有什么区别?

时间:2023-04-04 23:31:36 HTML5

众所周知,Vue和React是目前非常有名的前端框架。我在工作中经常使用Vue,所以我对它有很深的了解。同时,我也对React充满了好奇,想要学习和一探究竟。所以我阅读了React文档并观看了一些视频教程,虽然材料很好,但我真正想了解的是React和Vue之间的区别。至于“区别”,我并不想知道它们是否都具有虚拟DOMS或者它们是如何渲染页面的,但我希望有人能从代码的角度解释一下两者之间的区别。我想找一篇解释这些差异的文章,以便Vue或React的初学者可以更好地理解两者之间的差异。不幸的是,我没有找到这样的文章。所以我意识到我必须自己来比较Vue和React之间的异同。在自学的过程中,我用这篇文章来记录一下具体的过程。1.目标我将构建一个标准的待办事项列表应用程序,允许用户在列表中添加和删除项目。这两个应用程序都是使用默认的CLI(命令行界面,命令行界面)构建的,React使用create-react-app,Vue使用vue-cli。这两个应用程序的外观如下:两个应用程序的CSS代码几乎相同,但代码的位置有所不同。考虑到这一点,让我们看一下这两个应用程序的文件结构:您会发现它们的结构几乎完全相同。唯一的区别是ReactApp有三个CSS文件,而VueApp没有CSS文件。这是因为React的create-react-app组件需要一个附带的文件来保存它的样式,而VueCLI采用包罗万象的方法,在实际的组件文件中声明样式。两种不同的策略得到的结果是一样的。相信开发者很快就能掌握这两种不同的策略。开发人员可以根据自己的喜好做出选择,您会在开发社区中听到很多关于如何构建CSS的讨论。上面,我们列出了两个CLI之后的代码结构。在我们继续之前,让我们快速浏览一下典型的Vue和React组件的样子:左边是Vue,右边是React现在让我们开始深入了解它的细节!2.如何修改数据首先,我们需要了解“修改数据”是什么意思。听起来很学术,其实很简单,就是把我们存储的数据改一下。比如我们要把一个人的姓名变量从“Jhon”改成“Mark”,就需要执行“修改数据”操作。在这一点上,React和Vue处理事情的方式不同。Vue本质上创建了一个数据对象,数据可以在其中自由更改;React创建一个状态对象,其中更改数据需要一些额外的工作。React有其自身要求额外操作的原因,我将在稍后讨论。在此之前,我们先了解一下Vue中的数据对象和React中的状态对象:Vue数据对象React状态对象从图中可以看出,我们传入的是相同的数据,只是标记不同而已。所以将初始数据传递给组件的方式非常相似。但是正如我们提到的,两个框架中更改数据的方式是不同的。假设我们有一个名为name:'Sunil'的数据元素。在Vue中,我们通过调用this.name来引用它。我们也可以通过调用this.name='John'来更新它。就这样,名字成功改成了“Jhon”。在React中,我们通过调用this.state.name来引用同一块数据。现在关键的区别是我们不能简单地写this.state.name='John'因为React有限制阻止这种简单的修改。在React中,我们需要这样写:this.setState({name:'John'})。虽然这与我们在Vue中实现的结果基本相同,但React的操作更加繁琐,这是因为Vue每次更新数据时默认都会编写自己版本的setState。简单的说,React需要setState,然后更新它的内部数据,而对于Vue来说,当你更新一个数据对象的值时,它默认是你的改变意图。那么为什么React不做简化,为什么它需要setState?RevanthKumar解释说:“这是因为React希望在状态改变时重新运行某些生命周期钩子,如componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate。当您调用setState函数时,它知道状态已更改。如果你直接改变状态,React将不得不做更多的工作来跟踪变化、运行生命周期钩子等。所以为了简单起见,React使用setState。"现在我们知道了如何更改数据,让我们看看如何向待办应用程序添加新项目。3.添加新的待办事项。React的实现方法createNewToDoItem=()=>{this.setState(({list,todo})=>({list:[...list,{todo}],todo:''}));};在React中,我们的输入字段有一个名为value的属性。使用几个函数自动更新绑定在一起以创建双向绑定。我们通过将onChange事件侦听器附加到输入字段来创建这种双向绑定形式。查看代码以了解:只要输入字段的值发生变化,handleInput函数就会运行。它通过将状态对象设置为Anything来更新状态对象内的待办事项。handleInput函数如下:handleInput=e=>{this.setState({todo:e.target.value});};现在每当用户按下页面上的+按钮添加新项目时,createNewToDoItem函数将运行this.setState并传递给它一个函数。该函数有两个参数,第一个是来自状态对象的整个列表数组,第二个是handleInput函数更新的待办事项。然后该函数返回一个新对象,该对象包含之前的整个列表,最后添加了todo。整个列表是使用扩展运算符添加的。最后,我们将todo设置为一个空字符串,它会自动更新输入字段值。Vue的实现方法createNewToDoItem(){this.list.push({{'todo':this.todo});this.todo='';}在Vue中,我们有一个名为v-modelhandle的输入字段。这实现了**双向绑定。输入域代码如下:V-Model将输入域的内容绑定到名为toDoItem的数据对象的key上。当页面加载时,我们将toDoItem设置为一个空字符串,例如:todo:''。如果数据已经存在,比如todo:'addtextat',输入框会加载addtextat的输入内容。无论如何,将其保留为空字符串,我们在输入字段中键入的任何文本都将绑定到待办事项。这实际上是一种双向绑定(输入字段可以更新数据对象,数据对象可以更新输入字段)。所以,回顾之前的createNewToDoItem()代码块,我们将todo的内容存储在一个列表数组中,然后将todo改为空字符串。4.删除待办事项React实现方法deleteItem=indexToDelete=>{this.setState(({list})=>({list:list.filter((toDo,index)=>index!==indexToDelete)}));};虽然deleteItem函数存在于ToDo.js文件中,但也很容易从ToDoItem.js文件中引用它,将deleteItem()函数作为prop传递给:这会将函数传递给子组件,使其可访问。我们绑定它并传递关键参数。当用户单击删除项目时,该函数使用键来区分用户单击的是哪个ToDoItem。然后,在ToDoItem组件内部,我们执行以下操作:这个.props.deleteItem就可以了。Vue的实现方法onDeleteItem(todo){this.list=this.list.filter(item=>item!==todo);}Vue的实现方法略有不同,我们需要做以下三点:第一步:首先,在元素上调用函数:-

步骤2:然后我们必须创建一个emit函数作为子组件的内部方法(本例中的ToDoItem.vue),如下:deleteItem(todo){this.$emit('delete',todo)}第三步:之后你会发现,当我们添加ToDo.vue的ToDoItem时。在vue中,其实是引用了一个函数:这称为自定义事件侦听器。它将侦听任何使用“删除”字符串触发的事件。侦听事件后,它会触发一个名为onDeleteItem的函数。此函数在ToDo.vue中,而不是ToDoItem.vue中。如前所述,该函数只是简单地过滤数据对象中的待办事项数组,以删除已点击的待办事项。另外注意Vue例子中我们可以把$emit部分写在@click监听器里面,这样就简单多了,像这样:”>-
如果你愿意,这可以将3个步骤减少到2个。React中的子组件可以通过this.props访问父函数,而在Vue中,你需要从子组件和父组件发出事件来收集事件。5.如何传递事件监听器React的实现方法事件监听器处理简单的事件(比如点击)非常直接,我们为待办事项创建了一个点击事件来创建一个新的待办事项,代码如下:+
。很简单,就像使用vanillaJS来处理内联onClick一样。如前所述,每当Enter键被按下,这需要input标签处理onKeyPress事件,代码如下:。只要函数识别到'enter'键被按下,就会触发createNewToDoItem函数,代码如下所示:handleKeyPress=(e)=>{if(e.key==='Enter'){this.createNewToDoItem();}};Vue的实现方式Vue的事件监听器更直接。我们只需要使用一个简单的@符号来构建我们想要的事件监听器。比如要添加点击事件监听,代码:+
注:@click其实是v-on的简写:点击。Vue的事件监听器很强大,你可以为它们选择属性,比如.once来防止事件监听器被多次触发。此外,它包含很多快捷方式。当按下Enter按钮时,React需要更长的时间来创建事件监听器,这会创建一个新的ToDo项。在Vue中,代码如下:6.如何向子组件传递数据React的实现方法在React中,我们向子组件传递props它是在哪里创建的。例如:这里我们将两个props传递给ToDoItem组件。之后,我们可以在子组件中通过this.props引用它们。因此,要访问item.todo道具,我们只需调用this.props.item。Vue的实现方法在Vue中,我们通过props来创建子组件的方式如下:我们将它们传递给子组件中的props数组,如:props:['id','todo']。然后可以在子组件中按名称引用它们。7.如何将数据传回父组件React的实现方法我们在调用子组件时,首先将函数作为prop引用传递给子组件。然后我们通过引用this.props.whateverTheFunctionIsCalled添加子组件的调用函数,比如onClick。然后这会触发父组件中的函数。整个过程在删除待办事项部分有详细描述。Vue的实现方式是我们只需要在子组件中写一个函数,将一个值传回给父函数即可。在父组件中写一个函数监听子组件什么时候发出该值的事件,监听到事件后触发函数调用。同样,整个过程在有关删除待办事项的部分中有详细说明。8.总结我们研究了添加、删除和更改数据,将数据作为props从父级传递给子级,以及将数据作为事件监听器从子级发送到父级。当然,React和Vue之间存在一些细微差别,希望本文有助于理解这两个框架。两个应用的GitHub地址:VueToDo:https://github.com/sunil-sand...ReactToDo:https://github.com/sunil-sand...