nuxt介绍

目录结构

文件名称 说明
.output 打包目录
api api请求接口
components 属于页面中的公共组件目录,例如 头部 底部 菜单等
composables 属于全局自动加载的辅助函数目录 很好用
layouts 属于模板布局目录
middleware 中间件文件夹,可以定义全局和非全局的中间件
pages 路由页面
plugins 插件目录,Nuxt 将自动读取"plugins"目录中的文件并加载它们
app 入口界面文件
nuxt.config.ts nuxt项目配置文件
package.json 安装包依赖文件
tsconfig.json Typescript配置文件


模板布局

默认布局页面 layouts/default.vue

<template>
  <div>
    <slot />
  </div>
</template>

入口界面文件

app.vue

是Nuxt自带的内置组件。 需要NuxtPage 来显示位于 pages/ 目录中的顶层页面或嵌套页面。

<template>
  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>
</template>

自定义公共组件

components/Tabbarlist.vue

<template>
  <div class="footerBox">
    <div class="footer">
      <ul>
        <li class="on">
          <NuxtLink to="/">
            <img src="/assets/images/f01.png" />
            <p>首页</p>
          </NuxtLink>
        </li>
        <li>
          <NuxtLink to="/business/">
            <img src="/assets/images/f4.png" />
            <p>我的</p>
          </NuxtLink>
        </li>
      </ul>
    </div>
  </div>
</template>

路由页面

pages/index.vue

<template>
    <h1>首页</h1>
    <Tabbarlist/>
</template>

全局自动加载的辅助函数

总接口文件 composables/useAPI.js

import api from '@/api/index';
export const useAPI = () => api

封装请求方法 composables/useHttp.js

useFetch接收URL并获取数据

export const useHttp = async (opts) => {
    var opts = opts || {};
    const config = useRuntimeConfig()
    let result = null
    const headers = {
        'Accept': 'application/json',
        'X-Requested-With': 'XMLHttpRequest'
    }
    if (opts.method == 'POST') {
        result = await useFetch(opts.url, {
        baseURL: config.public.baseUrl, method: "POST", headers: headers, body: opts.params
        }).then((data) => {
            return data
        })
    } else if (opts.method == 'GET') {
        result = await useFetch(opts.url, {
            baseURL: config.public.baseUrl, headers: headers, ...opts
        }).then((data) => {
            return data
        })
    } else if (opts.method == 'UPLOAD') {
        //封装表单数据对象
        var RequestData = new FormData()
        if (JSON.stringify(opts.params) != "{}") {
            for (var key in opts.params) {
                RequestData.append(key, opts.params[key])
            }
        }
        result = await useFetch(opts.url, {
            baseURL: config.public.baseUrl, method: "POST",  headers: useRequestHeaders(['authorization']), headers: headers,body: RequestData
        }).then((data) => {
            return data
        })
    }
    return result.data
}

API接口请求

api总入口文件 api/index.js

// 引入每个目录下面的index.js文件
const ModulesFile = import.meta.glob('./*/index.js', { eager: true })

//接口集合
var ApiList = {}

//提取对象下的值 同步
Object.values(ModulesFile).map(async mod => {
    if(mod.default)
    {
      //合并对象 循环多次合并
      ApiList = Object.assign(ApiList, mod.default)
    }
})

//导出接口集合
export default ApiList

api模块入口文件 api/user/index.js

//引入当前目录下面所有的文件
const ModulesFile = import.meta.glob('./*.js', { eager: true })

//接口列表
var ApiList = {}

Object.values(ModulesFile).map(async mod => {
    if(mod.default)
    {
        //合并对象 循环多次合并
        ApiList = Object.assign(ApiList,mod.default)
    }
})

export default ApiList

api模块接口文件 api/user/base.js

export default {
    register(data = {})
    {
        //注册接口
        return useHttp({
            url:'/business/register',
            params:data,
            method: 'GET'
        })
    },
}

页面调用接口

pages/index.vue

1、进入页面就请求数据
// UseFetch()在onMounted中使用,需要进行延迟调用才可以使用,否则获取不到数据。解决方式是使用nextTick()方法。
 onMounted(() => {    
  nextTick(async () => {
    const res  = await useAPI().productIndex();
    console.log(res)
  })
})

2、事件触发请求数据
const getindexData = async() =>{
    let result = await useAPI().register()
}

全局路由中间件

middleware/auth.global.js

import { showNotify } from 'vant';
//全局中间件,仅在调用的页面有效
export default defineNuxtRouteMiddleware((to, from) => {
  //如果有 NoLogin 并且为 true 就说明不需要登录就可以访问 否则就需要登录
  const toPath = to.fullPath;
  // 无需登录的路由页面
  let noNeedLogin = ['/', '/business/login', '/business/register', '/list/3', '/list/4', '/list/info']
  if(!noNeedLogin.includes(toPath))
  {
    //判断是否有登录信息
    let AuthLogin = useCookie('AuthLogin')

    if(!AuthLogin.value)
    {
      //  停止当前导航 navigateTo 导航跳转到指定页面.
      abortNavigation();
      showNotify({
        type: 'danger',
        message: '请先登录',
        duration: 1000
      });
      return navigateTo('/business/login')
    }
  }
})
powered by GitbookEdit Time: 2024-06-06 18:25:41