优秀的编程知识分享平台

网站首页 > 技术文章 正文

SSR:集成vue-router4、axios(ssr是什么意思)

nanyue 2024-08-23 18:30:12 技术文章 4 ℃

vue-router

安装vue-router4

npm install vue-router@4

添加页面 home article

views/home/homeIndex.vue
views/article/articleIndex.vue

路由配置

import { createRouter, createMemoryHistory, createWebHistory } from 'vue-router'

const Home = () => import('@/views/home/homeIndex.vue')
const Article = () => import('@/views/article/articleIndex.vue')

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home,
    meta: {
      title: '',
      keywords: '',
      description: '',
      keepAlive: false
    }
  },
  {
    path: '/article',
    name: 'article',
    component: Article,
    meta: {
      title: '',
      keywords: '',
      description: '',
      keepAlive: false
    }
  }
]

const router = createRouter({
  history: import.meta.env.SSR ? createMemoryHistory() : createWebHistory(),
  routes
})

export default router

C++音视频开发学习资料点击莬费领取音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

入口文件

main.js

import { createSSRApp } from 'vue'
import App from './App.vue'
import router from './router'

import 'normalize.css'

export const createApp = () => {
  const app = createSSRApp(App)
  app.use(router)
  return { app, router }
}

entry-client.js

import { createApp } from "./main";

const { app, router } = createApp()

router.isReady().then(() => {
  app.mount('#app')
})

entry-server.js

import { createApp } from "./main"
import { renderToString } from 'vue/server-renderer'

export async function render(url) {
  const { app, router } = createApp()
  await router.push(url)
  await router.isReady()
  const html = renderToString(app)
  return html
}

App.vue 路由跳转

<template>
  <button @click="router.push('/')">home</button> | <button @click="router.push('/article')">article</button>
  <router-view></router-view>
</template>

<script setup>
import { useRouter } from "vue-router";
const router = useRouter()
</script>

<style lang="scss" scoped></style>

axios

安装axios

npm install axios -S

简单封装axios

import axios from 'axios';
import qs from 'qs';


export class Axios {
  constructor() {
    this.axios = axios;
    this.axios.defaults.baseURL = 'http://localhost:3001/vite-ssr/';
    this.axios.defaults.validateStatus = function (status) {
      return status >= 200 && status < 600; // default
    };
    //默认10s的超时时间
    this.axios.defaults.timeout = 10000;
  }
  /**
   * axios请求方法
   */
  apiPost(config) {
    let requestOption = this._requestInterceptor(config);
    return new Promise((resolve, reject) => {
      this.axios.request(requestOption).then(
        async res => {
          let defData = res.data;
          let { data, result, message, msg, code } = defData;
          resolve(defData);
        },
        error => {
          console.log('server error')
          reject(error);
        }
      );
    });
  }

  _requestInterceptor(config) {
    if (config.method === 'post' || config.method === 'put') {
      config.data = qs.stringify(config.params);
    }
    config.params = config.method === 'get' ? config.params : '';
    return config;
  }
}

C++音视频开发学习资料点击莬费领取音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

接口引入&使用

api/index.js

export { default as ArticleApi } from './article';

api/article.js

import { Axios } from '@/utils/axios';

class ArticleApi extends Axios {
  getArticleList(params) {
    return this.apiPost({
      url: 'articles/list',
      method: 'get',
      params
    });
  }
}

export default new ArticleApi();

使用

import { ArticleApi } from "@/api";
import { onMounted, ref } from "vue";

const imgList = ref([]);
onMounted(() => {
  getArticles();
});

const getArticles = async () => {
  let res = await ArticleApi.getArticleList();
  imgList.value = res.data;
};

效果预览,使用mockjs模拟数据

如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框,一起探讨。

Tags:

最近发表
标签列表