首页 > 其他分享 >nuxt3_使用pinia实现服务器端渲染状态管理

nuxt3_使用pinia实现服务器端渲染状态管理

时间:2024-04-16 13:33:25浏览次数:21  
标签:const 服务器端 nuxt3 res pinia article id nuxt

目录

安装nuxt3的pinia包

pnpm i pinia @pinia/nuxt
yarn add pinia @pinia/nuxt
npm i pinia @pinia/nuxt

修改nuxt.config.ts的配置

// nuxt.config.ts
export default defineNuxtConfig({
  // ... 其他配置
  modules: [
    // ...
    '@pinia/nuxt',
  ],
})

在项目中创建pinia仓库

// /stores/index.js
import { defineStore } from 'pinia'
export const useRootStore = defineStore('root', {
  state: () => ({
    msg: '测试msg数据',
    articleData: {
      id: undefined,
      title: undefined,
      content: undefined,
    },
  }),
  getters: {},
})

创建本地的测试服务器用于测试ssr

import express from 'express'
import cors from 'cors'
const article = {
  title: 'hello world',
  content:
    'Eu pariatur aliquip enim enim officia laboris proident adipisicing duis aute ex labore nisi excepteur.',
}
const app = express()

app.use(cors())
app.use(express.json())

app.get('/article', cors(), (req, res) => {
  const { id } = req.query
  console.log('访问/article ' + new Date().toString())
  setTimeout(() => {
    res.send({ code: 200, data: { id:Number(id), ...article } })
  }, 1500)
})

app.listen(4520, err => {
  console.log('server is running at port 4520')
})

在nuxt项目中创建服务器端请求接口

// /server/article.get.js
export default defineEventHandler(async event => {
  // console.log(event)
  const { id } = getQuery(event)
  return new Promise(async (resolve, reject) => {
    const res = await $fetch(`http://127.0.0.1:4520/article?id=${id}`).catch(err => err)
    if (res.code === 200) {
      resolve(res)
    } else {
      reject(res)
    }
  })
})

/article/[id]路由页面中实现服务器端渲染

// /pages/article/[id].vue
<template>
  <div id="articleContainer">
    <p>{{ $rootStore?.msg }}</p>
    <p>id:{{ $rootStore?.articleData?.id }}</p>
    <p>标题:{{ $rootStore?.articleData?.title }}</p>
    <p>内容:{{ $rootStore?.articleData?.content }}</p>
  </div>
</template>

<script setup>
import { useRootStore } from '~/stores/index'
const articleStore = useArticleStore()
const $route = useRoute()
const $rootStore = useRootStore()

//#region 初始化数据
initData()
async function initData() {
  const res = await useFetch(`/api/article?id=${$route.params.id}`)
  const res_ = res.data.value
  if (res_.code === 200) {
    $rootStore.$patch({
      articleData: { ...res_.data },
    })
  }
}
//#endregion
</script>

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

使用postman向http://localhost:3000/article/95发送请求

  • 注释: localhost:3000是nuxt3项目的默认启动地址
  • 得到如下的html结构, 代表服务端渲染成功
<p data-v-inspector="pages/article/[id].vue:3:5">测试msg数据</p>
<p data-v-inspector="pages/article/[id].vue:4:5">id:95</p>
<p data-v-inspector="pages/article/[id].vue:5:5">标题:hello world</p>
<p data-v-inspector="pages/article/[id].vue:6:5">内容:Eu pariatur aliquip enim enim officia laboris proident adipisicing duis aute ex labore nisi excepteur.</p>

修改路由配置实现页面数据缓存

// nuxt.config.ts
  routeRules: {
    '/article/**': { ssr:true },
  },
  • 当路由设置为上面所示时, 每次向/article/[id]路由发起请求都会重新向服务器调用接口,
// 每次刷新页面服务器接口都会打印请求
访问/article Tue Apr 16 2024 13:21:37 GMT+0800 (中国标准时间)
访问/article Tue Apr 16 2024 13:23:28 GMT+0800 (中国标准时间)
访问/article Tue Apr 16 2024 13:23:30 GMT+0800 (中国标准时间)
  • 修改路由配置为
'/article/**': { swr: 60 }, // 页面数据缓存60s, 在缓存数据有效期间不向服务器发起新的请求
  • 修改后, 在60s内无论刷新多少次页面, 服务器接口只会打印一条请求
访问/article Tue Apr 16 2024 13:28:53 GMT+0800 (中国标准时间)

标签:const,服务器端,nuxt3,res,pinia,article,id,nuxt
From: https://www.cnblogs.com/lei0906/p/18137870

相关文章

  • flask框架图书管理系统服务器端
    fromflaskimportFlask,request,jsonifyapp=Flask(__name__)books=[{'id':1,'title':'book1','author':'au1'},{'id':2,'title':'book2','author':'au2'},......
  • Nuxt3+ESlint扁平化配置
    总结一下Nuxt3+ESlint扁平化配置2024/4/16前段时间在Nuxt3项目中使用ESLint时,发现ESLint更新了9.0.0版本,使用扁平化配置,在集成过程中遇到了些许问题,特此记录一下(在网上了解到扁平化配置早在ESLintv9.0.0前就提出来了)。关于ESLintv9.0.0迁移指南:从ESLin......
  • linux检测远程服务器端口
    nc命令检测端口是否开放nc-zvIP端口-端口#比如检测192.168.3.34的22到100端口nc-zv192.168.3.3422-100#也可以指检测一个端口,比如192.168.3.34的22端口nc-zv192.168.3.3422nc是netcat工具的命令,是一个很好用的网络工具。比如,可以用来端口扫描,文件传输等......
  • Vuex和Pinia
    一、区别     pinia它没有mutation,他只有state,getters,action【同步、异步】使用他来修改state数据。pinia默认也是存入内存中,如果需要使用本地存储,配置上比vuex麻烦一点。pinia语法比vuex更容易理解和使用,灵活。pinia没有modules配置,没一个独立的仓库,都是definSto......
  • Vue3+TS+Vite+pinia
    一、创建项目    创建文件夹,然后cmd,输入以下内容。然后选择TS版本。npmcreatevite二、安装依赖   在vscode中,使用终端,输入命令 npmi三、安装其他插件    3.1、路由vue-router        多页面应用需要安装路由。所以需要使用v......
  • 03_Pinia的使用
    官网:Pinia|TheintuitivestoreforVue.js(vuejs.org)Pinia是一个轻量级的状态管理库。Pinia可以处理大型项目中复杂的状态管理需求,而父传子、子传父以及跨组件通信,可以解决一些简单的状态传递问题。打开cmd转到当前项目目录下,安装命令:npminstallpinia 修改main.js......
  • Pinia - vue 的状态管理库
    Pinia-vue的状态管理库1.介绍Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态。2.安装和注册Pinia安装piniayarnaddpinia注册piniaimport{createApp}from'vue'import{createPinia}from'pinia'importAppfrom'./App.vue'constpini......
  • TCP客户端及服务器端开发实践
    一、TCP客户端及服务器端开发实践1、TCP网络应用程序开发分类①TCP客户端应用程序开发②TCP服务器端应用程序开发客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。那如何记忆呢?主动发起建立连接请求的是客户端......
  • Nuxt3-自定义路由配置以及使用自定义布局layout
    一、不自定义路由下,如何使用自定义布局1、根目录下app.vue<template><div><NuxtLayout><NuxtPage/></NuxtLayout></div></template>2、layout文件夹下新建文件main.vue<template><divclass="_app">......
  • nuxt3 useFetch 刷新或首次进入报错
    从其他页面跳转过来正常,但是刷新会报错<scriptlang="ts"setup>constpositionOption=ref([]);constinitData=()=>{useFetch('/api/getTagsByKey',{query:{tagKey:'position'......