上一篇 记录了nuxtjs中两个函数的应用,本篇将持续介绍nuxtjs的相干应用以及我在开发Leafage过程中遇到的问题及解决办法。
首先来看一下nuxt.config.js,这个配置文件,是nuxtjs的外围配置文件,nuxtjs将依据这个配置文件里的配置项来生成.nuxt目录下的文件。
export default { // 全局页头配置 (https://go.nuxtjs.dev/config-head) head: { title: 'leafage-ui', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: '' }, // 这里能够增加网站验证码信息 { name: 'google-site-verification', content: 'xxx' }, // 实测百度无奈通过验证,此问题还没解决 { name: 'baidu-site-verification', content: 'code-xxx' }, ], link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }], }, // 全局css (https://go.nuxtjs.dev/config-css) css: [ '~/node_modules/highlight.js/styles/github.css' // 例如:引入highlight.js的github款式 ], // 配置后,会在页面渲染之前加载 (https://go.nuxtjs.dev/config-plugins) plugins: [ '~/plugins/mock', '~/plugins/axios' ], // 主动引入组件 (https://go.nuxtjs.dev/config-components) // components: true, // nuxtjs 2.15版本之前的形式 // 2.15版本及之后应用此形式 components: [ '~/components/global' // 扫描此门路,global目录下的.vue文件,作为组件,可主动引入,不须要在应用的时候,手动import ] // 用于开发和构建的modules (recommended) (https://go.nuxtjs.dev/config-modules) buildModules: [ // https://go.nuxtjs.dev/typescript '@nuxt/typescript-build', // https://go.nuxtjs.dev/tailwindcss '@nuxtjs/tailwindcss', ], // 工具module (https://go.nuxtjs.dev/config-modules) modules: [ // https://go.nuxtjs.dev/axios '@nuxtjs/axios', // https://go.nuxtjs.dev/pwa '@nuxtjs/pwa', ], // nuxt 加载进度条配置 (https://zh.nuxtjs.org/api/configuration-loading) loading: { color: 'black' }, // 如果增加了@nuxt/axios则会须要此配置来笼罩默认的一些配置 (https://go.nuxtjs.dev/config-axios) axios: { https: true, progress: true, // 是否显示加载进度条 credentials: true, // 申请携带cookie baseURL: 'https://www.abeille.top/api', proxy: true // 申请代理,开发中跨域问题解决办法 }, // 打包配置 (https://go.nuxtjs.dev/config-build) build: { // 例如:增加css宰割配置 extractCSS: true, },}
以上为nuxt.config.js的根本配置项及应用示例和阐明,对于更多配置请参考相干 modules 的文档。
下面介绍了通过 components 配置项来开启主动引入,在应用时就不须要手动import了,示例如下:
<template> <section class="container mx-auto"> <div class="grid grid-flow-row grid-cols-1 lg:grid-cols-3"> <div class="lg:col-span-2"> <TopPosts /> <div class="mb-12"> <ul class="flex justify-between items-center text-center border border-black" id="myTab" role="tablist" > <li class="w-1/3 hover:bg-black hover:text-white" :class="{ 'bg-black text-white': order == 'likes' }" > <button @click="retrieve('likes')" class="w-full h-10 text-xs font-bold uppercase focus:outline-none" > Trending </button> </li> <li class="w-1/3 hover:bg-black hover:text-white" :class="{ 'bg-black text-white': order == 'viewed' }" > <button @click="retrieve('viewed')" class="w-full h-10 text-xs font-bold uppercase focus:outline-none" > Most View </button> </li> <li class="w-1/3 hover:bg-black hover:text-white" :class="{ 'bg-black text-white': order == 'comment' }" > <button @click="retrieve('comment')" class="w-full h-10 text-xs font-bold uppercase focus:outline-none" > Popular </button> </li> </ul> <p v-if="$fetchState.pending">Fetching mountains...</p> <p v-else-if="$fetchState.error">An error occurred :(</p> <ListItem v-else :datas="datas" /> </div> <Pagation @retrieve="retrieve" /> </div> <SideBar /> </div> </section></template><script lang="ts">import { defineComponent } from "@vue/composition-api";import { SERVER_URL } from "~/assets/request";export default defineComponent({ name: "Main", async fetch() { this.datas = await this.$axios .get(SERVER_URL.posts.concat("?page=0&size=10&order=", this.order)) .then((res) => res.data); }, data() { return { datas: [], order: "likes", }; }, methods: { retrieve(order: string) { this.order = order; this.$fetch(); }, },});</script>
能够看到,在<script></script>模块中没有import引入TopPosts、Pagation、SideBar组件,也没有 components 项呈现,因为在nuxt.config.js中开启了主动引入解决。
可能你留神到layout.vue中有一个<Nuxt>的组件,它的作用是用来展现我的项目中其余组件的,会被pages目录下的.vue文件替换为展现内容。
那对于路由的应用,nuxtjs提供了,<nuxt-link> 来替换vue中的 <router-link>, <nuxt-child> 来替换vue中 <router-view> 相干应用办法与之对应。
后面介绍过,nuxtjs是依据pages目录下的构造生成路由信息,例如:pages/index.vue 生成的路由如下:
{ "name": "index", "path": "/", "component": "D:\\\\other\\\\leafage-ui\\\\pages\\\\index.vue", "chunkName": "pages/user" },
pages/posts/index.vue 将生成:
{ "name": "posts", "path": "/posts", "component": "D:\\\\other\\\\leafage-ui\\\\pages\\\\posts\\\\index.vue", "chunkName": "pages/posts/index" }
那如何配置能力生成动静路由呢,例如:posts/detail/:slug?,这样的动静路由须要应用下划线结尾的文件命名形式,如下所示:
{ "name": "posts-detail-slug", "path": "/posts/detail/:slug?", "component": "D:\\\\other\\\\leafage-ui\\\\pages\\\\posts\\\\detail\\\\_slug.vue", "chunkName": "pages/posts/detail/_slug" }
以上示例,体现在目录构造如下所示:
注: 有没有留神到,这里都是用的小写名称来命名文件。
其实也可应用首字母大写(而且应用全小写的门路匹配也能匹配到),然而举荐时应用全小写的独立单词,因为路由信息是依据文件夹和文件名来创立的,如果页面首字母大写生成的,那么生成的路由信息中,path也是首字母大写,这个其实不太标准。示例如下:
{ "name": "User", "path": "/User", "component": "D:\\\\other\\\\leafage-ui\\\\pages\\\\User.vue", "chunkName": "pages/User" }