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(译)

    下面就为您详细讲解“编写高性能JavaScript(译)”的完整攻略。 一、前言 JavaScript 是当前最流行的编程语言之一,但它的性能往往会成为我们的瓶颈。而编写高性能的 JavaScript 可以节省服务器资源、提高用户体验。本攻略将为大家介绍如何编写高性能 JavaScript 的方法和技巧。 二、准备工作 编写高性能 JavaScript 的前…

    JavaScript 2023年5月18日
    00
  • 如何使用js获取扩展名详解

    如何使用js获取扩展名详解 在JavaScript中获取文件扩展名可以使用多种方法,比如使用正则表达式或者内置函数等。以下是常见的获取文件扩展名的方法,包括两个示例说明。 通过字符串截取获取扩展名 这是最简单的方法,基本思路是将字符串从后往前查找第一个.的位置,然后截取这个位置及后面的字符作为扩展名。 function getExtensionString(…

    JavaScript 2023年5月27日
    00
  • JavaScript代码性能优化总结(推荐)

    JavaScript代码性能优化总结(推荐)攻略 前言 随着Web技术的不断发展,JavaScript作为一种非常重要的脚本语言,已经成为在Web中开发中的不可少的一部分。在实际开发中,我们经常会遇到JS代码运行缓慢,导致页面卡顿,影响用户体验的问题。本文将分享一些JS代码性能优化的实用技巧。 如何优化JS代码性能 1. 减少代码中的DOM操作 操作DOM是…

    JavaScript 2023年6月11日
    00
  • js 使FORM表单的所有元素不可编辑的示例代码

    js实现使FORM表单所有元素不可编辑的示例代码主要有以下三个步骤: 获取FORM表单中所有表单元素 遍历FORM表单中所有表单元素,将其属性设置为不可编辑 阻止表单的默认提交行为 下面分别讲解每个步骤的实现方法。 第一步:获取FORM表单所有表单元素 在JS中,可以通过querySelectorAll()方法获取FORM表单中所有的表单元素,如下所示: c…

    JavaScript 2023年6月10日
    00
  • JavaScript中从setTimeout与setInterval到AJAX异步

    JavaScript中从setTimeout与setInterval到AJAX异步 setTimeout与setInterval setTimeout setTimeout是JavaScript中的一个定时器函数,它接受2个参数:一个函数和一个时间(单位为毫秒)。当函数被发送到浏览器的事件队列时,它会在指定的时间之后执行。 setTimeout(functi…

    JavaScript 2023年6月11日
    00
  • JS实现微信里判断页面是否被分享成功的方法

    实现微信里判断页面是否被分享成功的方法主要需要借助微信JS-SDK提供的能力。以下是实现步骤: 步骤一:引入微信JS-SDK 首先,在网站中引入微信JS-SDK相关代码。代码示例如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script…

    JavaScript 2023年6月11日
    00
  • JavaScript实现生成GUID(全局统一标识符)

    生成GUID是前端开发中非常常见的需求之一,在JavaScript中实现也非常简单,可以通过以下步骤完成: 导入uuid库 JavaScript本身并没有原生的生成GUID的函数,但是可以通过第三方库来实现,其中最常用的就是uuid库。可以通过以下命令将uuid库导入到项目中: npm install uuid –save 使用uuid库生成GUID 成功…

    JavaScript 2023年6月10日
    00
  • 基于javascript实现动态显示当前系统时间

    实现动态显示当前系统时间的方法之一是基于javascript语言。下面是基于javascript实现动态显示当前系统时间的攻略: 实现方法 要实现动态显示当前系统时间,可以使用以下步骤: 创建一个HTML页面,并在页面中添加一个<div>元素,用于容纳显示系统时间的内容。 在<div>元素中添加一个空的<span>元素,用…

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