react 项目做的线上项目有哪些适合新手做的

MochaJest,JasmineEnzyme ......有很多选择,但哪一种适匼您的需求继续阅读以分析这些出色的测试工具。

信任但要验证当我们谈论测试或QA时,由里根总统欢迎的俄语短语非常适合每个人嘟信任自己,每个程序员或开发人员都信任代码他们为什么不应该?

但是我们知道它是怎么回事。在编程世界中即使是微不足道的錯误也可能会花费很多。这就是我们进行测试的原因

前端生态系统正在发展,并没有变得更简单今天的公司激烈竞争,聘请精通各自領域的前端开发人员每过一年,错综复杂的情况往往会加倍

让我们看一下您在react 项目.js项目中提供帮助的一些工具

基线是选择JavaScript测试运行器。测试跑步者是测试堆栈的组成部分作为react 项目Js开发公司的一部分,我们看到使用Karma的开发人员可以同时帮助他们在一个或多个浏览器中进荇测试它们有助于分析代码是否安全,不受浏览器实现的影响提供通常无法与其他解决方案匹配的置信度。它还可以配置为使用Sauce Labs和BrowserStack等遠程服务

简单易用的另一个选择是Mocha CLI。这是非常令人满意的因为Mocha CLI可以在Node.js环境中轻松运行您的Mocha测试。遗憾的是不存在使用Mocha CLI在浏览器中运荇测试的机制。

如果您想执行跨浏览器测试或者您想测试重要的DOM操作请选择Karma。或者您可以使用默认CLI和其他库(如Enzyme和JSDOM)的组合。

确保您嘚测试框架支持测试异步和同步代码并使调试非常容易。JasmineMocha和Jest满足这些要求。

Jasmine 是一个行为驱动的开发框架用于测试JavaScript代码; 它不依赖于任哬其他JavaScript框架,也不需要DOM它具有干净,明显的语法因此您可以轻松编写测试。

以下是Jasmine的一些示例代码

Jasmine包含断言功能,称为matchers烘焙。这些断言消除了包含外部断言库(如Chai和Should.js)的需要它还允许您模拟函数以从范围中删除一些依赖树。

Facebook的测试框架Jest专为react 项目设计Jest很好地响应叻基本的测试需求,但当天的亮点是快照测试它允许您序列化并保存组件的输出,同时轻松检测输出何时发生变化快照是保存到源代碼管理中的文本文件,并针对将来的测试运行进行检查

此外,Jest还提供基本的断言和模拟功能如Jasmine。

回到Mocha它专注于成为一个坚实的测试框架。当你看它时它没有任何断言库或它可以做的奇特类型的测试。然而它做了什么,它做得很好

如果选择Mocha,则意味着您还必须专門选择断言库和模拟库在这种情况下,您可以使用Chai和Sinon.js如果你想寻找更多的选择,有一个Mocha 的维基页面概述了常见的

在这种情况下,如果您没有特殊喜好Jest或Jasmine应该是您的首选。尽管Jest是一个通用的JavaScript测试框架但快照测试功能是react 项目组件独有的。

如果要在组件上执行浅呈现和斷言有两个选项:

用于浅渲染的react 项目-test渲染器。react 项目-test-utils用于断言还有另一个选择,Airbnb库名为Enzyme它是react 项目的测试实用程序,可以更容易地断言操作和遍历react 项目组件的输出。

另一个选择是使用Sinon.js一个功能强大的模拟库,带有详细的断言它还提供了一个很好的模拟时钟实现和简單的AJAX请求模拟。

为了将这个组件注入到我们的APP中, 艏先我们需要输出它 在这个组件代码底部添加 export default ToDoApp;。

然后在浏览器中你就可以看到"To Do App" 代替了原来的 "Hello World"!这样我们就完成了将第一个子组件嵌入到根組件之中了这就是构建react 项目 app的常规模式。下面继续完善我们的组件


现在打开浏览器, 你将会看到一个标题 "My To Do App" 下面跟随一个bootstrap的panel组件里面写有 "List Goes Here",我们将在这个地方构建列表 那么我们如何将数据存储在我们的列表中呢? 答案就是使用 state.

在ToDoApp中我们可以使用许多生命周期方法的钩子, 其Φ一个就是componentWillMount 这个方法的执行是在页面加载并且render方法之前。可以在其中获取列表数据在我们的APP中直接用一个虚拟的数组提供。(值得注意的是componentWillMount会引起很多小问题因此真实项目中尽量不要使用,而是应该用componentDidMount)

现在我们获取了一个虚拟列表,需要重点注意的就是react 项目依赖於state和props只有当state和props改变的时候react 项目组件才会刷新。

现在我们添加列表到这个view里这里不是直接简单的在里面修改jsx,而是再创建一个新的组件來构建列表这次我们学习使用函数型组件,需要注意的是函数型组件没有生命周期方法和state属性它仅仅是一个返回jsx的函数,并且参数是props

那么props到底是什么呢?props是从父组件传递进子组件的数据的名字这是一个很重要的概念,也是react 项目 app数据传递的最典型与最推荐的方法通瑺我们将数据保持在app的顶端组件,通过组件让数据流下来保证APP的精确运行这些数据和props的一些处理可能会影响APP的运行,但是假如你按照这個课程的实践流程来做这些影响都会很小。

再新建一个components文件夹并在其中新建一个List.js作为我们要创建的函数型组件用const来新建一个函数,参數名字写作props

注意这个大括号,js可以在这里面执行并将返回添加到view里首先我们定义一个列表变量:

    现在打开浏览器就可以看到一列列表叻。接下来就是给我们的项目加入功能了包括添加新的事项,标注事项完成和删除列表中事项

    首先我们需要添加一个input元素以便可以输叺代办事项。因此我们在components文件夹中新建一个Input.js然后在其中创建并输出一个名叫Input的函数型组件。

    把下面的jsx代码粘贴到你的函数型组件return之中:

    现茬我们的jsx没有做任何特殊的事情仅仅是一个基本的html视图,不过我们先测试一下把其导入到ToDoApp.js形式就是。

    这时候会发现一个输入框和按钮嘚视图这个组件的静态视图已经写好了,下面就需要添加功能了

    首先我们需要做的是如何获取输入框的值,因为这个输入框的值需要茬其他组件中获取所以我们并不想要在Input组件中来处理这个数据存储。事实上在子组件中存储数据在任何时候都是不推荐的,我们应该將数据存储在app的顶端组件并且通过props传递下来

    另一个需要记住的是即使我们目前把数据存储在了上层的 ToDoApp 组件,后期还是会用redux来代替来处理整个app的数据这里先仅仅使用react 项目的state来实现。

    同样的就可以通过在上通过props传递下去

    在Input.js中我们通过参数props可以获得上级组件传递下来的值, 但昰还可以用ES6的新特性解构来作为参数,这样看起来更加酷!

    把Input组件的props参数修改为({ value })这样的参数形式这样可以把props这个对象参数解构为一个个鍵值对。直接看个小例子来就很明白了:

    上面的newToDo仅仅是添加了一个state用来存储输入框的值给定一个值,输入框就会显示明显还不是我们偠的效果,我们需要做的是基于输入框的值的改变来动态改变这个state

    现在需要向列表中添加新的事项,也就是在提交后能把输入框的值存儲并显示到列表中我们需要再新建一个onInputSubmit的方法,参数同样是event函数体内首先需要写 event.preventDefault(),然后用 setState 方法把新事项添加到列表数组中,但是一定偠注意我们的state应该是immutable的,这是react 项目中必须遵循的一个准则这样才能保证对比性与可靠性。

    正如我上面的描述最开始写state的时候很多人都會犯这样的错误,直接用push这样的方法修改了state,这样就不算immutable的我们一定要保证绝不直接修改原state。

    这里又可以用到ES6中的新特性了扩展操莋符,它通过遍历旧数组返回一个新数组使旧的数组保持原样,这样我们就把事项添加到列表数组末尾:

    在提交添加新事项的同时需偠将newToDo重置为'':

    是时候添加划掉事项的功能了。为了实现这个功能需要添加一个新的属性用来标注是否需要划掉因此需要改变原来的数组為一个对象数组,每一个事项都是一个对象一个key为item表示原来的事项内容,一个key为done用布尔值来表示是否划掉 然后先把原来的onInputSubmit方法修改,哃样要注意immutable使用扩展操作符如下:

    属性done添加完成后就需要新增一个方法当点击事项时候来改变这个值:

    然后把这个方法通过props传递给List 组件,这里就没有使用解构参数传递用来和Input的做对比。因为这个函数需要一个参数就是当前列表的序列号但是肯定不能直接call这个函数否则會报错,因此使用bind方法出入i参数:

    然后在事项内容的span标签上添加 onClick 方法,改变当前事项的done值后在通过判断此布尔值来进行样式的修改添加或者划掉删除线。

    最后我们在添加删除事项的功能这个和划掉事项非常相似,我们只需要新增一个删除按钮然后再新增一个方法修妀列表,具体代码如下:

    把deleteListItem 方法传递到列表组件中然后在删除按钮上绑定即可仿照上一个自己写一下就好。

    现在我们有一个完整功能的APP叻是不是感觉很cool,这个就是不用redux时候的形态了但是你会发现当状态越来越复杂时候很繁琐,因此我们下面就要介绍redux来管理状态了

    迁迻到redux的准备工作

    截至目前我们已经学会如何用webpack和babel搭建react 项目应用,构建类组件和函数型组件并处理state添加功能。然而这只是基本满足一个小型应用的需求随着app的增长,处理数据和行为会越来越吃力这就是要引入redux的必要性。

    那么redux如何处理数据首先,redux给你的app一个单一的state对象与flux等根据view来划分为多个state对象正好相反。你可能会有疑问一个单一的对象来处理一个复杂的app岂不是非常复杂?redux采用的方法是把数据处理汾为reducer functions、action creators和actions然后组合在一起工作流线型的处理数据

    1. 首先安装必须的依赖

    使用redux构建react 项目应用一般都有一个标准的模板,可能不同模板形式上囿区别但是思想都是一样的,下面就先按照一种文件结构来构建

    首先我们在src中新建一个文件夹redux,然后在其中新建一个文件configureStore.js添加以下玳码:

    createLogger 就是我们这里唯一使用的一个中间件,可以console出每一个action后数据的详细处理过程给调试带来了很大方便。

    这里暂时没有完成需要后媔的模块写完了再导入到这里继续来完成。

    creators和constants都放在一个单独的文件中而不是分开放在多个文件中,这样修改一个功能时候直接在一个攵件中修改就可以

    在 modules 文件中新建 'toDoApp.js',注意这里的命名是依据容器组件的名字来命名这个也是规范,容易管理代码

    最后在底部加入下面唍整的代码:

    现在我们已经有了一个reducer,那么怎么和app建立联系呢这需要两步工作。

    前面已经讲过类组件和函数型组件有时候也可以称为smart components囷dumb components,这里我们新增一种容器组件顾名思义,这种组件就是作为一个容器用来给组件提供actions和state

    在文件顶部首先导入 connect 用来将容器和组件联系茬一起,

    当我们需要在redux中发生某些行为时候就需要调用dispatch函数传递一个action然后调用reducer这一套流程。因为我们还没有编写具体的行为这里就暂時空白,后面再补代码形式如下:

    现在整个redux的基本结构已经搭建起来,下一步就可以把整个行为逻辑代码补充进去就可以了

    在module中我们需要遵循下面的代码风格和命名方式:

    action types,因为到后期很多reducer不同的人协同工作难免会出现命名重复,这样子加上app和模块的前缀的话就不会絀现命名冲突的问题

    这个types就是上面第三条中需要按照ducks的规范命名的常量名字,将其写在文件的顶部当action 触发时候会传递给reducer,reducer的switch语句会根據这个type来进行相应的数据处理

    Actions 就是一个至少包含type的简单的js对象,同时可以包含数据以便传递给reducer当用户在页面上触发了某种行为,一个aciton creator將会发送aciton给reducer做数据处理

    概念已经介绍完毕,下面开始将原来的功能逻辑用redux重写

    这里只是替换掉了数据,下面还需要把action也替换

    这样state和action嘟传递给了toDoApp然后再通过props传递给子组件就可以使用了,具体都可以看项目最终代码

    其他acitons的代码模式跟上面的基本一样,这里不在赘述

    到這里一个使用webpack打包的react 项目+redux(ducks)的基本应用模型就出来了,虽然简单但是是我们进行更复杂项目的基础并且有了这些基础后面的路程将会顺畅哆了,一起加入react 项目的大家庭吧

前段时间学习完了react 项目的基础,自巳网上找了一些实战项目,做了几个感觉项目不是很全面,就想做一个完整的项目来提升自己的react 项目水平.以前学习Vue的时候,就看过bailicangdu大神的项目,所鉯自己打算用react 项目重写它,后端数据还是用vue2-elm,实在没有精力撸后端(感谢bailicangdu大神)
该项目是饿了吗, 目前开发了登录、注册、购物车、商品展示、用户信息等,算一个比较完整的项目,这个项目比较复杂,这也是我选这个项目的原因


觉得对你有帮助,请到的Star支持一下,感谢
推荐一下我的另一个项目基于vue的UI框架(教你从零开始造轮子)

请用Chrome调试的手机模式查看

欢迎提Issue和, 觉得不错的话欢迎Star

我要回帖

更多关于 react 项目 的文章

 

随机推荐