• Nuxt.js详解(二)


    目录

    6. ajax操作

    6.1 整合 axios

    6.1.1 默认整合

    6.1.2 手动整合(可选)

    6.1.3 常见配置

    6.2 使用axios发送ajax

    6.3 使用asyncData发送 ajax

    6.3.1 发送一次请求

    6.3.2 发送多次请求

    6.4 使用fetch发送 ajax

    6.5 插件:自定义axios

    6.5.0 分析

    6.5.1 客户端

    6.5.2 服务端

    6.5.3 插件配置总结

    6.5.4 服务器端插件使用总结

    7. Vuex 状态树

    7.1 根模块数据操作

    7.2 其他模块数据操作

    7.3 完整vuex模板

    8. nuxt流程总结

    9 综合练习

    9.1 练习1:学生列表

    9.2 练习2:

    9.2.1 表结构:

    9.2.2 需求:查询

    9.2.3 扩展需求:添加

    6. ajax操作

    6.1 整合 axios

    6.1.1 默认整合

    • 在构建项目时,如果选择axios组件,nuxt.js将自动与axios进行整合

       

    6.1.2 手动整合(可选)

    • 步骤1:package.json有axios的版本

               

      1.  "dependencies": {
      2.    "@nuxtjs/axios": "^5.13.1",
      3. },
    • 步骤2:安装

      npm install

    • 步骤3:nuxt.config.js 以模块的方式添加axios

       

      1.  modules: [
      2.    // https://go.nuxtjs.dev/axios
      3.    '@nuxtjs/axios',
      4. ],

    6.1.3 常见配置

    • 修改 nuxt.config.js 进行baseURL的配置

       

      1.  // Axios module configuration: https://go.nuxtjs.dev/config-axios
      2.  axios: {
      3.    baseURL:'http://localhost:10010/'
      4. },

    6.2 使用axios发送ajax

    • vue页面中,通过 this.$axios.xxx() 操作ajax。this.$axios 与之前 axios等效。

      1. this.$axios.post("/search-service/search",this.searchMap).then( res => {
      2.    //获得查询结果
      3.    this.searchResult = res.data.data;
      4. });

    6.3 使用asyncData发送 ajax

    • asyncData中的ajax将在“前端服务端执行”,在浏览器看到是数据,而不是ajax程序。

       

    6.3.1 发送一次请求

    • 语法:

    1. export default {
    2. async asyncData( context ) {  //context就相当于其他地方的this
    3.        //发送ajax
    4.        let { data } = await context.$axios.get('路径','参数')
    5.        // 返回结果
    6.        return {变量: 查询结果从data获取 }
    7. },
    8. }
    • 实例

      1. <template>
      2.  <div>{{echo}}div>
      3. template>
      4. <script>
      5. export default {
      6.  async asyncData(context) {
      7.    // 发送ajax
      8.    let {data} = await context.$axios.get('/service-consumer/feign/echo/abc')
      9.    // 返回数据
      10.    return {
      11.      echo: data
      12.   }
      13. },
      14. }
      15. script>
      16. <style>
      17. style>

    6.3.2 发送多次请求

    • 语法1:

      1. export default {
      2.    async asyncData( content ) {
      3.        let [结果1,结果2] = await Promise.all([ ajax请求1, ajax请求2])
      4.        return {
      5.            变量1: 结果1,
      6.            变量2: 结果2
      7.       }
      8.   },
      9. }
    • 语法2:

      1. export default {
      2.    async asyncData( content ) {
      3.        let [{数据:别名1},{数据:别名2}] = await Promise.all([ ajax请求1, ajax请求2])
      4.        return {
      5.            变量1: 别名1,
      6.            变量2: 别名2
      7.       }
      8.   },
      9. }
      1. //演化过程
      2. let response = ajax请求
      3. let [response,response] = await Promise.all([ajax1,ajax2])
      4. let [{data},{data}] = await Promise.all([ajax1,ajax2])
      5. let [{data:别名1},{data:别名2}] = await Promise.all([ajax1,ajax2])

    • 实例

    1. <template>
    2.  <div>{{echo}} {{echo2}}div>
    3. template>
    4. <script>
    5. export default {
    6.  async asyncData(context) {
    7.    // 发送ajax
    8.    let [{data:echo}, {data:echo2}] =
    9.                await Promise.all([
    10.                    context.$axios.get('/service-consumer/feign/echo/abc'),
    11.                    context.$axios.get('/service-consumer/client/echo/abc')
    12.               ])
    13.    // 返回数据
    14.    return {
    15.      echo,
    16.      echo2
    17.   }
    18. },
    19. }
    20. script>
    21. <style>
    22. style>

    6.4 使用fetch发送 ajax

    • fetch 方法用于在渲染页面前填充应用的状态树(store)数据, 与 asyncData 方法类似,不同的是它不会设置组件的数据。

     

    • 步骤1:创建store/index.js

      1. export const state = () => ({
      2.  str: 0
      3. })
      4. export const mutations = {
      5.  setData (state, value) {
      6.    state.str = value
      7. }
      8. }

    • 步骤2:测试页面

      1. <template>
      2.  <div>
      3.    
      4.    {{$store.state.str}}
      5.  div>
      6. template>
      7. <script>
      8. export default {
      9.  async fetch( {store, $axios} ) {
      10.    // 发送ajax
      11.    let { data } = await $axios.get('/service-consumer/feign/echo/abc')
      12.    // 设置数据
      13.    store.commit('setData' , data )
      14. }
      15. }
      16. script>
      17. <style>
      18. style>

    6.5 插件:自定义axios

    6.5.0 分析

     

    6.5.1 客户端

    • 步骤一:在nuxt.conf.js中配置客户端插件,设置 mode 为 client

      1.  plugins: [
      2.   { src: '~plugins/api.js', mode: 'client' }
      3.    //{ src: '~plugins/api.js', ssr: false }
      4. ],

       

    • 步骤二:编写 plugins/api.js 对 内置的 $axios进行增强

       

      1. //自定义函数
      2. const request = {
      3.  test : (params) => {
      4.    return axios.get('/service-consumer/feign/echo/abc',{
      5.      params
      6.   })
      7. },
      8. }
      9. var axios = null
      10. export default ({ $axios }, inject) => {
      11.  //3) 保存内置的axios
      12.  axios = $axios
      13.  //4) 将自定义函数交于nuxt
      14.  // 使用方式1:在vue中,this.$request.xxx()
      15.  // 使用方式2:在nuxt的asyncData中,content.app.$request.xxx()
      16.  inject('request', request)
      17. }

    6.5.2 服务端

    • 步骤一:配置服务端插件,设置 mode 为 server

      1.  plugins: [
      2.   { src: '~plugins/api.js', mode: 'client' },
      3.   { src: '~plugins/api.server.js', mode: 'server' },
      4.    //{ src: '~plugins/api.js', ssr: false },
      5.    //{ src: '~plugins/api.server.js', ssr: true }
      6. ],
    • 步骤二:编写 plugins/api.server.js 对 内置的 $axios进行增强

      1. const request = {
      2.  test : (params) => {
      3.    return axios.get('/service-consumer/feign/echo/abc',{
      4.      params
      5.   })
      6. },
      7.  
      8. }
      9. var axios = null
      10. export default ({ $axios, redirect, process }, inject) => {
      11.  //赋值
      12.  axios = $axios
      13.  //4) 将自定义函数交于nuxt
      14.  // 使用方式1:在vue中,this.$requestServer.xxx()
      15.  // 使用方式2:在nuxt的asyncData中,content.app.$requestServer.xxx()
      16.  inject('requestServer', request)
      17. }
    • 注意:前端服务端插件,不支持切换路由。也就是说刷新可以可以访问,使用切换不能访问。解决方案:修改mode,支持client和service。

    6.5.3 插件配置总结

    1. //方式1:通过src设置文件,通过mode设置模式
    2. plugins: [
    3. { src: '~/plugins/apiclient.js', mode: 'client' }, //前端客户端
    4. { src: '~/plugins/apiserver.js', mode: 'server' }, //前端服务端
    5.   { src: '~/plugins/api.js' } //前端客户端 + 前端服务端
    6. ]
    7. //方式2:通过命名来确定模式
    8. plugins: [
    9.    '~/plugins/api.client.js', //前端客户端
    10.    '~/plugins/api.server.js', //前端服务端
    11.    '~/plugins/api.js', //前端客户端 + 前端服务端
    12. ]

    6.5.4 服务器端插件使用总结

    7. Vuex 状态树

    7.1 根模块数据操作

    • 步骤一:创建 store/index.js 添加一个 counter变量,并可以继续累加操作

      1. export const state = () => ({
      2.  counter: 0
      3. })
      4. export const mutations = {
      5.  increment (state) {
      6.    state.counter++
      7. }
      8. }
    • 步骤二:在页面中,使用

      1. <template>
      2.  <div>
      3.   首页 {{counter}}
      4.    <input type="button" value="+" @click="increment"/>
      5.  div>
      6. template>
      7. <script>
      8. import { mapState,mapMutations } from 'vuex'
      9. export default {
      10.  computed: {
      11.    ...mapState(['counter'])
      12. },
      13.  methods: {
      14.    ...mapMutations(['increment'])
      15. },
      16. }
      17. script>
      18. <style>
      19. style>

    7.2 其他模块数据操作

    • 步骤一:创建其他模块 store/book.js

      1. export const state = () => ({
      2.  money: 0
      3. })
      4. export const mutations = {
      5.  addmoney (state) {
      6.    state.money += 5
      7. }
      8. }
    • 步骤二:使用指定模块中的数据

      1. <template>
      2.  <div>
      3.   首页 {{money}}
      4.    <input type="button" value="+" @click="addmoney" />
      5.  div>
      6. template>
      7. <script>
      8. import { mapState,mapMutations } from 'vuex'
      9. export default {
      10.  computed: {
      11.    money () {
      12.      return this.$store.state.book.money
      13.   }
      14. },
      15.  methods: {
      16.    ...mapMutations({
      17.      addmoney: 'book/addmoney'
      18.   })
      19. },
      20. }
      21. script>
      22. <style>
      23. style>

    7.3 完整vuex模板

    1. // state为一个函数, 注意箭头函数写法
    2. const state = () => ({
    3.  user: 'jack'
    4. })
    5. // mutations为一个对象
    6. const mutations = {
    7.  setUser(state, value) {
    8.    state.counter = value
    9. }
    10. }
    11. // action执行mutation
    12. const actions = {
    13.  userAction (context,value){
    14.    // 可以发送ajax
    15.    context.commit('setUser',value)
    16. }
    17. }
    18. // 获取数据
    19. const getters = {
    20.  getUser (state) {
    21.    return state.user
    22. }
    23. }
    24. export default {
    25.  namespace: true, // 命名空间,强制要求,在使用时,加上所属的模块名,例如:book/addmoney
    26.  state,
    27.  mutations,
    28.  actions,
    29.  getters
    30. }

    8. nuxt流程总结

     

    9 综合练习

    9.1 练习1:学生列表

    • 表结构

      1. #班级表
      2. create table tab_class(
      3. cid int primary key auto_increment,
      4. cname varchar(50)
      5. );
      6. insert into tab_class(cid, cname) values(1,'Java56');
      7. insert into tab_class(cid, cname) values(2,'Java78');
      8. #学生表
      9. create table tab_student(
      10. sid int primary key auto_increment,
      11. sname varchar(50),
      12. cid int
      13. );
      14. insert into tab_student(sname,cid) values('张三',1);
      15. insert into tab_student(sname,cid) values('李四',1);
      16. insert into tab_student(sname,cid) values('王五',2);
      17. insert into tab_student(sname,cid) values('赵六',2);
    • 需求:查询学生列表信息

      • 要求1:可以进行“班级”条件查询

      • 要求2:对“班级”数据进行SEO

      • 要求3:学生数据不进行SEO

    9.2 练习2:

    9.2.1 表结构:

    1. CREATE TABLE tb_teacher(
    2. tid INT PRIMARY KEY AUTO_INCREMENT,
    3. tname VARCHAR(50) COMMENT '老师姓名',
    4. TYPE INT COMMENT '老师类型:1.授课老师、2.助理老师、3.辅导员老师'
    5. );
    6. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(1,'梁桐老师',1);
    7. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(2,'马坤老师',2);
    8. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(3,'仲燕老师',3);
    9. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(4,'袁新奇老师',1);
    10. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(5,'任林达老师',2);
    11. INSERT INTO tb_teacher(tid,tname,TYPE) VALUES(6,'王珊珊老师',3);
    12. CREATE TABLE tb_class(
    13. cid INT PRIMARY KEY AUTO_INCREMENT,
    14. cname VARCHAR(50) COMMENT '班级名称',
    15. teacher1_id INT COMMENT '授课老师',
    16. teacher2_id INT COMMENT '助理老师',
    17. teacher3_id INT COMMENT '辅导员老师'
    18. );
    19. INSERT INTO tb_class(cid,cname,teacher1_id,teacher2_id,teacher3_id) VALUES(1,'Java56',1,2,3);
    20. INSERT INTO tb_class(cid,cname,teacher1_id,teacher2_id,teacher3_id) VALUES(2,'Java78',1,2,3);
    21. INSERT INTO tb_class(cid,cname,teacher1_id,teacher2_id,teacher3_id) VALUES(3,'Java12',4,5,6);
    22. INSERT INTO tb_class(cid,cname,teacher1_id,teacher2_id,teacher3_id) VALUES(4,'Java34',4,5,6);

    9.2.2 需求:查询

    • 需求:使用“自定义axios”完成

      • 查询班级详情

      • 通过班级名称模糊查询

      • 查询班级的同时,查询老师信息

     

    9.2.3 扩展需求:添加

     

  • 相关阅读:
    机器人方向与高考选专业的一些误区
    使用Docker Compose发布SpringBoot项目
    【RabbitMQ 实战】08 集群原理剖析
    React项目实战之租房app项目(四)长列表性能优化&城市选择模块渲染列表
    (附源码)ssm考务管理系统 毕业设计 221504
    【云原生之k8s】K8s 管理工具 kubectl 详解(一)
    壳聚糖接枝聚乙醇酸共聚物水凝胶/木质素磺酸钠/聚唾液酸-壳聚糖衍生物水凝胶的制备
    MongoDB 7.0 搭建 Sharding 副本集群
    Servlet—servlet概述
    使用html+css实现一个静态页面(厦门旅游网站制作6个页面) 旅游网页设计制作 HTML5期末考核大作业,网站——美丽家乡。 学生旅行 游玩 主题住宿网页
  • 原文地址:https://blog.csdn.net/weixin_45481821/article/details/127047778