nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

news/2024/4/27 4:36:53/文章来源:https://blog.csdn.net/weixin_45605541/article/details/128107883

文章目录

  • 1. asyncData异步数据请求
  • 2. 代理配置
  • 3. fetch网络请求
  • 4. vuex
    • 4.1 state中的数据展示
    • 4.2 同步方法与异步方法
    • 4.3 数据持久化处理
  • 5. 中间件处理


1. asyncData异步数据请求

Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData 和 fetch 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。

asyncData 方法会在组件(限于页面组件,页面组件就是写在 pages 中的组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法返回的数据一并返回给当前组件。

注意:由于asyncData方法是在组件初始化前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。

<template><div><h3>正在热映</h3><hr><ul><li v-for="item in films" :key="item.filmId">{{ item.name }}</li></ul><hr><nuxt-link to="/">首页</nuxt-link></div>
</template><script>
export default {data() {return {films: []}},// 这个函数在服务端执行,参数为一个上下文件对象async asyncData({ $axios }) {// 如果在此处你进行网络请求,在没有设置baseUrl或代理时,请一定要写全路径,否则得不到你想要的请求// https://api.iynn.cn/film 域名也可以写在 nuxt.config.js 配置文件的 baseUrl 中let ret = await $axios.get('https://api.iynn.cn/film/api/v1/getNowPlayingFilmList?cors=T&cityId=110100&pageNum=1&pageSize=10')// console.log(ret.data.data.films)// 返回一个对象,它就赋值到data配置中return ret.data.data}
}
</script><style lang="scss" scoped></style>

在这里插入图片描述

注意:在上面的案例中,虽然是服务端渲染,但还是需要后端做跨域处理,因为单单刷新当前请求数据的页面(或者是地址栏回车)时,由于是服务端渲染,所以不存在跨域,但是如果时通过路由跳转到当前页面时,就会出现跨域问题。

2. 代理配置

假如服务端没有帮我们做跨域处理,我们就需要在 nuxt.config.js 中写代理配置。注意写代理时不能再 baseURL 中写全路径。

  axios: {// baseURL: '/',proxy: true},proxy: {'/api': {target: 'https://api.iynn.cn/film',changeOrigin: true}},server: {// 改端口port: 8080},

在这里插入图片描述

3. fetch网络请求

我们现在让子组件来负责数据的展示,而父组件负责数据的请求,使用 axios 该怎么做呢?

父组件:

<template><div><h3>正在热映</h3><hr><film-item :films="films" /><hr><nuxt-link to="/">首页</nuxt-link></div>
</template><script>
export default {data() {return {films: []}},// 参数为一个上下文件对象async asyncData({ $axios }) {// 如果在此处你进行网络请求,在没有设置baseUrl或代理时,请一定要写全路径,否则得不到你想要的请求let ret = await $axios.get('/api/v1/getNowPlayingFilmList?cityId=110100&pageNum=1&pageSize=10')return ret.data.data}
}
</script><style lang="scss" scoped></style>

子组件:

<template><div><h3>子组件</h3><ul><li v-for="item in films" :key="item.filmId">{{ item.name }}</li></ul></div>
</template><script>
export default {props: ['films']
}
</script><style lang="scss" scoped></style>

在这里插入图片描述

我们在第一小节中就知道,asyncData 方法只能在页面组件中使用,而子组件在 components 中,假如我们现在要将网络请求写在子组件中,该怎么做呢?这时候就需要用到 fetch方法。

父组件:

<template><div><h3>正在热映</h3><hr><film-item /><hr><nuxt-link to="/">首页</nuxt-link></div>
</template><script>
export default {}
</script><style lang="scss" scoped></style>

子组件:

<template><div><h3>子组件</h3><ul><li v-for="item in films" :key="item.filmId">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {films: []}},// fetch它可以运行在任何的组件中async fetch() {let ret = await this.$axios.get('/api/v1/getNowPlayingFilmList?cors=T&cityId=110100&pageNum=1&pageSize=10')this.films = ret.data.data.films}
}
</script><style lang="scss" scoped></style>

在这里插入图片描述

4. vuex

Nuxt.js 会尝试找到 src 目录(默认是应用根目录)下的 store 目录,如果该目录存在,它将做以下的事情:

  1. 引用 vuex 模块
  2. 将 vuex 模块 加到 vendors 构建配置中去
  3. 设置 Vue 根实例的 store 配置项

4.1 state中的数据展示

store/count.js:

// 以独立的函数方法来定义vuex中的state数据
// 函数的名称一定叫 state
export const state = () => ({num: 100
})

pages/count/index.vue:

<template><div><h3>路由 /count</h3><hr><div>vuex中的state数据显示:{{ num }}</div></div>
</template><script>
import { mapState } from 'vuex'
export default {computed: {// 方式1// num() {//   return this.$store.state.count.num// }// 方式2...mapState('count', ['num']),},
}
</script><style lang="scss" scoped></style>

在这里插入图片描述

4.2 同步方法与异步方法

store/count.js:

// 以独立的函数方法来定义vuex中的state数据
// 函数的名称一定叫 state
export const state = () => ({num: 100
})// 同步
export const mutations = {addNum(state, payload) {state.num += payload}
}// 异步
export const actions = {asyncAddNum({ commit }, payload) {setTimeout(() => {commit('addNum', payload)}, 1000);}
}

pages/count/index.vue:

<template><div><h3>路由 /count</h3><hr><div>vuex中的state数据显示:{{ num }}</div><button @click="addNum">+++++</button></div>
</template><script>
import { mapState, mapGetters } from 'vuex'
export default {computed: {// 方式1// num() {//   return this.$store.state.count.num// }// 方式2...mapState('count', ['num']),// ...mapGetters('count', ['showNum'])},methods: {addNum() {// 同步this.$store.commit('count/addNum', 1)// 异步// this.$store.dispatch('count/asyncAddNum', 2)}}
}
</script><style lang="scss" scoped></style>

在这里插入图片描述

推荐插件Nuxt,它可以快速生成 vuex 相关的文件:

在这里插入图片描述

使用方式:按下 ctrl+shift+p 输入 nuxt 然后选择 create store ,最后输入文件名称就可以创建成功:

在这里插入图片描述

在这里插入图片描述

4.3 数据持久化处理

安装js-cookie(客户端路由切换时使用)和cookie-parse(服务端渲染时使用):

yarn add js-cookie cookie-parse

mock 假数据(static/login.json):

{"code":0,"msg":"ok","data":{"uid":1000,"token":"fewjlfjewklfewj;fewj;few;"}
}

登录页面:

<template><div><h3>我是一个登录页面</h3><hr><div><input type="text" v-model="formData.username"></div><div><input type="text" v-model="formData.password"></div><hr><button @click="doLogin">进入系统</button></div>
</template><script>
// 这样导入,在初始时,在服务器渲染时,它也会导入,这样影响性能
// import cookie from 'js-cookie'// 渲染环境判断的全局变量
// console.log(process.server);
// console.log(process.client);// 性能优化所用
const cookie = process.client ? require('js-cookie') : nullexport default {layout: 'empty',data() {return {formData: {username: 'admin',password: 'admin888'}}},methods: {async doLogin() {// 进行登录请求的验证let ret = await this.$axios.get('/login.json')// 登录成功,写入到cookie中,进行vuex数据持久化处理cookie.set('token', ret.data.data.token)cookie.set('uid', ret.data.data.uid)// 写入到vuex中this.$store.commit('user/setUserInfo', ret.data.data)// 跳转到后台this.$router.push('/admin')}}}
</script><style lang="scss" scoped></style>

store/index.js:

export const actions = {// 在服务器加载时,会主动执行1次nuxtServerInit({ commit }, { req }) {// 在服务器端得到当前的cookie数据,cookie数据是通过请求头发送给服务器// string// token=fewjlfjewklfewj%3Bfewj%3Bfew%3B; uid=1000// 方案1let cookieStr = req.headers.cookieif (cookieStr) {let jsonCookie = cookieStr.split(';').reduce((p, c) => {let [key, value] = c.split('=')p[key.trim()] = valuereturn p}, {})// 同步到vuex中 -- 解决刷新丢失问题commit('user/setUserInfo', jsonCookie)}// 方案2// try {//   let cookieStr = req.headers.cookie//   let jsonCookie = cookieStr.split(';').reduce((p, c) => {//     let [key, value] = c.split('=')//     p[key.trim()] = value//     return p//   }, {})//   // 同步到vuex中 -- 解决刷新丢失问题//   commit('user/setUserInfo', jsonCookie)// } catch (error) {// }}
}

store/user/state.js:

export default () => ({uid: 0,token: ''
})

store/user/mutations.js:

export default {setUserInfo(state, payload) {state.uid = payload.uidstate.token = payload.token}
}

在这里插入图片描述

5. 中间件处理

在根目录下创建 middleware 文件,每一个中间件都应该放在这个目录下。

middleware/logincheck.js:

export default ({ store, redirect }) => {if (!store.state.user.token) {redirect('/login')}
}

上面这个中间件表示如果不是登录状态,就会重定向到登录页面。

注册全局中间件:

全局中间件就是每进入一个页面都会执行的中间件,相当于全局前置守卫。它需要在 nuxt.config.js 的 router 中进行配置。

  router: {// 全局中间件注册middleware: 'checklogin',// 动态添加路由 但是一定要注意在pages中不能有_.vue这样的文件,否则路由匹配不成功[push]extendRoutes(routes, resolve) {/* routes.push({path: '/abc',component: resolve(__dirname, 'pages/about.vue')}) */// 如果你用_.vue,则需要用unshift方法来动态添加路由信息routes.unshift({path: '/abc',component: resolve(__dirname, 'pages/about.vue')})}},

匹配布局:

相当于路由独享守卫,写在 layouts/default.vue 中。

<template><div><!-- 它可以理解为子路由 嵌套路由 --><!-- <h3>我是一个默认的全局布局文件</h3> --><!-- 如果你用了全局布局,则在此处一定要添加一个挂载点 --><nuxt /></div>
</template><script>
export default {// 路由独享// middleware: 'checklogin'
}
</script><style lang="scss" scoped></style>

匹配页面:

相当于组件内守卫。

<template><div><h3>我是一个后台</h3><!-- 如果它是一个嵌套路由,则在此处一定要放置挂载点 --><nuxt-child /></div>
</template><script>
export default {// 写在组件或父组件中middleware: 'checklogin'
}
</script><style lang="scss" scoped></style>

如果不是登录状态,就跳转到登录页面,用组件内中间件更合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_39101.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这或许是全网最详细的介绍预言机赛道的视频课程,通俗易通,有趣有料!

图片来源&#xff1a;由无界版图 AI 绘画工具生成有一句话在创业者中很流行&#xff1a;Web3创业三大坑&#xff0c;隐私、跨链、预言机……搞塌加密市场的DK和SBF还在豪华度假酒店里思考人生搞隐私&#xff0c;一毛钱没赚到的Tornado cash开发者却在吃牢饭……加密圈前十大资产…

力扣(LeetCode)895. 最大频率栈(C++)

设计 ①维护最大频率&#xff0c;②维护每个数的出现次数&#xff0c;③维护出现次数对应的栈。 压栈时&#xff0c;新数压入出现次数对应的栈&#xff0c;每次压入新数&#xff0c;维护最大频率(所有出现次数中的最大出现次数)。 弹栈时&#xff0c;找最大频率对应的栈&…

拖死项目的不是团队,可能是失败的管理

项目中的活动&#xff0c;归根结底是由人来完成的&#xff0c;如何发挥项目成员的能力&#xff0c;对于项目的成败起着至关重要的作用。如何充分地发挥团队成员的能力&#xff0c;对项目经理也是一个挑战。 在团队管理者我们会遇见这些难题&#xff1a; 1、团队凝聚力不足&a…

【MySQL 18】Docker 安装 MySQL8 .0.30

1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a; https://hub.docker.com/_/mysql?tabtags 。2、拉取 MySQL 8.0.30 镜像 拉取官方的指定版本的镜像&#xff1a; docker pull mysql:8.0.30[rootlocalhost deploy]# docker pull mysql:8.0.30 8.0.30: Pulling…

云小课|云小课教您如何选择Redis实例类型

阅识风云是华为云信息大咖&#xff0c;擅长将复杂信息多元化呈现&#xff0c;其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要&#xff1a;购买Redis实例时&#xff0c;实例类型有单机、主备、Pr…

公司新来一个同事,把网关系统设计的炉火纯青,万能通用,稳的一批。。

本文准备围绕七个点来讲网关&#xff0c;分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比&#xff0c;对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。 什么是网关 网关&#xff0c;很多地方将网关比如成门&#xff0c; 没什么…

Casein-PEG-Rhodamine B 络蛋白-聚乙二醇-罗丹明B Casein-RB

产品名称&#xff1a;络蛋白-聚乙二醇-罗丹明B 英文名称&#xff1a;Casein-PEG-Rhodamine B 质量控制&#xff1a;95% 原料分散系数PDI&#xff1a;≤1.05 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊…

全波形反演的深度学习方法: 第三章 常规反演

本章介绍反演的基础知识, 以及工程中的常规反演. 仅供内部培训. 3.1 地震数据采集 地震勘探中常使用人工激发的振动进行数据采集. 相应装置包括: 激发器是产生震动的装置, 如炸药, 地震车 (撞击地面). 在城市道路等具有车辆会产生振动的地方, 也可以不安装这类装置;地震检波…

【Linux】高频指令及简单的vim使用(0基础带你快速入门)

目录 一、目录操作指令 1.1、ls 1.2、pwd 1.3、cd 1.4、touch 1.5、cat 1.6、echo 1.7、mkdir 1.8、rm 1.9、mv 1.10、cp 二、Linux中如何手动安装插件 三、vim 3.1、打开文件 3.2、编辑文件 3.3、保存退出 一、目录操作指令 1.1、ls 语法&#xff1a; 第一种&#…

Android中简单使用aspectj

Android中简单使用aspectj 前言&#xff1a; 面向切面编程&#xff08;AOP是Aspect Oriented Program的首字母缩写&#xff09;,这种在运行时&#xff0c;动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程. 1.简介&#xff1a; 在Android中使用注解…

onnx删除无用属性

这里写自定义目录标题在推理onnx模型时&#xff0c;报了一个错&#xff0c;如下&#xff1a;InvalidGraph: [ONNXRuntimeError] : 10 : INVALID_GRAPH : This is an invalid model. In Node, ("Conv_0", Conv, "", -1) : ("x": tensor(float),&q…

xxljob

分为调度中心 执行器 调度中心&#xff1a;提供可视化界面&#xff0c;配置定时任务&#xff0c;定时去调用执行器 调度中心执行器管理&#xff1a;每个springboot作为执行器&#xff0c; 也就是执行器的标识 任务管理&#xff1a;选中执行器&#xff0c;创建改该执行器下的任…

c++ - 第15节 - 二叉树进阶

1. 二叉搜索树 1.1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节…

iphone怎么传数据到另一个手机,苹果如何转移数据到新手机,两台iphone怎么同步所有数据

换新手机后&#xff0c;需要迁移旧苹果手机的数据到新苹果手机里面&#xff0c;那么&#xff0c;iphone怎么传数据到另一个手机&#xff1f;本篇文章带您深度了解苹果手机的数据传输技巧。 方法一、通过“快速开始”传输数据 苹果手机如何数据传输&#xff1f;我记得之前换 iP…

沉睡者IT - Web3的未来在哪里?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 专家说&#xff0c;web3将颠覆现在的互联网 今天我们来讨论一下&#xff0c;web3会颠覆现在的互联网呢&#xff1f; 看了小编往期的作品你应该知道&#xff0c;如果同样的作品发在web3平台上&#xff0c;你将获取到收益。 那…

Codeforces Round #290 (Div. 2) C. Fox And Names

翻译&#xff1a; Fox Ciel将发表一篇关于FOCS (Fox操作的计算机系统&#xff0c;发音:“Fox”)的论文。她听到一个谣言:报纸上的作者名单总是按照词典顺序排列的。 在查看了一些例子后&#xff0c;她发现有时这不是真的。在一些论文中&#xff0c;作者的名字没有按照正常意义…

干货 | 提前在开发阶段暴露代码问题,携程Alchemy代码质量平台

作者简介Lyan&#xff0c;携程资深后端开发工程师&#xff0c;负责自动化测试框架及平台类工具开发&#xff0c;关注Devops、研发效能领域。一、背景随着敏捷开发&#xff0c;DevOps开发模式的流行&#xff0c;代码质量分析作为研发质量保证体系的重要组成部分&#xff0c;不仅…

DCDC--Burst Mode和Pulse Skipping Mode

1、Burst Mode和Pulse Skipping Mode&#xff08;PSM&#xff09;的区别 Burst Mode ≠ Pulse Skipping Mode&#xff0c;论坛有人认为Burst Mode就是Pulse Skipping Mode&#xff0c;这是不对的。 以LTC3624为例&#xff1a; Burst Mode operation provides the highest ef…

(一)DepthAI-python相关接口:OAK Device

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

数据结构初阶--栈和队列(讲解+类模板实现)

栈的概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;加粗样式的原则。 入…