当前位置: 首页 > news >正文

Nuxt学习_基础知识(二)

文章学习来源,nuxt中文网

1. 异步数据 AsyncData

1.1 获取并返回数据

AsyncData:在设置组件之前能异步获取或处理数据。async方法会在页面组件每次加载之前调用(没有this),可以在服务端或路由更新之前调用。在这个方法调用的时候,第一个参数被设定为当前页面的上下文对象,可以利用asyncData方法来获取数据,nuxt.js会将asyncData返回的数据融合组件data返回的数据一并返回给当前组件。

在详情页面使用asyncData调用并返回数据:
pages/detail/_id.vue

export default Vue.extend({asyncData({params}) {console.log(params, '当前params指代的是什么内容') // params指代路径参数,比如详情页面路径上的idreturn axios.get('http://127.0.0.1:8090/api/fruits').then(({data}) => {console.log(data.dataSource, '返回结果') // 接口返回值return {list: data.dataSource // return中返回的值和设置的属性,会合并到data中}})},
})
  • 可以通过Promise、async/await、callback方式来处理返回值,以上述为例,通过Promise方式调用接口return一个属性,属性的值为对应接口的值,这个属性和值会同时被合并到data中,在页面加载完成后即可使用

1.2 处理异步请求

当发起网络请求时,我们通常可能需要对headers中增加信息进行校验,也可能需要对返回的response信息进行处理,可以通过进行封装Axios,增加拦截器来进行处理

  • 封装自己的带有拦截器的Axios request/index.js
import axios from "axios";
const myAxios = axios.create({baseURL: 'http://127.0.0.1:8090/api'
})myAxios.interceptors.request.use((req) => {req.headers.Authorization = 'XXX' // 在headers中增加信息进行校验等...return req}
)
myAxios.interceptors.response.use((res) => {return {data: res.data}}, // 正确返回时处理response返回至(err) => {console.log(err)// return Promise.reject(err)} // 发生错误时,处理错误信息
)
export default myAxios
  • 在页面使用封装拦截后的Axios
import myAxios from "~/request";async asyncData() {try {let { data } = await myAxios.get('http://127.0.0.1:8090/api/fruits')return {list: data.dataSource || []}}catch (err) {console.log(err.message)// alert(err.message)}},

2. 插件

2.1 注入Vue实例

若有需要用到相关的插件,在vue.js执行前进行执行,比如Toast组件,要做到以下几步

2.1.1 自定义Toast插件

components/Toast.vue

<template><transition name="fade"><div v-if="visible" class="toast">{{ message }}</div></transition>
</template><script>
export default {data() {return {visible: false,message: ''};},methods: {show(msg, duration = 2000) {this.message = msg;this.visible = true;setTimeout(() => {this.visible = false;}, duration);}}
};
</script><style scoped>
.toast {width: 200px;height: 100px;border-radius: 36px;background-color: green;color: blue;position: fixed;left: 50%;top: 40px;transform: translateX(-50%);z-index: 2;display: flex;justify-content: center;align-items: center;
}.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to /* .page-leave-active 在 <2.1.8 版本中 */ {opacity: 0;
}
</style>

2.1.2 声明插件

plugins/toast.js

import Vue from 'vue';
import Toast from '~/components/Toast.vue';const ToastConstructor = Vue.extend(Toast);
const instance = new ToastConstructor();// 将实例挂载到body上
instance.$mount(document.createElement('div'));
document.body.appendChild(instance.$el);// 注入到Vue原型上
Vue.prototype.$toast = (msg, duration) => {instance.show(msg, duration);
};

2.1.3 配置插件

nuxt.config.js

export default {plugins: ['~/plugins/toast.js'],
}

2.1.4 页面使用

this.$toast(`Hello 用户${this.currentId}`, 1000)

2.2 注入$root和context

在2自定义插件中,我们将Toast注入Vue实例,通过$toast在Vue组件中进行使用这个函数,除此之外,我们还可以注入context

2.2.1 注入context

context注入也是plugins插件中的一种,我们可以在context上面定义一些方法,比如说是一些通用的公共的方法,在每一次需要context以及这个方法时直接调用,而不用重复写多次代码

  • plugins/ctx-inject.js
export default ({ app }, inject) => {app.myInjectedFunction = (string) => { // 可以传参console.log(app, 'app是什么') // Vue实例console.log(inject, 'inject是什么') // inject方法console.log('Okay, another function', string) // 定义某种具体的操作}
}
  • nuxt.config.js
  plugins: ['~/plugins/ctx-inject.js',],
  • 页面使用 xx.vue
  async asyncData(context) {context.app.myInjectedFunction('use context 注入')}

2.3 同时注入

上述2.2注入context的方式只限于在使用上下文时进行使用,如果我们想在context、Vue实例甚至是Vuex中同时注入,我们可以依然可以通过inject方法来实现一个更加完美的方式

  • plugins/combine-inject.js
export default ({ app }, inject) => {inject('myCombineInjectFunction',  params => console.log('Okay, this combine inject', params))
}
  • nuxt.config.js 中配置
  plugins: ['~/plugins/combine-inject.js'],
  • xx.vue 页面中使用
async asyncData(context) {context.app.$myCombineInjectFunction('context中混合注入') // 注意,此处与context的区别是function前面增加了$符号
}mounted() {this.$myCombineInjectFunction('mounted中混合注入') // store中用法与此处相同}

3. 模块

模块是Nuxt.js的扩展,可以扩展其核心功能并添加无限的集成。Nuxt 可以使用配置选项和插件进行扩展,但是在多个项目中维护这些自定义是繁琐、重复和耗时的。 我们可以使用功能强大的 Hookable Nuxt.js 系统来完成特定事件的任务。Nuxt 模块可以合并到 npm 包中

3.1 基本模块

模块只是简单的功能,可以打包为npm模块或直接包含在项目源代码中

  • 定义modules/my-nuxt-module/index.js
export default function (moduleOptions = {}) {// 你可以在这里添加插件、中间件、服务器端中间件等// 例如,添加一个简单的插件this.nuxt.hook('build:before', () => {console.log('Nuxt build is starting...'); // 在build时打印在terminal上});// 添加单个插件// this.addPlugin({//   src: '~/plugins/combine-inject.js', // 注意这里的路径是相对于 Nuxt 项目的根目录//   ssr: false, // 如果插件只在客户端运行,设置为 false// });// 添加多个插件this.nuxt.options.plugins.push({ src: '~/plugins/combine-inject.js', ssr: true },{ src: '~/plugins/ctx-inject.js', ssr: false },)
}// 你可以在这里导出模块元数据(可选)  若想要发布到npm上面,这一步骤是必须的
module.exports.meta = require('../../package.json');
  • 在nuxt.config.js中应用该modules
export default {modules: [// 引入自定义模块'~/modules/my-nuxt-module'],
}
  • this代表module中的context
  • this.options可以直接访问nuxt选项,这是nuxt.config.js,其中包含所有默认选项,可用于模块之间的共享选项。
  • this.nuxt, 对当前nuxt实例的引用
  • module.export.meta 模块发布npm必须选项

3.2 异步模块

并不是所有模块都能同步完成全部操作,比如我们会需要获取某些API或执行异步IO操作的模块,Nuxt支持在异步模块中返回Promise或调用回调

  • async/await方式

modules/async-module.js

import fse from 'fs-extra'
export default async function() {const pages = await fse.readJson('../../package.json')console.log(pages, '读取到的内容有哪些')    // 打印读取了package.json中的内容
}

nuxt.config.js

export default {modules: ['~/modules/async-module']
}
  • promise方式
import axios from 'axios'export default function asyncModule() {return axios.get('https://jsonplaceholder.typicode.com/users').then(res => res.data.map(user => '/users/' + user.username)).then(routes => {// Do something by extending Nuxt routes})
}

4. 插件与模块的异同

模块与插件是两种用于扩展nuxt应用功能的方式

4.1 共同点

  • 扩展性: 无论模块还是插件,都是为了增加nuxt应用的功能而设计的,使得开发者能够根据自己的需求进行扩展
  • 可重用性:两者都支持被封装成独立的单元,以便于在多个项目中重复使用

4.2 不同点

  • 定义与用途

    • 模块:模块是nuxt的扩展,可以扩展nuxt的核心功能并添加新的集成。模块通常包含一系列预定义的配置和钩子,用于在nuxt应用的生命周期中注入额外的功能和逻辑。它可以在nuxt.config.js中被引入和配置
    • 插件通常用于向Vue组件中注入全局属性和方法,或者添加Vue实例的混入等,插件需要在nuxt的插件系统中注册,以便在应用启动时加载
  • 加载时机

    • 模块: 模块在nuxt应用启动时加载,并按照在nuxt.config.js中声明的顺序执行,它们可以在nuxt的生命周期中的不同阶段注入代码,从而影响应用的构建、渲染等过程
    • 插件:插件通常在Vue应用实例创建之前被加载,并可以访问到Vue上下文(如Vue实例,Vuex store等)。这使得插件能够在Vue组件初始化之前,向Vue实例中添加全局方法、混入等
  • 作用域

    • 模块: 模块的作用域相对较广,可以影响nuxt应用的各个方面,如路由、Vuex、组件等,模块通常通过Nuxt的生命周期钩子来实现其功能。
    • 插件:插件的作用域更关注与Vue组件和Vue实例,它们主要用于向Vue组件中注入全局的功能和属性,以便在组件内部使用
  • 使用方式:

    • 模块:在nuxt.config.js文件中,通过modules数组引入模块,并且可以传递配置选项给模块
    • 插件:在Nuxt的插件目录中创建插件文件,然后在nuxt.config.js中plugins数组中注册插件。插件可以是一个JavaScript文件,也可以是一个对象,用于定义插件的源文件、模式(如客户端或服务器端)等选项。

注意事项

  • 默认情况下 Nuxt 使用 vue-loader、file-loader 以及 url-loader 这几个 Webpack 加载器来处理文件的加载和引用。对于不需要通过 Webpack 处理的静态资源文件,可以放置在 static 目录中。需要处理的可以放到 assets 目录。
  • 在任何 Vue 组件的生命周期内, 只有 beforeCreate 和 created 这两个方法会在 客户端和服务端被调用。其他生命周期函数仅在客户端被调用。
  • 注意nuxt 与 nuxt start并不是相同的指令,在使用时不同的指令有不同的先决条件,不要用错

如果有用,点个赞呗~

总结用法,希望可以帮助到你,
我是Ably,你无须超越谁,只要超越昨天的自己就好~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调模型合并-Axolotl-单机单卡-V100(十)
  • 短剧视频推广连续多日遭受大量DDOS攻击,如何应对
  • 单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(一)方案架构
  • 如何优雅的在页面上嵌入AI-Agent人工智能
  • [godot] 采用状态机时,如何处理攻击时移动?如“冲撞”
  • 【R语言】基于多模型的变量重要性图 (Variable Importance Plots)
  • 开学季数码好物分享!推荐适合学生党好用又实惠的平替电容笔!
  • 叉车驾驶员状态监控系统,司机身份安全识别,强化监管能力建设!
  • pyqt 用lamada关联信号 传递参数 循环
  • 富格林金业:注意避免曝光交易黑幕
  • python深度学习框架——TensorFlow
  • 企业如何通过费用专项分析节约成本?BI大神带你实操数据分析过程!
  • 【MySQL】MySQL学习笔记(持续更新)
  • Linux搭建环境:从零开始掌握基础操作(三)
  • Python之列表解析和用matplotlib模块绘制图形
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android组件 - 收藏集 - 掘金
  • CSS魔法堂:Absolute Positioning就这个样
  • CSS实用技巧
  • es的写入过程
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA之继承和多态
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Less 日常用法
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • node学习系列之简单文件上传
  • Redis的resp协议
  • 批量截取pdf文件
  • 前端性能优化——回流与重绘
  • 区块链技术特点之去中心化特性
  • 网页视频流m3u8/ts视频下载
  •  一套莫尔斯电报听写、翻译系统
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • zabbix3.2监控linux磁盘IO
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 说说我为什么看好Spring Cloud Alibaba
  • ​补​充​经​纬​恒​润​一​面​
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Redis 入门到精通(七)-- redis 删除策略
  • ## 基础知识
  • #### golang中【堆】的使用及底层 ####
  • #git 撤消对文件的更改
  • #laravel 通过手动安装依赖PHPExcel#
  • #window11设置系统变量#
  • (007)XHTML文档之标题——h1~h6
  • (1)(1.13) SiK无线电高级配置(五)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (备份) esp32 GPIO
  • (附源码)计算机毕业设计高校学生选课系统
  • (转)Mysql的优化设置