Egg Vue SSR 服务端渲染数据请求与asyncData

Egg Vue SSR 是一个基于 Egg.js 和 Vue.js 的服务端渲染项 目,它能够将 Vue.js 组件在服务端渲染完成之后再返回给客户端,在一定程度上可以提高页面的首屏渲染速度和搜索引擎的爬取效果。为了更好的支持服务端渲染,Egg Vue SSR 提供了异步数据请求方法 asyncData。

asyncData 是在服务端执行的方法,而非在浏览器端执行,它可以用来获取组件所需的异步数据,可以与 Vue 的生命周期钩子一起使用。在渲染过程中,asyncData 可以将数据注入到组件的 data 中,从而避免在异步获取数据完成之前呈现空的组件。

以下是 Egg Vue SSR 中使用 asyncData 的完整攻略:

安装依赖

在 Egg Vue SSR 项目中使用 asyncData,需要先安装依赖vuex 和 vue-router:

npm install vuex vue-router --save

创建 Store 储存数据

为了方便在组件中全局调用,可以先在服务端创建一个 Vuex Store,用于储存公共的数据。

在组件中定义 asyncData 方法

在组件中,定义 asyncData 方法用来获取异步数据。asyncData 方法接收一个 context 参数,该参数将包含一些有用的信息,例如请求对象、route对象等。L azy Load Components 可以完美复用 asyncData 模块,因为每个 module 都可以独立的到处 asyncData,并且异步请求以静态方法的形式回传到组件内部。

在服务器端请求 asyncData 数据

在服务器端,可以利用 Vuex 官方提供的 Actions 要求 dispatch 方法来进行数据请求。 在 Egg Vue SSR 中,可以通过在 Context 关联上一个 Vue SSR Renderer 实例,然后由 Renderer 实例触发 asyncData 方法来进行数据获取。

以下是一个 Egg Vue SSR 中的 asyncData 示例代码:

// 在 store 中进行异步数据获取

const actions = {
  async fetchPost({
    commit
  }, payload) {
    const {
      postid
    } = payload
    const post = await api.get(`/post/${postid}`)
    commit('setPost', post)
  }
}

export default new Vuex.Store({
  state: {},
  mutations: {},
  actions
})


// 在组件中定义 asyncData 方法

import {
  mapActions,
  mapState
} from 'vuex'

export default {
  name: 'Post',
  async asyncData({
    store,
    route
  }) {
    const {
      params
    } = route
    await store.dispatch('fetchPost', {
      postid: params.id
    })
    return {}
  },
  computed: {
    ...mapState(['post'])
  },

  methods: {
    ...mapActions(['fetchPost'])
  }
}

// 在服务器端请求 asyncData 数据

export default app => {
  const renderer = app.view.createRenderer({
    template: require('fs').readFileSync(resolve(__dirname, './app.html'), 'utf-8')
  })
  app.get('*', async (req, res) => {
    const context = {
      title: 'Egg Vue SSR',
      url: req.url
    }
    const vueOptions = {
      data: {
        title: 'Egg Vue SSR',
        url: req.url
      },
      asyncData: this.$options.asyncData
    }
    const app = new Vue({
      data: vueOptions.data,
      router: createRouter(),
      store: createStore(),
      render: h => h(App, [
        h('div', {
          attrs: {
            id: 'app'
          },
          domProps: {
            innerHTML: '',
          },
        }),
      ]),
    })
    await renderer.renderToString(app, context)
    res.write(context.state)
    res.end()
  })
}

在这个示例中,我们首先在 store 中定义了一个 fetchPost actions,用于获取 post 数据。然后在组件中,定义了asyncData 方法,用来调度 fetchPost 方法,在获取 post 数据之后将结果存储到 post state 中。

最后,我们在服务器端请求 asyncData 数据,利用 Vue SSR Renderer 实例在执行时触发 asyncData 方法,将所得数据存储到 Context state之中,最终使用到页面 SSR 渲染过程中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Egg Vue SSR 服务端渲染数据请求与asyncData - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中setTimeout和setInterval函数的传参及调用

    当我们在编写JavaScript代码时,可能需要使用setTimeout和setInterval函数来实现定时调用某些操作,比如每隔一定时间更新页面显示内容等。在使用这两个函数时,传递参数并调用方式是非常重要的,下面我来详细讲解一下。 setTimeout函数的传参及调用 setTimeout函数用于指定一个时间后执行某个函数,其基本语法为: setTime…

    JavaScript 2023年6月11日
    00
  • uniapp改变底部安全区顶部手机信号时间电池栏颜色样式

    要实现uniapp改变底部安全区顶部手机信号时间电池栏颜色样式,我们可以通过修改程序的manifest.json文件来实现。 步骤如下: 1. 创建 uniapp 项目 在命令行中输入以下命令,即可创建一个新的uniapp项目: vue create –preset dcloudio/uni-preset-vue my-project 2. 修改 mani…

    JavaScript 2023年6月11日
    00
  • jQuery的DOM操作之删除节点示例

    下面是jQuery的DOM操作之删除节点示例的完整攻略。 一、为什么需要删除节点 Web页面通常需要根据真实情景来动态地添加或删除元素,以此来实现一些交互效果或动态展示数据,而jQuery框架中封装了大量的DOM操作方法,使得我们可以更加轻松地完成与页面元素有关的各种操作。 在页面制作中,有时候要动态的删除网页中的某些元素节点,例如通过ajax技术从服务器获…

    JavaScript 2023年6月10日
    00
  • javascript实现手机震动API代码

    很好,下面是详细讲解 JavaScript 实现手机震动 API 代码的完整攻略: 1. 确认浏览器支持性 首先需要确认浏览器是否支持 Vibration API(震动 API)。可以通过以下代码来检测: // 判断浏览器是否支持 Vibration API(震动 API) if ("vibrate" in navigator) { co…

    JavaScript 2023年6月11日
    00
  • jQuery中使用animate自定义动画的方法

    当我们在前端开发中需要实现网站的动态效果时,很多情况下需要使用动画效果,而jQuery中是提供了一个非常方便的动画库——animate,它能够轻松实现元素的自定义动画。下面是使用animate实现自定义动画的步骤: 步骤1:引入jQuery库 在html文档中引入jQuery库的代码如下: <script src="https://cdn.b…

    JavaScript 2023年6月11日
    00
  • JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结

    下面我将详细讲解关于“JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结”的攻略以及示例说明。 标题 一、offset、scroll、client的应用说明 1. offset offset是获取元素相对于其offsetParent的位置信息,包括元素的宽高、距离上下左右的距离。使用offsetLeft和offsetTop属…

    JavaScript 2023年6月11日
    00
  • js日期相关函数总结分享

    JS日期相关函数总结分享 简介 日期在前端开发中非常常见,JavaScript原生提供了许多日期相关的函数,本文将会总结下这些相关函数。 获取Date对象 获取Date对象可以使用以下几个方式: new Date() 使用new Date()方式获取Date对象,可以获取当前日期时间。 const now = new Date(); // 获取当前日期 co…

    JavaScript 2023年5月27日
    00
  • JavaScript 简写语法

    JavaScript 简写语法 1、简写的闭包自执行函数(Immediately Invoked Function Expression (IIFE)) 使用括号将函数定义包裹起来,再在末尾加上另一对括号,即可创建一个自执行函数。例如: (() => { console.log(“Hello, world!”); })(); 2、简写的对象方法定义(M…

    JavaScript 2023年4月22日
    00
合作推广
合作推广
分享本页
返回顶部