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

NUXT3项目实践总结

目录

一、NUXT3实现黑夜白天模式切换

需求

实现

效果

二、scrollreveal插件实现动画效果

需求

实现

封装

使用

文档

效果

三、useSeoMeta的使用

作用

使用

效果

四、NUXT3开启代理

使用

注意

五、$fetch、useFetch 、useAsyncData的区别

六、错误页面处理

使用

代码

效果


网站地址:https://www.itihey.com/

一、NUXT3实现黑夜白天模式切换

需求

实现对网页颜色的整体控制,适配夜晚模式或者其他风格的页面用于迎合更多用户的页面样式多样化的需求。

实现

index.js

import theme from '@/utils/theme'
// 选择主题
const themeChange = (val: boolean) => {localStorage.setItem('theme', String(val))isDark.value = valif (val) {currentSkinName.value = 'defaultTheme'switchTheme(currentSkinName.value)} else {currentSkinName.value = 'darkTheme'switchTheme(currentSkinName.value)}
}
const switchTheme = (type?: string) => {type = type || 'darkTheme'const colorObj: ColorObject = (theme as { [key: string]: ColorObject })[type];Object.keys(colorObj).map(item => {document.documentElement.style.setProperty(item, colorObj[item])})
}

theme.js

export default {// 默认主题'defaultTheme': {// 主题色'--color-primary': '#2966df','--el-color-primary': '#409eff','--el-color-white': '#ffffff',//基础白色,// 导航条背景色'--navbar-bg': '#ffffff00',// 主体背景色'--background-color': '#ffffff',// banner背景色'--banner-bg': '#ffffff00',// 主要文字色'--text-color': '#000000',// 次要文字色'--text-color-secondary': '#909399',// 最次要文字色'--text-color-th': 'rgba(0, 0, 0, 0.3)',// 边框色'--border-color': '#e3e3e3',// 浅边框阴影'--border-shadow-shallow': 'rgb(0, 0, 0, 0.2)',// 深边框阴影'--border-shadow-deep': 'rgb(0, 0, 0, 0.5)','--card-color': '#F8FBFE','--el-color-primary-light-1': '#53a8ff','--el-color-primary-light-2': '#66b1ff','--el-color-primary-light-3': '#79bbff','--el-color-primary-light-4': '#8cc5ff','--el-color-primary-light-5': '#a0cfff','--el-color-primary-light-6': '#b3d8ff','--el-color-primary-light-7': '#c6e2ff','--el-color-primary-light-8': '#d9ecff','--el-color-primary-light-9': '#ecf5ff',},'darkTheme': {'--color-primary': '#2966df','--el-color-primary': '#409eff',"--el-color-white": "#ffffff", // 基础白色// 导航条背景色'--navbar-bg': '#00000000',// banner背景色'--banner-bg': '#00000070',// 主体背景色'--background-color': '#262727',// 主要文字色'--text-color': '#ffffff',// 次要文字色'--text-color-secondary': 'rgba(255, 255, 255, 0.8)',// 最次要文字颜色'--text-color-th': 'rgba(255, 255, 255, 0.5)',// 边框色'--border-color': '#e3e3e3','--card-color': '#011522',// 浅边框阴影'--border-shadow-shallow': 'rgb(255, 255, 255, 0.2)',// 深边框阴影'--border-shadow-deep': 'rgb(255, 255, 255, 0.5)',}
}

 整个代码的核心在于 document.documentElement.style.setProperty 的这个js方法。

  1. 'document' 是JavaScript中表示当前文档的对象。
  2. 'document.documentElement' 是文档对象模型中表示HTML文档根元素的对象。
  3. '.style' 获取根元素的样式属性对象。
  4. '.setProperty(item, colorObj[item])' 是设置根元素样式属性的方法。item 是一个变量,表示要设置的CSS属性名称,而 colorObj[item] 是相应属性的值。

 当然你也可以通过设置更多的主题来达到主题切换的效果。

效果

二、scrollreveal插件实现动画效果

需求

网站想要高大上,动画必不可少,如何实现优雅的动画就成了关键。实现的方式有很多比如animate.css + wow.js 实现。又或者使用scrollreveal插件来实现。这里我们来通过scrollreveal插件来实现动画效果。

实现

第一步,在src下创建plugins文件夹,写入名为scrollreveal.client.ts的文件。

import { defineNuxtPlugin } from "#app";
import scrollReveal from 'scrollreveal'export default defineNuxtPlugin((nuxtApp) => {let data = scrollReveal();return {provide: {scrollReveal: data,},}
});

封装

在components文件夹下创建名为RevealAnimation.vue的文件

<template><div :id="ID" className="load-hidden"><slot></slot></div>
</template><script setup lang="ts">
import { ref, onMounted } from 'vue';
const props = defineProps({options: {type: Object,default: () => ({// 动画的时长duration: 800,// 延迟时间delay: 100,// 动画开始的位置,'bottom', 'left', 'top', 'right'origin: 'bottom',// 回滚的时候是否再次触发动画reset: false,// 延时执行方式(always(一直延时执行),once(只延时执行一次),onload(只在加载时延时执行))useDelay: 'onload',// 在移动端是否使用动画mobile: true,// 滚动的距离,单位可以用%,rem等distance: '5rem',// 其他可用的动画效果opacity: 0.01,// 执行速度 线性函数啥的easing: 'ease-in-out',// 执行方式(缩放)scale: 0.9,}),},ID: {type: String,default: 'reveal',},
});
const { $scrollReveal } = useNuxtApp()onMounted(() => {if (process.client) {retScroll($scrollReveal);}
});const retScroll = (data: any) => {data.reveal(`#${props.ID}`, { ...props.options })
};
</script><style scoped>
.load-hidden {visibility: hidden;
}
</style>

另外我们再封装一个自动生成options配置项的工具,这里我只把几个关键的配置项写上了,需要更多配置项自己手动添加就可以。

export const createAnimationOptions = (origin: string, duration: number, scale: number) => {return {// 动画的时长duration: duration || 800,// 延迟时间delay: 100,// 动画开始的位置,'bottom', 'left', 'top', 'right'origin: origin || 'bottom',// 回滚的时候是否再次触发动画reset: false,// 延时执行方式(always(一直延时执行),once(只延时执行一次),onload(只在加载时延时执行))useDelay: 'always',// 在移动端是否使用动画// mobile: true,// 滚动的距离,单位可以用%,rem等distance: '5rem',// 其他可用的动画效果opacity: 0.01,// 执行速度 线性函数啥的easing: 'ease-in-out',// 执行方式(缩放)scale: scale || 0.9,};
}

使用

<template>     <RevealAnimation :ID="'web'" :options="createAnimationOptions('top', 300, .9)"><div class="title"><h1>题海·网页搜题</h1><h2>Questions · Web search questions</h2></div><div class="center"><div class="contentImage"><img :src="Webimg" alt=""><ComBotton :title="'开始搜题'" @onclick="handleRoute('web')"/></div><ContentCard v-for=" (val, key) in getContent('web')" :ID="`web_card_${key}`":options="createAnimationOptions('left', 800 + key * 300, .5)" :content="val" :key="key" /></div></RevealAnimation>
</template><script setup lang="ts">
import { createAnimationOptions } from "@/utils/tool";
</script>

文档

nullicon-default.png?t=N7T8https://scrollrevealjs.org/api/reveal.html更多方法API详见官方文档

效果

三、useSeoMeta的使用

作用

useSeoMeta组合函数能够以完全支持TypeScript的形式将你网站的SEO元标签定义为一个扁平对象。里面包含了许多的属性,比如:

"ogDescription" 通常是指 Open Graph 描述,也是 Open Graph 协议的一部分。这是一个用于指定在社交媒体分享时显示的描述文本的元数据。

"Open Graph" 是一种用于社交媒体分享的元数据协议。Open Graph 协议是由 Facebook 提出的一种协议,用于在分享链接时显示更富有信息的预览内容,包括标题、描述和图像。

更多详细属性请参阅官方文档

useSeoMeta · Nuxt ComposablesuseSeoMeta组合函数能够以完全支持TypeScript的形式将你网站的SEO元标签定义为一个扁平对象。icon-default.png?t=N7T8https://nuxt.com.cn/docs/api/composables/use-seo-meta

使用

<script setup lang="ts">import {useSeoMeta} from "unhead";const data = res.value as QuestionData[]  useSeoMeta({title: data[0].question + ' - 题海',description,ogTitle: data[0].question,ogSiteName: '题海',ogType: "website",ogDescription: description})
}</script>

只需要在setup中调用该方法即可使用。

效果

四、NUXT3开启代理

使用

找到根目录下的nuxt.config.ts 文件即可。

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({routeRules: {'/question/**': {swr: true},"/web-service/**": {proxy: "http://app.******.com/web-service/**",},"/sso-service/**": {proxy: "http://app.******.com/sso-service/**",},"/payService/**": {proxy: "http://app.******.com/payService/**",}},
})

注意

NUTXT的代理和普通的VUE和REACT项目的代理不太一样,一般来说正常的项目代理只需要拼接域名端口号就行,但是NUXT需要把要代理的路由地址也填写上。这里需要特别注意一下。

五、$fetch、useFetch 、useAsyncData的区别

  1. $fetch:

    • 用法:在页面组件中,你可以通过在 asyncDatafetch 钩子中调用 $fetch 来触发数据的获取。
    • 作用$fetch 用于在服务端渲染时获取数据,或者在客户端导航时获取数据。它允许你在组件级别发起数据请求。
     
  2. useFetch:

    • 用法useFetch 是 Nuxt.js 提供的一个插件,允许你在组件中使用 Composition API 风格的 fetch 钩子,而不是使用传统的生命周期钩子。
    • 作用:与 $fetch 类似,useFetch 也用于在组件级别发起数据请求,但它更适用于使用 Composition API 风格的组件。
     
  3. useAsyncData:

    • 用法useAsyncData 用于将异步数据加载到 Nuxt.js 页面中。它被设计用于在服务端渲染和客户端导航之间共享数据。
    • 作用useAsyncData 主要用于在页面组件中预取数据,以便在服务端渲染时提供页面所需的数据。

总体而言,这些方法提供了不同的方式来处理数据获取,你可以根据具体的需求选择适合的方法。$fetchuseFetch 更加灵活,适用于各种场景,而 useAsyncData 更专注于服务端渲染时的数据获取。

具体请参阅官方文档:

数据获取 · 快速入门 NuxtNuxt 提供了组合函数来处理应用程序中的数据获取。icon-default.png?t=N7T8https://nuxt.com.cn/docs/getting-started/data-fetching

六、错误页面处理

使用

在src下创建 error.vue页面即可。

代码

<template><div class="container"><img :src="noFound" alt=""><div class="info"><p>The Page not Found-找不到你要访问的页面</p><div class="sub"><a href="/">Back</a></div></div></div>
</template>
<script setup>
import noFound from '@/assets/svg/404error.svg'
</script>
<style scoped lang="scss">
.container {width: 100vw;height: 100vh;--color: #E1E1E1;background-color: #F3F3F3;background-image: linear-gradient(0deg, transparent 24%, var(--color) 25%, var(--color) 26%, transparent 27%, transparent 74%, var(--color) 75%, var(--color) 76%, transparent 77%, transparent),linear-gradient(90deg, transparent 24%, var(--color) 25%, var(--color) 26%, transparent 27%, transparent 74%, var(--color) 75%, var(--color) 76%, transparent 77%, transparent);background-size: 55px 55px;position: relative;img {position: absolute;top: 40%;left: 50%;transform: translate(-50%, -50%);width: 600px;height: 600px;}.info {position: absolute;top: 75%;left: 50%;transform: translate(-50%, -50%);text-align: center;p {font-size: 24px;color: #666;}.sub {margin-top: 30px;a {color: #fff;font-size: 16px;padding: 6px 10px;border-radius: 10px;border: 1px solid #666;background-color: var(--color-primary);}}}
}</style>

效果

相关文章:

NUXT3项目实践总结

目录 一、NUXT3实现黑夜白天模式切换 需求 实现 效果 二、scrollreveal插件实现动画效果 需求 实现 封装 使用 文档 效果 三、useSeoMeta的使用 作用 使用 效果 四、NUXT3开启代理 使用 注意 五、$fetch、useFetch 、useAsyncData的区别 六、错误页面处理 …...

中科星图——2020年全球30米地表覆盖精细分类产品V1.0(29个地表覆盖类型)

数据名称&#xff1a; 2020年全球30米地表覆盖精细分类产品V1.0 GLC_FCS30 长时序 地表覆盖 动态监测 全球 数据来源&#xff1a; 中国科学院空天信息创新研究院 时空范围&#xff1a; 2015-2020年 空间范围&#xff1a; 全球 数据简介&#xff1a; 地表覆盖分布…...

Tomcat 部署项目时 war 和 war exploded区别

在 Tomcat 调试部署的时候&#xff0c;我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别&#xff1a; war 模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded 模式&#xff1a;将WEB工程以当前文件夹的位置…...

【开源】SpringBoot框架开发天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…...

go数据操作-MySQL

1.快速入门 下载依赖 go get -u github.com/go-sql-driver/mysql使用MySQL驱动 func Open(driverName, dataSourceName string) (*DB, error)Open打开一个dirverName指定的数据库&#xff0c;dataSourceName指定数据源&#xff0c;一般至少包括数据库文件名和其它连接必要的…...

基于node.js和Vue3的医院挂号就诊住院信息管理系统

摘要&#xff1a; 随着信息技术的快速发展&#xff0c;医院挂号就诊住院信息管理系统的构建变得尤为重要。该系统旨在提供一个高效、便捷的医疗服务平台&#xff0c;以改善患者就医体验和提高医院工作效率。本系统基于Node.js后端技术和Vue3前端框架进行开发&#xff0c;利用其…...

Django如何调用机器学习模型进行预测

Django是一个流行的Python Web框架,它可以很方便地集成机器学习模型,进行预测和推理。我将介绍如何在Django项目中调用训练好的机器学习模型,并实现一个预测接口。 准备工作 首先我们需要一个训练好的机器学习模型。这里我们使用Scikit-Learn训练一个简单的线性回归模型作为示…...

Web3.0初探

Web3.0初探 一、互联网发展史二、什么是Web3.0&#xff1f;三、现在的发展方向&#xff08;衍生出来的产品&#xff09;&#xff1a;四、目前问题五、Web3.0与元宇宙 一、互联网发展史 Web3.0也就是第三代互联网。最新版本的Web3.0是以太坊的创始合伙人Gavin Wood在2014年提出…...

在windows和Linux中的安装 boost 以及 安装 muduo 和 mysql

一、CMake安装 Ubuntu Linux 下安装和卸载cmake 3.28.2版本-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135960115?spm1001.2014.3001.5501二、安装boost boost官网&#xff1a;boost官网 我下载的boost版本&#xff1a; windows:boost_1_84_0.zipli…...

WPOpenSocial实现WordPress的QQ登录

个人建站不可避免的需要自己搭建用户数据库的问题&#xff0c;可用户却往往因为注册繁琐而放弃浏览您的网站&#xff0c;由此可见&#xff0c;一个社交账号一键登录方式尤为重要。选择适合您网站需求的社交插件&#xff0c;可以提升用户互动&#xff0c;增加社交分享&#xff0…...

关于我用AI编写了一个聊天机器人……(7)

此次更新为v1.3.4版本&#xff0c;更新内容&#xff1a;增加显示时间功能 代码如下&#xff1a; #include <bits/stdc.h> #include <ctime> using namespace std; string userInput; class VirtualRobot { public:void chat() {cout << "你好&#x…...

WebService的services.xml问题

WebService有多种实现方式&#xff0c;这里使用的是axis2 问题&#xff1a; 在本地开发&#xff0c;访问本地的http://localhost:8080/services/ims?wsdl&#xff0c;正常访问 但是打成jar包&#xff0c;不管是linux还是window启动&#xff0c;都访问不到&#xff0c;报错…...

永久删除 Elasticsearch 中的主节点

Elasticsearch 是一个开源分布式搜索和分析引擎&#xff0c;用于各种任务&#xff0c;例如全文搜索、日志分析和实时数据分析。 Elasticsearch 集群由一个或多个节点组成&#xff0c;每个节点可以具有多种角色&#xff0c;包括主节点&#xff08;master node&#xff09;、数据…...

从搜索引擎到答案引擎:LLM驱动的变革

在过去的几周里&#xff0c;我一直在思考和起草这篇文章&#xff0c;认为谷歌搜索正处于被颠覆的边缘&#xff0c;它实际上可能会影响 SEO 作为业务牵引渠道的可行性。 考虑到谷歌二十多年来的完全统治地位&#xff0c;以及任何竞争对手都完全无力削弱它&#xff0c;坦率地说&…...

IDEA如何进行远程Debug调试

背景&#xff1a; 使用docker进行CVE漏洞复现的时候&#xff0c;由于只能黑盒进行复现&#xff0c;并不能知道为什么会产生这个漏洞&#xff0c;以及漏洞的POC为什么要这么写&#xff0c;之前我都是通过本地debug来进行源码分析&#xff0c;后来搜了一下&#xff0c;发现可以进…...

故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅...

C语言数据结构之二叉树

少年恃险若平地 独倚长剑凌清秋 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 &#x1f3a5;前期回顾-栈和队列 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 树的定义与判定 树的定义 树的判定 树的相关概念 树的运用…...

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史&#xff08;&#x1f609;&#x1f310;&#x1f47d;踏上神奇的网页编程之旅&#xff09;1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…...

笔记本电脑Win11重装系统教程

在笔记本电脑Win11操作过程中&#xff0c;用户如果遇到很严重的系统问题&#xff0c;就可以重新正常的Win11系统&#xff0c;快速解决Win11系统问题。但是&#xff0c;部分新手用户不知道不知道如何操作才能给Win11笔记本电脑重装系统&#xff1f;以下小编分享笔记本电脑Win11重…...

突破编程_C++_面试(基础知识(3))

面试题5&#xff1a;函数调用的过程 C 中函数的调用包含参数入栈、函数跳转、保护现场、回复现场等过程&#xff0c;重点过程如下&#xff1a; &#xff08;1&#xff09;将函数的参数压入栈中&#xff0c;从右至左压入。 &#xff08;2&#xff09;调用函数时&#xff0c;将当…...

AI的安全应答之道

作者&#xff1a;统信UOS技术团队 2023,随着各种大语言模型的爆发&#xff0c;整个AI生态正处于从决策式AI进化到生成式AI的进程中。各类AI模型和AI应用层出不穷&#xff0c;也随之带来了与AI相关的各类潜在风险。AI开发和使用过程中的风险防范和治理&#xff0c;成为了不可忽…...

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…...

如何在淘宝和Shopee上进行选品:策略和原则

在当今数字化时代&#xff0c;电商平台已经成为卖家们扩展业务和增加销售额的重要渠道。而在淘宝和Shopee这两个知名电商平台上进行选品时&#xff0c;卖家可以遵循一些相似的原则和策略&#xff0c;以确保他们的产品能够吸引目标客户并取得成功。本文将为您介绍一些在淘宝和Sh…...

C++/数据结构:二叉搜索树的实现与应用

目录 一、二叉搜索树简介 二、二叉搜索树的结构与实现 2.1二叉树的查找与插入 2.2二叉树的删除 2.3二叉搜索树的实现 2.3.1非递归实现 2.3.2递归实现 三、二叉搜索树的k模型和kv模型 一、二叉搜索树简介 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0…...

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…...

RabbitMQ之三种队列之间的区别及如何选型

目录 不同队列之间的区别 Classic经典队列 Quorum仲裁队列 Stream流式队列 如何使用不同类型的队列​ Quorum队列 Stream队列 不同队列之间的区别 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选…...

【ArcGIS微课1000例】0099:土地利用变化分析

本实验讲述在ArcGIS软件中基于两期土地利用数据,做土地利用变化分析。 文章目录 一、实验描述二、实验过程三、注意事项一、实验描述 对城市土地利用情况进行分析时,需要考虑不同时期土地利用图层在空间上的差异性,如农用地转建筑用地的空间变化。而该变化过程表现为各时期…...

学习鸿蒙基础(2)

arkts是声名式UI DevEcoStudio的右侧预览器可以预览。有个TT的图标可以看布局的大小。和html的布局浏览很像。 上图布局对应的代码&#xff1a; Entry //入口 Component struct Index {State message: string Hello Harmonyos //State 数据改变了也刷新的标签build() {Row()…...

2024年美国大学生数学建模竞赛思路与源代码【2024美赛C题】

B站账号&#xff0c;提前关注&#xff0c;会有直播&#xff1a;有为社的个人空间-有为社个人主页-哔哩哔哩视频 (bilibili.com) 题目 待定 问题一 思路 待定 模型 待定 程序 待定 问题二 待定 思路 待定 模型 待定 程序 待定...

Windows11搭建GPU版本PyTorch环境详细过程

Anaconda安装 https://www.anaconda.com/ Anaconda: 中文大蟒蛇&#xff0c;是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。从官网下载Setup&#xff1a;点击安装&#xff0c;之后勾选上可以方便在普通命令行cmd和PowerShell中使用…...