nuxt3 + pinia + swiper +element-plus + less + 腾讯地图 创建项目及使用
Posted 王小王和他的小伙伴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nuxt3 + pinia + swiper +element-plus + less + 腾讯地图 创建项目及使用相关的知识,希望对你有一定的参考价值。
一。先说优点
1、基于Vue3:
Nuxt3是基于Vue.js 3开发的,Vue.js 3是目前最流行的前端框架之一。
这意味着你可以利用Vue3的所有优势,如性能优化、响应式编程、更好的TypeScript支持等。
2、服务端渲染(SSR):
Nuxt3支持服务端渲染,可以帮助你解决SPA(单页应用)中的SEO问题,提高页面加载速度,改善用户体验。
静态站点生成(SSG):Nuxt3还提供静态站点生成的功能,让你可以轻松构建高性能的静态站点,提高托管速度和安全性。
3、模块化:
Nuxt3有丰富的模块化生态系统,让你可以轻松地扩展应用的功能,减少开发工作量。
4、文件系统路由:
Nuxt3的文件系统路由让你可以通过简单的文件和目录结构来组织你的应用路由,让开发更加简洁明了。
5、开箱即用:
Nuxt3提供了许多开箱即用的功能,如状态管理、中间件、页面过渡动画等,使得开发过程更加简单和高效。
二。再来 nuxt3 项目搭建
1. nuxt3脚手架
npx nuxi init nuxt3-app
// nuxt3-app 是我的项目名称
在 nuxt3-app 目录下下载依赖
yarn
运行
yarn dev
再访问http://localhost:3000
即可看到基础界面了
2. 项目结构
(刚搭建的项目啥文件夹都没有,这里面基本都是我自己创建的。)
-
assets
,存放一些静态资源,包括一些Sass、Less
,在项目组件中引用的时候需要在开头使用 ~assets/ 符号,如果你的静态资源文件需要 webpack 做构建编译处理,可以放到 assets 目录,否则可以放到 static 目录中去,这也是 assets 目录 和 static 目录的一个区别 (我这里放的是全局使用的css) 也可放在public
下面 -
components
组件! 全部都放在/components目录下,并自动注册,(不用自己引入了,真好~ )
组件名称为目录名+组件名,并以大驼峰式命名,重复的名称会被去除~
(~ 后面再介绍组件怎么使用,这里先介绍目录吧~ ) -
pages
Nuxt 3 的pages
目录,是用来建立页面并放置的目录,当项目下有存在 pages 目录,Nuxt 将会自动加载 Vue Router 来实现路由效果,目录下的文件通常是 Vue 的组件,也允许具有.vue、 .js、 .jsx、 .ts 或 .tsx
副档名的文件。 当我们建立./pages/home/ index.vue
,文件内容如下,则表示home 路由 / 对应到这个home
页面文件,路由的配置将会由 Nuxt 3 自动产生。(不用自己创建路由了,真好~ ) -
plugins
这里定义的是插件,nuxt 会自动引用的。
呐! 官网说的 ~
-
public
静态资源~ 我的图片放在这里 -
store
状态管理,我项目中用的是pinia
-
middleware
设置中间件
引入插件
pinia
yarn add pinia @pinia/nuxt
element-plus
yarn add @element-plus/nuxt
添加 plugins/element.ts
import * as ElementPlusIconsVue from '@element-plus/icons-vue';
import ElementPlus from 'element-plus';
export default defineNuxtPlugin(nuxtApp =>
// ElementPlus
nuxtApp.vueApp.use(ElementPlus, size: 'small', zIndex: 3000 );
// ElementPlus Icons
for (const [key, component] of Object.entries(ElementPlusIconsVue))
nuxtApp.vueApp.component(key, component)
)
less
我用的版本
"less": "^3.12.2",
"less-loader": "^7.0.1",
swiper
yarn add vue-awesome-swiper
yarn add swiper
添加 plugins/element.ts
import VueAwesomeSwiper from "vue-awesome-swiper";
// import "swiper/swiper.css";
import "swiper/swiper-bundle.css";
export default defineNuxtPlugin((nuxtApp) =>
nuxtApp.vueApp.use(VueAwesomeSwiper);
);
我的:package.json
"private": true,
"scripts":
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview"
,
"devDependencies":
"nuxt": "3.0.0-rc.4"
,
"dependencies":
"@element-plus/icons-vue": "^2.0.6",
"@iconify/vue": "^3.2.1",
"@pinia/nuxt": "^0.1.9",
"@windicss/plugin-animations": "^1.0.9",
"element-plus": "^2.2.8",
"less": "^3.12.2",
"less-loader": "^7.0.1",
"nuxt-windicss": "^2.4.2",
"pinia": "^2.0.14",
"sass": "^1.53.0",
"swiper": "^8.0.7",
"nuxt-swiper": "^0.1.6",
"unplugin-auto-import": "^0.9.2",
"unplugin-vue-components": "^0.21.1",
"vue-awesome-swiper": "^5.0.1"
我安装的包
我的 nuxt.config.ts
import defineNuxtConfig from "nuxt";
const lifecycle = process.env.npm_lifecycle_event;
export default defineNuxtConfig(
app:
head:
title: "房屋医院",
// link: [ rel: "icon", type: "image/*", href: "" ],
link: [ rel: "icon", type: "image/x-icon", href: "/favicon.ico" ],
script: [
type: "text/javascript",
src: "https://map.qq.com/api/js?v=2.exp&key=XXX",
,
],
,
,
css: ["~/assets/scss/index.scss"],
build:
transpile: lifecycle === "build" ? ["element-plus"] : [],
,
buildModules: ["nuxt-windicss", "@pinia/nuxt"],
);
四。 开始使用了
1. 配置路由 :
nuxt3 是不用自己配置路由的,只要创建文件夹就可以了~
home 文件夹对应的路由是 http://localhost:3000/home
2.中间件,设置路由重定向
// 设置
export default defineNuxtRouteMiddleware((to, from) =>
console.log("auth");
return navigateTo("/home");
);
我的需求是,刚进入页面默认进入home路由。
// 使用 pages/index
definePageMeta(
middleware: "auth",
);
3. 使用组件
index文件 是自己在 home 文件夹下面的。要是使用 直接
<Home />
com 文件夹下面的 aboutUsImg 文件 要是使用 直接
<HomeComAboutUsImg />
4. 引入静态资源
我的图片资源,都是放在pulic/imgs,下面的。
使用1 :
<div class="introduction-title">
<img src="/imgs/introduction/titleUse.png" alt="" />
// 直接 "/imgs/introduction/titleUse.png" 去使用,要加/
</div>
使用2 :state中使用
不要加/
5. 使用 pinia
import defineStore from "pinia";
export const useCommon = defineStore("common",
state: () =>
return
selectNavIndex: 0
;
,
actions:
setSelectNavIndex(val)
this.selectNavIndex = val;
,
);
import useHome from "@/store/home";
const homeStore = useHome();
const selectNavIndex = computed(() => homeStore.selectNavIndex);
6.使用腾讯地图
nuxt.config.ts 配置
export default defineNuxtConfig(
app:
head:
title: "房屋医院",
// link: [ rel: "icon", type: "image/*", href: "" ],
link: [ rel: "icon", type: "image/x-icon", href: "/favicon.ico" ],
script: [
type: "text/javascript",
src: "https://map.qq.com/api/js?v=2.exp&key=XXX",
,
],
,
,
);
文件中使用:
<template>
<div class="map">
<div id="container"></div>
</div>
</template>
<script setup>
const initMap = () =>
const center = new qq.maps.LatLng(31.275091, 120.608716);
var map = new qq.maps.Map(document.getElementById("container"),
// 地图的中心地理坐标。
center: center,
zoom: 13,
disableDefaultUI: true, //禁止所有控件
);
var label = new qq.maps.Label(
position: center,
map: map,
content: "文本标记",
);
var marker = new qq.maps.Marker(
position: center,
map: map,
);
;
onMounted(() =>
initMap();
);
</script>
<style lang="less" scoped>
#container
/*地图(容器)显示大小*/
width: 527px;
height: 343px;
</style>
打包:
npm run generate 或者 npm run build
生成 .output / dist 文件
全局 安装
npm install -g http-server
打开cmd命令行,cd进入.output / dist 文件下的 public
文件夹目录下,执行
http-server -p 12345
打开启动的项目地址 即可查看是否成功。
[Nuxt] Update State with Vuex Actions in Nuxt.js
You can conditionally add classes to Vue.js templates using v-bind:class
. This will help display the status of a todo as you add a Vuex action to patch todos. This lesson walks you through setting up a toggle button that triggers a toggle action to patch todos in Vuex.
<template> <div> <form @submit.prevent="add(task)"> <input v-model="task" type="text" /> <input type="submit" value="ADD"> </form> <article class="pa3 pa5-ns"> <ul class="list pl0 ml0 center mw6 ba b--light-silver br2"> <li v-for="todo of todos" class="flex items-center ph3 pv3 bb b--light-silver"> <span v-bind:class="{strike: todo.complete}" class="flex-auto">{{todo.id}} {{todo.task}}</span> <button @click="toggle(todo)"><img src="https://icon.now.sh/check" alt="toggle"></button> <button @click="remove(todo)"><img src="https://icon.now.sh/trash" alt="delete"></button> </li> </ul> </article> </div> </template> <script> import { mapState, mapActions } from ‘vuex‘ import {init} from ‘./shared‘ export default { fetch: init, computed: { ...mapState({ todos: (state) => state.todos }) }, data () { return { task: ‘Some data‘ } }, methods: { ...mapActions([ ‘add‘, ‘remove‘, ‘toggle‘ ]) } } </script>
store/index.js:
import Vuex from ‘vuex‘ import axios from ‘axios‘ const store = () => new Vuex.Store({ state: { todos: [ ] }, mutations: { init (state, todos) { state.todos = todos }, add (state, todo) { state.todos = [ ...state.todos, todo ] }, remove (state, todo) { state.todos = state.todos.filter((t) => { return t.id !== todo.id }) }, toggle (state, todo) { state.todos = state.todos.map(t => { return t.id === todo.id ? todo : t }) } }, actions: { async add (context, task) { const commit = context.commit const res = await axios.post(‘https://todos-cuvsmolowg.now.sh/todos‘, { task, complete: false }) commit(‘add‘, res.data) }, async remove ({commit}, todo) { await axios.delete(`https://todos-cuvsmolowg.now.sh/todos/${todo.id}`) commit(‘remove‘, todo) }, async toggle ({commit}, todo) { const res = await axios.patch(`https://todos-cuvsmolowg.now.sh/todos/${todo.id}`, {complete: !todo.complete}) commit(‘toggle‘, res.data) } } }) export default store
以上是关于nuxt3 + pinia + swiper +element-plus + less + 腾讯地图 创建项目及使用的主要内容,如果未能解决你的问题,请参考以下文章