Vuex Async Dispatch

Posted on  by admin
Quick summary ↬In this tutorial, we will learn how to make a request in our Nuxt.js applications using the Axios module. We will also learn how to use the ayncData and fetch methods to fetch data on the server-side using Axios and the differences between the two methods. Finally, we will learn how to add authentication to our application using the Auth module.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 . 本文链接:https://blog.csdn.net/weixin_43564110/article/details/105117991. ©️2022 CSDN皮肤主题:大白 设计师:CSDN官方博客返回首页. 1.1 引入vuex 以后,我们需要在state中定义变量,类似于vue中的data,通过state来存放状态. 如果我们需要自定义一个计算属性怎么办呢?怎么添加呢? .

毕竟现在已经成这样了 computed: mapState(['nickname','age','gender']). 2.1 getters相当于vue中的计算属性,通过getters进一步处理,得到我们想要的值,而且允许传参,第一个参数就是state. 3.1 我们代码中定义的时候需要些mutations,它类似于vue中的methods,. ① 在mutations中不仅仅能做赋值操作. ② 作者在mutations中做了类似埋点操作,如果从mutations中操作的话, 能被检测到,可以更方便用调试工具调试,调试工具可以检测到实时变化,而直接改变state中的属性,则无法实时监测.

① 不容易写错,字符串容易写错,而且字符串写错以后不会报错位置,而用常量替代,如果写错,eslint可以提示错误位置. ① 依赖state得到新的数据,用getters(跟computed一样,只读). ② 修改state的属性值,就用mutations(同步操作). 4.1 action类似于mutation. mapActions(['getUserInfo']) 相当于以下代码. 本文记录Vue2.x + Element-UI + TypeScript语法入门实例.

3.2 mapMutations

为什么要用TypeScript?. 1、TypeScript是JavaScript的超集,利用es6语法,实现对js的面向对象编程思想;.

“It is a Secure and easy Axios integration with Nuxt.js.”

2、TypeScript会像强类型语言一样,可以避免出现不可预期的运行时bug;.

  1. Vue官网:https://cn.vuejs.org/. Element-UI官网:https://element.eleme.cn/#/zh-CN.
  2. element-ui已经升级适配vue3,并全新发布新项目:Element Plus.
  3. 官网:https://element-plus.gitee.io/#/zh-CN.
  4. GitHub:https://github.com/element-plus/element-plus.

Vue对TypeScript的支持:https://cn.vuejs.org/v2/guide/typescript.html. TypeScript的学习可以看回我们之前的《typescript》系列:https://www.cnblogs.com/huanzi-qch/category/1509796.html.

vue+typescript整合,推荐阅读这篇文章:https://segmentfault.com/a/1190000011744210.

vue项目需要node环境,开始安装之前,先安装node环境,安装node环境看之前的博客:TypeScript环境安装,以及配置idea开发环境.

装好node环境之后,先安装Vue CLI手脚架,通过手脚架来快速创建项目. 装好之后使用命令查看版本号,确认一下 .

装好了手脚架,然后就可以通过手脚架快速创建portal门户项目. 后续再在package.json里面指定依赖包,直接使用IDE(或者手敲命令也一样),运行安装命令下载依赖包. package.json依赖配置. 在src的同级目录下面,创建vue.config.js配置文件,配置端口等. 使用idea打开项目,配置config,即可在idea运行vue项目. 或者也可以手动输入命令启动项目(vue-cli-service serve),或者在package.json文件中运行脚本. Vue Router官网:https://router.vuejs.org/zh/. 或者直接在浏览器上输入path路径,即可跳转页面. Vuex官网:https://vuex.vuejs.org/zh/.

Vue对TypeScript的支持:https://cn.vuejs.org/v2/guide/typescript.html. vue+typescript整合,推荐阅读这篇文章:https://segmentfault.com/a/1190000011744210. 在使用typescript语法的过程中,我们使用官方维护的 vue-class-component 装饰器,这里是它的文档:https://class-component.vuejs.org/.

More after jump! Continue reading below ↓

接下来介绍具体的使用,里面包含了常用的:data 数据、生命周期钩子函数、methods 普通方法、computed 获取/设置计算属性、watch 监听、props 组件数据传递. 配置文件的key,要以VUE_APP_开头. 通常情况下,我们是这样设置自己的favicon.ico. 在项目HTML页面中,引入我们的favicon图片. 但是不管是在运行之后的页面,还是打包之后的页面,这行代码都是被注释起来的.

Jump to table of contents ↬

环境配置文件

我们可以再打包生成的index页面中,把这个注释放开,这样就可以正常显示我们的favicon图片了. 同时、我们可以再vue.config.js中进行设置. pwa配置项说明:https://cli.vuejs.org/zh/config/#pwa. vue.conifg.js中指定好打包路径. 同时,路由配置那里要注意,模式要改成mode: 'hash'. 直接运行打包脚本,或者手动输入命令. 复制dist文件夹到Tomcat容器,把Tomcat运行起来.

访问:http://172.16.35.52:10086/dist/,即可跳转到我们配置的 / 路径页面. 在此路径基础上就可以访问我们配置的路由路径了,如:http://172.16.35.52:10086/dist/#/test. 同时要注意,我们在vue.conifg.js中配置的服务信息,依赖node环境,如果是Tomcat,没有代理功能,需要配合nginx上配置代理地址.

Vue项目入门实例就暂时记录到这,后续再继续更新. 注:portal前端就是本文中的vue项目. 代码已经开源、托管到我的GitHub、码云:. GitHub:https://github.com/huanzi-qch/fast-scaffold. 码云:https://gitee.com/huanzi-qch/fast-scaffold.

posted @ 2020-11-03 15:12huanzi-qch 阅读(3966) 评论(0) 编辑收藏举报. 我们将在这个教程开发一个简单的 V2EX 论坛客户端,你将在本节教程学到 Taro 的基础知识、概念和部分优化技巧。学习这些知识并不需要事先了解 Taro、小程序开发或多端开发。当你掌握这些知识之后,你应该可以快速高效地开发多端应用。. 这篇教程适合对喜欢边学边做或小程序开发完全没有了解的开发者,如果你倾向于按部就班地学习,请把 文档 的内容全部过一遍。当你看完 文档 就可以发现:本篇教程就是文档的渐近式索引。.

环境准备:当我们使用 Taro 需要安装什么东西;. 基础教程:Taro 的基础概念和开发指南;. 多端开发:已经使用 Taro 开发了一端的应用,如何快速拓展到多端应用。. 在本篇教程中我们假定你已经对 Web 前端开发和 JavaScript 有一定的了解。我们将使用 React 和 Vue 两个框架分别实现我们的应用,在代码实例中点击 React 或 Vue 按钮就可以切换不同的实现。如果你对两个框架都不太熟悉,可以通过 React 文档或 Vue 文档对照代码实现。.

在我们的代码实现中还会使用部分 ES6 语法,你可以通过 ES6 入门教程 查看或学习 ES6 语法。. 目前 Taro 仅提供一种开发方式:安装 Taro 命令行工具(Taro CLI)进行开发。. Taro CLI 依赖于 Node.js 环境,所以在你的机器上必须安装 Node.js 环境。安装 Node.js 环境有很多种方法,如果你完全不了解 Node.js 可以访问 Node.js 官网 下载一个可执行程序进行安装。我们推荐安装 LTS 版本的 Node.js(目前 LTS 版本是 v12)。.

当你的机器已经存在了 Node.js 环境,可以通过在终端输入命令 npm i -g @tarojs/cli 安装 Taro CLI。安装完毕之后,在终端输入命令 taro,如果出现类似内容就说明安装成功了:. 我们推荐使用 VSCode 或 WebStorm(或其它支持 Web 开发的 Jetbrains IDE)。.

当你使用 VSCode 时,推荐安装 ESLint 插件,如果你使用 TypeScript,别忘了配置 eslint.probe 参数。如果使用 Vue,推荐安装 Vetur 插件。. 如果你愿意花钱又懒得折腾可以选择 WebStorm(或其它支持 Web 开发的 Jetbrains IDE),基本不需要配置。.

不管使用 VSCode 还是 WebStrom,安装了上述插件之后使用 Taro 都实现自动补全和代码实时检查(linting)的功能。. 在 *nix 系统中终端模拟器使用什么工具(Terminal/iTerm2/Konsole/Hyper/etc.)并不重要,但运行 Taro CLI 的 shell 我们推荐使用 bash 或 zsh。. 在 Windows 中我们推荐使用内置的 cmd 或 PowerShell。如果有条件推荐安装 WSL 并使用 Linux 分发版的终端运行 Taro CLI。由于 Taro 的开发团队和 CI 都只运行或测试 *nix 系统,部分 Windows 极端情况或许没能考虑到,导致出现 Bug。.

当你在开发过程中遇到问题时,你可以扫码加入 微信开发者群 提问,或者去 Taro 社区 提问。当你确信是 Taro 有 Bug 时,请随时向 Taro GitHub Issue 提出你的问题。. 安装好 Taro CLI 之后可以通过 taro init 命令创建一个全新的项目,你可以根据你的项目需求填写各个选项,一个最小版本的 Taro 项目会包括以下文件:.

我们以后将会讲解每一个文件的作用,但现在,我们先把注意力聚焦在 src 文件夹,也就是源码目录:. 每一个 Taro 项目都有一个入口组件和一个入口配置,我们可以在入口组件中设置全局状态/全局生命周期,一个最小化的入口组件会是这样:. 每一个入口组件(例如 app.js)总是伴随一个全局配置文件(例如 app.config.js),我们可以在全局配置文件中设置页面组件的路径、全局窗口、路由等信息,一个最简单的全局配置如下:. 你可能会注意到,不管是 React 还是 Vue,两者的全局配置是一样的。这是因为在配置文件中,Taro 并不关心框架的区别,Taro CLI 会直接在编译时在 Node.js 环境直接执行全局配置的代码,并把 export default 导出的对象序列化为一个 JSON 文件。接下来我们要讲到 页面配置 也是同样的执行逻辑。.

因此,我们必须保证配置文件是在 Node.js 环境中是可以执行的,不能使用一些在 H5 环境或小程序环境才能运行的包或者代码,否则编译将会失败。. Taro 的入口组件和全局配置规范是基于微信小程序而制定的,并对全平台进行统一。你可以通过访问 React 入口组件 和 Vue 入口组件,以及 全局配置 了解入口组件和全局配置的详情。. 页面组件是每一项路由将会渲染的页面,Taro 的页面默认放在 src/pages 中,每一个 Taro 项目至少有一个页面组件。在我们生成的项目中有一个页面组件:src/pages/index/index,细心的朋友可以发现,这个路径恰巧对应的就是我们全局配置的 pages 字段当中的值。一个简单的页面组件如下:.

这不正是我们熟悉的 React 和 Vue 组件吗!但还是有两点细微的差别:. onReady 生命周期函数。这是来源于微信小程序规范的生命周期,表示组件首次渲染完毕,准备好与视图交互。Taro 在运行时将大部分小程序规范页面生命周期注入到了页面组件中,同时 React 或 Vue 自带的生命周期也是完全可以正常使用的。.

View 组件。这是来源于 @tarojs/components 的跨平台组件。相对于我们熟悉的 div、span 元素而言,在 Taro 中我们要全部使用这样的跨平台组件进行开发。. 和入口组件一样,每一个页面组件(例如 index.vue)也会有一个页面配置(例如 index.config.js),我们可以在页面配置文件中设置页面的导航栏、背景颜色等参数,一个最简单的页面配置如下:.

后记

Taro 的页面钩子函数和页面配置规范是基于微信小程序而制定的,并对全平台进行统一。你可以通过访问 React 页面组件 和 Vue 页面组件 了解全部页面钩子函数和页面配置规范。. 如果你看到这里,那不得不恭喜你,你已经理解了 Taro 中最复杂的概念:入口组件和页面组件,并了解了它们是如何(通过配置文件)交互的。接下来的内容,如果你已经熟悉了 React 或 Vue 以及 Web 开发的话,那就太简单了:. 可能你会注意到在一个 Taro 应用中发送请求是 Taro.request() 完成的。和页面配置、全局配置一样,Taro 的 API 规范也是基于微信小程序而制定的,并对全平台进行统一。你可以通过在 API 文档 找到所有 API。.

在我们的首页组件里,还引用了一个 ThreadList 组件,我们现在来实现它:. 这里可以发现我们把论坛帖子渲染逻辑拆成了两个组件,并放在 src/components 文件中,因为这些组件是会在其它页面中多次用到。拆分组件的力度是完全由开发者决定的,Taro 并没有规定组件一定要放在 components 文件夹,也没有规定页面一定要放在 pages 文件夹。. 另外一个值得注意的点是:我们并没有使用 div/span 这样的 HTML 组件,而是使用了 View/Text 这样的跨平台组件。. Taro 文档的跨平台组件库 包含了所有组件参数和用法。但目前组件库文档中的参数和组件名都是针对 React 的(除了 React 的点击事件是 onClick 之外)。对于 Vue 而言,组件名和组件参数都采用短横线风格(kebab-case)的命名方式,例如:.

在 src/components/thread 组件中,我们通过. 然后在路径 src/pages/thread_detail/thread_detail 实现帖子详情页面,路由就可以跳转,我们整个流程就跑起来了:. 其中前三个页面我们可以把它们规划在 tabBar 里,tabBar 是 Taro 内置的导航栏,可以在 app.config.js 配置,配置完成之后处于的 tabBar 位置的页面会显示一个导航栏。最终我们的 app.config.js 会是这样:.

在我们实现帖子组件(src/components/thread)时,通过 Taro 内置的 eventCenter 发起了一个事件,把当前帖子的数据注入到一个全局的 GlobalState 中,然后在帖子详情页面再从 GlobalState 取出当前帖子的数据——这种简单的发布/订阅模式在处理简单逻辑时非常有效且清晰。. 一旦我们的业务逻辑变得复杂,一个简单的发布订阅机制绑定到一个全局的 state 可能就会导致我们的数据流变得难以追踪。好在这个问题不管是在 React 还是 Vue 社区中都有很好的解决方案。我们会使用这两个社区最热门的状态管理工具:Redux 和 Vuex 来解决这个问题。.

1.2 mapState 辅助函数

首先安装 redux 和 react-redux:. 在入口文件使用 react-redux 的 Provider 注入 context 到我们的应用:. 然后在帖子组件中我们就可以通过 connect 一个 dispatch 设置当前的帖子:. 在帖子详情组件中通过 connect 一个 mapStateToProps 获取当前帖子的数据:. 此教程演示的是 Redux 极简用法,而非最佳实践。详情请访问 Redux 文档 和 react-redux 文档。. 在入口文件中注入 Vuex 的 store:. 然后在帖子组件中我们就可以通过 this.$store.setThread() 设置当前的帖子:.

在帖子详情组件中通过 computed 获取当前帖子的数据:. 此教程演示的是 Vuex 极简用法,而非最佳实践。详情请访问 Vuex 文档。. 原理上来说,Taro 可以支持任何兼容 React 或 Vue 的状态管理工具,使用这类工具通常都会要求在入口组件注入 context,而在 Taro 中入口文件是不能渲染 UI 的。只要注意这点即可。.

安装、启动

在 Vue 生态圈我们推荐使用 Vuex。React 生态圈状态管理工具百花齐放,考虑到使用 Taro 的开发者很多应用会编译到小程序,我们推荐几个在性能或体积上有优势的状态管理工具:. mobx-react: 和 Vuex 一样响应式的状态管理工具. unstaged: 基于 React Hooks 的极简状态管理工具,压缩体积只有 200 字节. Recoil: Facebook 推出的基于 React Hooks 的状态管理工具.

在 Taro 中,我们可以自由地使用 CSS 预处理器和后处理器,使用的方法也非常简单,只要在编译配置添加相关的插件即可:. 除了 CSS 预处理器之外,Taro 还支持 CSS Modules 和 CSS-in-JS。原理上还支持更多 CSS 工具,我们将在 自定义编译 继续讨论这个问题。.

在帖子详情组件(ThreadDetail)中,我们使用了内置组件 RichText 来渲染 HTML,但这个组件的兼容性不好,无法在所有端都正常使用,某些特定的 HTML 元素也无法渲染。. 幸运的是,Taro 内置了 HTML 渲染,使用方法也和 React/Vue 在 Web 开发中没什么区别:. Taro 内置的 HTML 渲染功能不仅可以按 Web 开发的方式去使用,也支持自定义样式、自定义渲染、自定义事件这样的高级功能。你可以访问 HTML 渲染文档 了解更多。. 在帖子列表组件(ThreadList)中,我们直接渲染从远程得来的数据。这样做没有什么问题,但如果我们的数据非常庞大,或者列表渲染的 DOM 结构异常复杂,这就可能会产生性能问题。. 为了解决这一问题,Taro 内置了虚拟列表(VirtualList)功能,比起全量渲染所有列表数据,我们只需要渲染当前可视区域(visable viewport)的视图:.

在文档虚拟列表 你可以找到虚拟列表的一些高级用法,例如:无限滚动、滚动偏移、滚动事件等。. 这是由于 Taro 的渲染机制导致的:在页面初始化时,原生小程序可以从本地直接取数据渲染,但 Taro 会把初始数据通过 React/Vue 渲染成一颗 DOM 树,然后将这颗 DOM 树序列化之后交给小程序渲染。也就是说,比起原生小程序 Taro 会在页面初始化时多一次调用 setData 函数的支出——而大部分小程序的性能问题是 setData 数据过大导致的。. 为了解决这个问题,Taro 引入了一种名为预渲染(Prerender)的技术,和服务端渲染一样,在 Taro CLI 直接将要渲染的页面转换为 wxml 字符串,这样就获得了与原生小程序一致甚至更快的速度。. 默认而言使用生产模式打包,Taro 就会给你优化打包体积。但值得注意,Taro 默认的打包配置是为了让多数项目和需求都可以运行,而不是针对任何项目的最优选择。因此你可以在 Taro 配置的基础之上再针对自己的项目进行优化。.

在 Taro 应用中,所有 Java(Type)Script 都是通过 babel.config.js 配置的,具体来说是使用 babel-prest-taro 这个 Babel 插件编译的。.

默认而言 Taro 会兼容所有 @babel/preset-env 支持的语法,并兼容到 iOS 9 和 Android 5,如果你不需要那么高的兼容性,或者不需要某些 ES2015+ 语法支持,可以自行配置 babel.config.js 达到缩小打包体积效果。.

Vuex

例如我们可以把兼容性提升到 iOS 12:. 你可以访问 Babel 文档 了解更多自定义配置的信息。. Taro 使用 Webpack 作为内部的打包系统,有时候当我们的业务代码使用了 require 语法或者 import default 语法,Webpack 并不能给我们提供 tree-shaking 的效果。在这样的情况下我们通过 webpack-bundle-analyzer 来分析我们依赖打包体积,这个插件会在浏览器打开一个可视化的图表页面告诉我们引用各个包的体积。. 首先安装 webpack-bundle-analyzer 依赖:. 然后在 mini.webpackChain 中添加如下配置:. 你可以访问 webpack-bundle-analyzer 文档了解详细的用法。.

在一些情况,我们希望我们的页面只有当用到时才按需进行加载。这种情况在 Taro 应用被称为分包,分包的使用也非常简单,只需要通过配置入口文件 app.config.js 即可。. 在特定的情况下,Taro 自带的编译系统没有办法满足我们的编译需求,这时 Taro 提供了两种拓展编译的方案:.

在打包体积分析 中我们在 mini.webpackChain 添加了一个 Webpack 插件,达到了打包体积/依赖分析的效果。. 事实上通过 mini.webpackChain 这个配置我们可以几乎使用任何 Webpack 生态的插件和 loader,例如我们想使用 CoffeeScript 来进行开发:.

同样,之前我们提到过的 CSS Modules 也可以通过 Webpack 的形式进行拓展支持。详情可以访问 webpack-chain 文档了解详细的用法。.

在 [CSS 工具](#CSS 工具) 我们已经使用了名为 @tarojs/plugin-sass 的插件来实现对 Sass 的支持。比起使用 Webpack 拓展编译,Taro 的插件功能不用在每个端都对 Webpack 进行配置,只用使用插件即可。.

除此之外,Taro 的插件化功能还可以拓展 Taro CLI 编译命令,拓展编译流程,拓展编译平台,你可以访问 插件功能文档 了解更多自定义配置的信息。.

除了以上两种方式外,Taro 还提供大量的编译相关选项,你可以访问 编译配置详情 文档了解更多。. 例如我们正在实现 V2EX 论坛应用,当前的 API 没有办法在浏览器中跨域调用,因此我们需要在 H5 端使用另一份 API。我们可以通过内置环境变量来解决:. Taro 还提供了统一接口的多端文件,通过不同的命名方式寻找依赖,在这类情况下,我们可以保留:.

  • 除了「内置环境变量」和「统一接口的多端文件」之外,Taro 还提供了别的跨平台开发解决方案,你可以访问文档 跨平台开发 了解更多。.
  • 默认情况下,Taro 会把各端打包后的文件都放在 dist 目录。如果你想要多端同步调试的话先编译后的文件就会被后编译好的文件覆盖。.
  • 但我们可以通过修改编译配置的 outputRoot 达到多端同步调试的目的:. 在这样的配置下,微信小程序编译后的目录就会是 dist/weapp,H5 编译后目录就会是 dist/h5。.
  • 某些情况下我们需要复用小程序既有生态,而小程序的组件/库通常是针对特定小程序写的,并不能直接在 Taro 上使用,需要一些额外的操作。.
  • 例如我们的论坛应用,在帖子详情可能服务端返回的是 MarkDown 格式,我们就需要 towxml 来渲染的我们的帖子:.
  • 首先我们需要在帖子详情页面的配置文件中引用 towxml:.

然后使用 towxml 组件,这里必须记住的是不管是 React 还是 Vue,原生小程序组件声明需要是小写的.

  • 最后按照 towxml 文档调用即可。. 一旦使用了原生小程序组件,Taro 应用就失去了跨端的能力。.
  • Taro 还支持使用小程序插件,详情可以访问文档使用小程序原生第三方组件和插件。.
  • home
    Users would be redirected here after login.

Now, let us add the following to our nuxt.config.js file.

Please note that the auth method works best when there is a user endpoint provided in the option above.

Inside the auth config object, we have a redirect option in which we set our login route to /login, logout route to / and home route to /my-reports which would all behave as expected. We also have a tokenType property which represents the Authorization type in the header of our Axios request. It is set to Bearer by default and can be changed to work with your API.

For our API, there is no token type and this is why we’re going to leave it as an empty string. The tokenName represents the Authorization name (or the header property you want to attach your token to) inside your header in your Axios request.

By default, it is set to Authorization but for our API, the Authorization name is x-auth. The autoFetchUser property is used to enable user fetch object using the user endpoint property after login. It is true by default but our API does not have a user endpoint so we have set that to false.

For this tutorial, we would be using the local strategy. In our strategies, we have the local option with endpoints for login, user and logout but in our case, we would only use the *login* option because our demo API does not have a *logout* endpoint and our user object is being returned when *login* is successful.

Note:The auth module does not have a register endpoint option so that means we’re going to register the traditional way and redirect the user to the login page where we will perform the authentication using this.$auth.loginWith. This is the method used in authenticating your users. It accepts a ‘strategy’ (e.g local) as a first argument and then an object to perform this authentication with. Take a look at the following example.

TypeScript语法

Now that we have configured our auth module, we can proceed to our registration page. If you visit the /register page, you should see a registration form.

Let us make this form functional by adding the following code:

Here, we have an async function called registerUser which is tied to a click event in our template and makes an Axios request wrapped in a try/catch block to an endpoint /user/create. This redirects to the /login page and notifies the user of a successful registration. We also have a catch block that alerts the user of any error if the request is not successful.

If the registration is successful, you would be redirected to the login page.

Here, we’re going to make use of auth authentication method this.$auth.loginWith('local', loginData) after which we would use the this.$auth.setUser(userObj) to set the user in our auth instance.

To get the login page working, let’s add the following code to our login.vue file.

We created an async function called logIn using the auth method this.$auth.loginWith('local, loginData). If this login attempt is successful, we then assign the user data to our auth instance using this.$auth.setUser(userInfo) and redirect the user to the /my-report page.

You can now get user data using this.$auth.user or with Vuex using this.$store.state.auth.user but that’s not all. The auth instance contains some other properties which you can see if you log in or check your state using your Vue dev tools.

If you log this.$store.state.auth to the console, you’ll see this:

The auth instance contains a loggedIn property that is useful in switching between authenticated links in the nav/header section of your application. It also contains a strategy method that states the type of strategy the instance is running (e.g local).

Now, we will make use of this loggedIn property to arrange our nav links. Update your navBar component to the following:

In our template section, we have several links to different parts of the application in which we are now using auth.loggedIn to display the appropriate links depending on the authentication status. We have a logout button that has a click event with a logOut() function attached to it. We also display the user’s email gotten from the auth property which is accessed from our Vuex store using the mapState method which maps our state auth to the computed property of the nav component. We also have a logout method that calls our Vuex action logOut and redirects the user to the login page.

Now, let us go ahead and update our store to have a logOut action.

The logOut action calls the auth logout method which clears user data, deletes tokens from localStorage and sets loggedIn to false.

Routes like /my-reports and report-incident should not be visible to guests but at this point in our app, that is not the case. Nuxt does not have a navigation guard that can protect your routes, but it has is the auth middleware. It gives you the freedom to create your own middleware so you can configure it to work the way you want.

It can be set in two ways:

  1. Per route.
  2. Globally for the whole app in your nuxt.config.js file.

This auth middleware works with your auth instance so you do not need to create an auth.js file in your middleware folder.

Let us now add this middleware to our my-reports.vue and report-incident.vue files. Add the following lines of code to the script section of each file.

Now, our application would check if the user trying to access these routes has an auth.loggedIn value of true. It’ll redirect them to the login page using our redirect option in our auth config file — if you’re not logged in and you try to visit either /my-report or report-incident, you would be redirected to /login.

If you go to /report-incidents, this is what you should see.

This page is for adding incidents but that right now the form does not send incident to our server because we are not making the call to the server when the user attempts to submit the form. To solve this, we will add a reportIncident method which will be called when the user clicks on Report. We’ll have this in the script section of the component. This method will send the form data to the server.Update your report-incident.vue file with the following:

Here, we have a form with input fields for title, location, and comment with two-way data binding using v-model. We also have a submit button with a click event. In the script section, we have a reportIncident method that collects all the information provided in the form and is sent to our server using FormData because the API is designed to also accept images and videos.

This formData is attached to a Vuex action using the dispatch method, if the request is successful, you get redirected to /my-reports with a notification informing you that this request was successful otherwise, you would be notified of an error with the error message.

At this point, we don’t have reportIncident action in our store yet so in your browser console, you would see an error if you try to click submit on this page.

To fix this, add the reportIncident action your index.js file.

Here, we have a reportIncident function that takes in an empty context object and the data we’re sending from our form. This data is then attached to a post request that creates an incident and returns back to our report-incident.vue file.

At this point, you should be able to add a report using the form after which you would be redirected to /my-reports page.

This page should display a list of incidents created by the user but right now it only shows what we see above, let’s go ahead to fix that.

We’re going to be using the fetch method we learned about to get this list. Update your my-reports.vue file with the following:

Here, we use fetch method to get user-specific incidents and assign the response to our incidents array.

If you refresh your page after adding an incident, you should see something like this.

At this point, we would notice a difference in how fetch method and asyncData loads our data.

favicon.ico图标

So far, we have learned about the Axios module and all of its features. We have also learned more about asyncData, and how we can fetch both of them together despite their differences. We’ve also learned how to perform authentication in our application using the auth module and how to use the auth middleware to protect our routes. Here are some useful resources that talk more about all we’ve covered.

  • Getting started with meta tags in Nuxjs.
  • Using the dotenv module in Nuxt.
  • Using Fetch in your Nuxt app.
  • Getting started with asyncData.

vuex进阶

  1. “Auth Module,” NuxtJS.org
  2. “Axios Module: Introduction,” NuxtJS.org
  3. FormData, MDN web docs
  4. “API: The asyncData Method,” NuxtJS.org
  5. “The Vue Instance: Lifecycle Diagram,” VueJS.org
  6. “Understanding How fetch Works In Nuxt 2.12,” NuxtJS.org
(ks, ra, yk, il)