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

yizhihongxing

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 MVC 样式框架

    当今的Web开发离不开MVC框架,它能让我们的代码更易于管理、维护和协作。但是,一些开发者现在正在探索MVC框架的初始实现,也就是说,如何将M,V和C组件组合在一起,以便快速实现自己的JavaScript应用程序。 在本文中,我们将讲解如何使用面向对象的技术,将JavaScript M,V和C组件结合在一起,以快速实现MVC框架。接下来的步骤将帮助你了解如何…

    JavaScript 2023年6月11日
    00
  • prototype与jquery下Ajax实现的差别

    Prototype和jQuery都是JavaScript的库,提供了各种有用的函数和工具,可以轻松地编写JavaScript代码。Prototype是一个类库,它提供了许多实用的JavaScript函数和对象,其中包含一个Ajax请求,并且使用XMLHttpRequest对象来实现。jQuery是一个快速且精简的JavaScript库,它提供了一组优化的功能…

    JavaScript 2023年6月11日
    00
  • js中作用域的实例解析

    JS中作用域的实例解析 在JavaScript中,作用域(Scope)是指访问变量、函数等标识符的范围。JavaScript的作用域基于函数(Function)而非块级作用域(Block Scope),这意味着变量的作用域在代码块 {} 中没有意义,而是在它们所在的函数中定义的。本篇攻略将通过实例来详细讲解JS中作用域的概念。 一、全局作用域 全局作用域(G…

    JavaScript 2023年6月10日
    00
  • js如何判断输入字符串长度

    JS如何判断输入字符串长度分两个方面来讲,第一个方面是字节长度,第二个方面是字符长度。 字节长度 在计算字节长度的时候,JS中一般使用Buffer.byteLength函数。 Buffer.byteLength方法 Buffer.byteLength方法的作用是用来计算一个字符串的字节长度。它的使用方法如下: const str = ‘hello world…

    JavaScript 2023年5月28日
    00
  • 在js代码拼接dom对象到页面上去的模板总结(必看)

    标题: 在JS代码拼接DOM对象到页面上的模板总结 在前端开发中,操作DOM节点是一个非常基础但又非常重要的任务。在JavaScript中,我们可以通过拼接DOM对象来实现动态渲染页面的目的,这种方式通常被称为“JS代码拼接DOM对象到页面上的模板”,本文将为您详细介绍该模板的使用方法和注意事项。 使用方法 对于JS代码拼接DOM对象到页面上,我们通常可以使…

    JavaScript 2023年6月10日
    00
  • javascript 获取图片尺寸及放大图片

    获取图片尺寸及放大图片是前端开发中比较常见的需求,下面介绍如何使用JavaScript实现。 获取图片尺寸 我们可以使用Image对象来获取图片的尺寸。 const img = new Image(); img.src = "image.jpg"; img.onload = function() { console.log(`图片宽度:$…

    JavaScript 2023年6月11日
    00
  • Jsoup解析HTML实例及文档方法详解

    Jsoup是什么? Jsoup是一个Java的HTML解析器,可用于从网页中提取和处理数据。 Jsoup常用的文档方法 ① connect方法:建立到指定URL的连接,并返回一个Connection对象 例如: Connection connection = Jsoup.connect("https://www.example.com")…

    JavaScript 2023年6月11日
    00
  • 今天分享几个少见却很有用的 JS 技巧

    今天分享几个少见却很有用的 JS 技巧 技巧一:使用逻辑运算符对变量进行赋值 在 JavaScript 中,逻辑运算符可以用来对变量进行赋值。比如,我们想要将一个变量的值限制在某一范围内,可以使用以下方式: var num = 5; num = (num <= 10) ? num : 10; console.log(num); // 输出5 num =…

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