【前端高频面试题--Vue路由篇】

🚀 作者 :“码上有前”
🚀 文章简介 :前端高频面试题
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

在这里插入图片描述

前端高频面试题--Vue路由篇

  • 对Vue-Router的理解
  • Vue路由懒加载的实现
  • 路由的hash和history模式
  • 如何获取页面的hash变化
  • 路由中`$route `和`$router `的区别
  • 如何定义动态路由?如何获取传过来的动态参数
  • Vue-router 路由钩子在生命周期的体现
  • Vue-router跳转和location.href有什么区别
  • params和query的区别
  • Vue-router 导航守卫有哪些

对Vue-Router的理解

Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页面应用程序(SPA)。它能够实现客户端的路由跳转、导航以及组件的动态加载,使得开发单页面应用变得更加简单和高效。

以下是对 Vue Router 的一些理解:

  1. 路由映射
    Vue Router 允许我们在应用程序中定义多个路由,并将每个路由与对应的组件进行映射。通过配置路由映射,可以在不同的 URL 下加载不同的组件,实现单页面应用的多页面效果。

  2. 嵌套路由
    Vue Router 支持嵌套路由,这意味着我们可以在组件中定义子路由。通过嵌套路由,我们可以构建更复杂的应用程序结构,使得页面的组织更加清晰和灵活。

  3. 路由导航
    Vue Router 提供了丰富的导航方法,如 pushreplacego,用于在应用程序中进行路由导航。通过调用这些方法,我们可以在组件内部进行路由跳转,实现页面之间的切换和导航。

  4. 路由参数
    Vue Router 支持动态路由参数,通过在路由路径中使用冒号(:)来指定参数的占位符。这使得我们可以定义带有动态参数的路由,并在组件中获取和使用这些参数。

  5. 导航守卫
    Vue Router 提供了导航守卫钩子函数,如 beforeEachbeforeResolveafterEach,用于在路由导航过程中执行一些操作。通过导航守卫,我们可以在路由跳转之前或之后执行逻辑,例如验证用户权限、加载数据等。

  6. 懒加载
    Vue Router 支持组件的懒加载,即在需要时才加载组件的代码。这可以提高应用程序的性能,减少初始加载时间,并根据需要动态加载组件。

  7. 路由模式
    Vue Router 支持不同的路由模式,包括 Hash 模式和 History 模式。Hash 模式使用 URL 中的 hash(#)来模拟路由,而 History 模式使用 HTML5 的 History API 来管理路由。可以根据项目需求选择适合的路由模式。

通过使用 Vue Router,我们可以轻松构建复杂的单页面应用程序,实现页面的路由导航、参数传递、组件的懒加载等功能。它与 Vue.js 框架紧密集成,提供了一种优雅且功能强大的方式来管理应用程序的路由。

Vue路由懒加载的实现

在 Vue.js 中使用 Vue Router 时,可以通过懒加载(Lazy Loading)的方式按需加载路由组件,以提高应用的初始加载速度和性能。

懒加载可以将路由组件分割为更小的代码块,并在需要时动态加载。这意味着在初始加载页面时,只会加载必要的代码,而不会一次性加载所有路由组件的代码。

要实现懒加载,可以使用 Webpack 的动态 import 语法(import())或者 Vue CLI 的异步组件(Async Components)语法。这些语法允许将组件的导入延迟到需要时再进行加载。

以下是一个使用懒加载的示例,展示了如何在 Vue Router 中实现懒加载:

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('./views/Home.vue')  // 使用动态 import 语法懒加载组件
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('./views/About.vue')  // 使用动态 import 语法懒加载组件
  }
];

const router = new VueRouter({
  routes
});

export default router;

在上述示例中,通过使用动态 import 语法 import(),将需要懒加载的组件进行延迟加载。当路由被访问时,对应的组件才会被加载。

在实际开发中,可以根据需要将需要懒加载的组件按照路由进行拆分,并在对应的路由配置中使用懒加载语法来引入组件。

通过懒加载可以将应用的初始加载大小缩小,提高应用的加载速度,并在用户访问对应路由时再进行组件的加载,从而提升用户体验和应用性能。

路由的hash和history模式

在 Vue Router 中,有两种常见的路由模式:Hash 模式和 History 模式,它们之间有一些区别。

  1. Hash 模式

    • 使用 URL 中的 hash(即 # 符号)来模拟路由,例如 http://example.com/#/about
    • Hash 模式不会将路由发送到服务器,所有的路由都在客户端进行处理。
    • 在使用 Hash 模式时,路由的变化不会触发浏览器向服务器发送请求,因此适用于静态网页或不支持服务端配置的环境。
    • Hash 模式在旧版浏览器中具有良好的兼容性。
  2. History 模式

    • 使用 HTML5 的 History API 来管理路由,没有 # 符号,例如 http://example.com/about
    • History 模式允许路由的变化通过向服务器发送请求,服务器需要正确配置以支持这种模式。
    • 在 History 模式下,可以使用 pushStatereplaceState 方法来改变 URL,而不会引起页面的刷新。
    • 使用 History 模式时,需要在后端进行相应的配置,以确保在直接访问路由时返回正确的页面。

区别总结如下:

  • URL 格式:Hash 模式使用带有 # 符号的 URL,而 History 模式使用无 # 符号的 URL。
  • 路由变化的触发:Hash 模式的路由变化不会触发向服务器发送请求,而 History 模式可以触发向服务器发送请求。
  • 服务端配置:Hash 模式不需要服务器端配置,而 History 模式需要服务器端配置以确保在直接访问路由时返回正确的页面。
  • 兼容性:Hash 模式在旧版浏览器中具有良好的兼容性,而 History 模式可能需要一些 polyfill 来支持旧版浏览器。

在使用 Vue Router 时,默认使用的是 Hash 模式,可以通过配置路由的 mode 参数来切换到 History 模式。例如:

const router = new VueRouter({
  mode: 'history',
  routes: [...]
});

需要注意的是,在使用 History 模式时,还需要确保服务器端正确配置,以处理直接访问路由的情况。如果没有正确配置,直接访问路由会返回 404 错误。

如何获取页面的hash变化

要获取页面的 hash 变化,可以使用 JavaScript 中的 window.onhashchange 事件或者 Vue Router 提供的导航守卫钩子函数。

  1. 使用 window.onhashchange 事件

    window.onhashchange = function() {
      const newHash = window.location.hash;
      console.log('Hash changed:', newHash);
    };
    

    上述代码会在页面的 hash 变化时触发 onhashchange 事件,并在事件处理函数中获取新的 hash 值。

  2. 使用 Vue Router 导航守卫钩子函数
    如果你正在使用 Vue Router,可以使用其提供的导航守卫钩子函数来监听路由的变化,包括 hash 的变化。

    • beforeEach: 在每次路由跳转之前触发。
    • afterEach: 在每次路由跳转之后触发。

    例如,在 Vue Router 中使用 afterEach 钩子函数来获取 hash 变化:

    import router from './router';
    
    router.afterEach((to, from) => {
      const newHash = window.location.hash;
      console.log('Hash changed:', newHash);
    });
    

    上述代码会在每次路由跳转完成后触发 afterEach 钩子函数,并在函数中获取新的 hash 值。

无论是使用 window.onhashchange 事件还是 Vue Router 的导航守卫钩子函数,都能够让你在页面的 hash 变化时获取到新的 hash 值,并进行相应的处理。

路由中$route $router 的区别

在 Vue Router 中,$route$router 是两个不同的对象,它们的作用和功能略有不同。

  1. $route 对象

    • $route 是一个用于访问当前活动路由的对象。
    • 它包含了当前路由的信息,如路径、参数、查询参数、哈希值等。
    • $route 是一个只读对象,不能直接修改其中的属性。
    • 在组件内部可以通过 this.$route 来访问 $route 对象。
  2. $router 对象

    • $router 是一个用于进行路由导航的对象。
    • 它提供了一些方法,如 pushreplacego,用于在应用程序中进行路由跳转、导航。
    • $router 对象是可写的,可以通过调用方法改变当前的路由状态。
    • 在组件内部可以通过 this.$router 来访问 $router 对象。

总结区别如下:

  • $route 是一个只读对象,用于访问当前路由的信息。
  • $router 是一个可写对象,用于进行路由导航和控制当前路由状态。
  • $route 提供了当前路由的信息,而 $router 提供了路由导航的方法。

示例用法:

export default {
  methods: {
    goToAboutPage() {
      // 使用 $router 对象进行路由跳转
      this.$router.push('/about');
    },
    logCurrentRoute() {
      // 使用 $route 对象获取当前路由的信息
      console.log('Current route:', this.$route.path);
    }
  }
}

在上述示例中,goToAboutPage 方法使用 $router 对象的 push 方法进行路由跳转,而 logCurrentRoute 方法使用 $route 对象的 path 属性获取当前路由的路径信息。

如何定义动态路由?如何获取传过来的动态参数

在 Vue Router 中,可以通过定义动态路由来匹配包含参数的路由路径,并且可以通过 $route 对象获取传递的动态参数。

  1. 定义动态路由
    在路由配置中,使用冒号(:)来指定动态参数的占位符。例如,如果要定义一个带有动态参数的路由,可以使用以下方式:

    const routes = [
      {
        path: '/user/:id',
        name: 'User',
        component: UserComponent
      }
    ];
    

    在上述示例中,/user/:id 定义了一个动态路由,:id 是一个占位符,表示该位置可以匹配任意值作为参数。

  2. 获取传递的动态参数
    通过 $route 对象可以获取传递给动态路由的参数。可以使用 $route.params 对象来访问这些参数。

    export default {
      created() {
        const userId = this.$route.params.id;
        console.log('User ID:', userId);
      }
    };
    

    在上述示例中,通过 $route.params.id 访问了传递给动态路由的 id 参数的值。

    如果在同一个组件中,通过不同的路由访问了同一个组件,当路由参数发生变化时,组件会重新创建,created 钩子函数会被再次调用,从而可以获取新的动态参数。

需要注意的是,当定义动态路由时,要确保在组件中正确处理和响应这些动态参数的变化,以便在参数变化时更新组件的状态或重新获取数据。

另外,如果需要在组件内部监听动态参数的变化,可以使用 beforeRouteUpdate 导航守卫钩子函数。该钩子函数会在路由参数发生变化时触发,并提供新的参数和旧的参数。

export default {
  beforeRouteUpdate(to, from, next) {
    const newUserId = to.params.id;
    const oldUserId = from.params.id;
    console.log('New User ID:', newUserId);
    console.log('Old User ID:', oldUserId);
    next();
  }
};

在上述示例中,beforeRouteUpdate 钩子函数接收三个参数:tofromnext。通过 to.params.idfrom.params.id 可以获取新的和旧的动态参数的值。

Vue-router 路由钩子在生命周期的体现

在 Vue Router 中,路由钩子函数的执行与组件的生命周期函数有一定的关联。路由钩子函数会在组件的生命周期中的特定阶段被触发调用,以执行相应的逻辑。下面是一些常用的路由钩子函数及其在组件生命周期中的体现:

  1. beforeEach

    • 生命周期体现:在组件创建之前调用。
    • 功能:在每次路由跳转之前执行一些逻辑,如验证用户权限、登录状态检查等。
    • 示例:
      router.beforeEach((to, from, next) => {
        // 执行逻辑
        next();
      });
      
  2. beforeRouteEnter

    • 生命周期体现:在组件被创建和添加到路由之前调用。
    • 功能:在组件进入路由之前执行一些逻辑,如预加载数据。
    • 示例:
      export default {
        beforeRouteEnter(to, from, next) {
          // 执行逻辑
          next();
        }
      };
      
  3. beforeRouteUpdate

    • 生命周期体现:在路由参数发生变化时,组件复用之前调用。
    • 功能:在组件复用之前执行一些逻辑,如根据新的路由参数更新组件的状态或重新加载数据。
    • 示例:
      export default {
        beforeRouteUpdate(to, from, next) {
          // 执行逻辑
          next();
        }
      };
      
  4. beforeRouteLeave

    • 生命周期体现:在离开当前路由之前调用。
    • 功能:在离开当前路由之前执行一些逻辑,如保存表单数据、提示用户是否离开等。
    • 示例:
      export default {
        beforeRouteLeave(to, from, next) {
          // 执行逻辑
          next();
        }
      };
      

这些路由钩子函数与组件的生命周期函数相结合,使得我们可以在组件不同的生命周期阶段执行特定的路由逻辑。通过这些钩子函数,我们可以在路由跳转前后执行一些操作,控制组件的加载、数据的获取、状态的更新等。这样,我们可以更加灵活地控制路由的行为,实现更复杂的应用逻辑。

Vue-router跳转和location.href有什么区别

Vue Router 跳转和 location.href 之间有一些关键区别,如下所示:

Vue Router 跳转

  • Vue Router 跳转是通过调用路由实例的方法实现的,例如使用 router.pushrouter.replacerouter.go
  • Vue Router 跳转是基于前端路由系统的,不会触发完整的页面刷新。只会更新应用程序中的组件和视图,从而实现单页面应用的无刷新路由跳转。
  • Vue Router 跳转可以利用路由参数、导航守卫等功能,实现更灵活的页面跳转和导航逻辑。
  • Vue Router 跳转可以实现组件的懒加载,按需加载所需的组件代码,提高页面加载性能。

location.href 跳转

  • location.href 是 JavaScript 中的原生属性,用于获取或设置当前页面的 URL。
  • location.href 跳转会触发完整的页面刷新,类似于用户在浏览器中输入新的 URL 或点击链接进行导航。
  • location.href 跳转会重新加载整个页面,包括重新请求资源、重新渲染页面和重置 JavaScript 环境等。
  • location.href 跳转不能直接利用 Vue Router 的功能,无法使用路由参数、导航守卫等功能。

总结起来,Vue Router 跳转和 location.href 之间的主要区别在于页面刷新和功能扩展的能力。Vue Router 跳转实现了无刷新的单页面应用路由跳转,并提供了丰富的功能和生命周期钩子函数。而 location.href 跳转会触发页面的完整刷新,适用于直接导航到新的 URL 地址或需要进行完整页面加载的场景。选择使用哪种方式取决于具体的需求,以及是否需要利用 Vue Router 的功能和路由管理能力。

params和query的区别

在路由系统中,params 和 query 是两种常用的参数传递方式,它们在功能和用法上有一些区别。

Params(路由参数)

  • 功能:Params 是通过路由路径中的动态参数来传递数据的方式。它用于匹配动态路由路径的一部分,可以将参数作为占位符来定义路由。
  • 示例:/user/:id
  • 用法:
    • 在定义路由时,使用冒号(:)来指定参数的占位符。
    • 在组件中,通过 $route.params 对象来访问传递的参数。
  • 示例代码:
    // 路由定义
    const routes = [
      {
        path: '/user/:id',
        name: 'User',
        component: UserComponent
      }
    ];
    
    // 组件中获取参数
    export default {
      created() {
        const userId = this.$route.params.id;
        console.log('User ID:', userId);
      }
    };
    

Query(查询参数)

  • 功能:Query 是通过 URL 中的查询字符串来传递数据的方式。它可以在路由路径后使用 ? 加上键值对的形式来传递参数。
  • 示例:/user?id=123
  • 用法:
    • 在定义路由时,不需要特别配置,可以直接在路由路径中使用查询参数。
    • 在组件中,通过 $route.query 对象来访问传递的参数。
  • 示例代码:
    // 路由定义
    const routes = [
      {
        path: '/user',
        name: 'User',
        component: UserComponent
      }
    ];
    
    // 组件中获取参数
    export default {
      created() {
        const userId = this.$route.query.id;
        console.log('User ID:', userId);
      }
    };
    

区别总结:

  • Params 是通过路由路径中的动态参数来传递数据,而 Query 是通过 URL 中的查询字符串来传递数据。
  • Params 用于匹配动态路由路径的一部分,而 Query 可以在路由路径后添加键值对的形式传递参数。
  • Params 需要在路由定义时配置占位符,而 Query 不需要特别配置,直接可以在路由路径中使用查询参数。
  • 在组件中获取 Params 使用 $route.params,获取 Query 使用 $route.query

根据具体的需求和场景,可以选择使用 Params 或 Query 来传递参数。Params 适合用于标识资源和路由导航,而 Query 适合用于筛选、过滤和可选参数。

Vue-router 导航守卫有哪些

Vue Router 提供了以下几种导航守卫:

  1. 全局前置守卫 (beforeEach):在路由切换之前被调用。

    • 功能:用于进行全局的前置验证、权限控制或跳转逻辑。
    • 示例:
      router.beforeEach((to, from, next) => {
        // 执行逻辑
        next();
      });
      
  2. 全局解析守卫 (beforeResolve):在路由被确认之前被调用,可以用于处理异步路由组件。

    • 功能:用于在路由被确认之前执行一些异步操作,确保路由组件及其依赖都被解析。
    • 示例:
      router.beforeResolve((to, from, next) => {
        // 执行逻辑
        next();
      });
      
  3. 全局后置钩子 (afterEach):在每次路由跳转之后被调用。

    • 功能:用于执行全局的后置逻辑,如页面滚动行为、埋点统计等。
    • 示例:
      router.afterEach((to, from) => {
        // 执行逻辑
      });
      
  4. 路由独享的守卫 (beforeEnter):在特定路由配置中定义的守卫。

    • 功能:用于在特定路由上定义独立的守卫逻辑,与全局守卫不同的是,仅应用于特定路由。
    • 示例:
      const routes = [
        {
          path: '/user',
          name: 'User',
          component: UserComponent,
          beforeEnter: (to, from, next) => {
            // 执行逻辑
            next();
          }
        }
      ];
      
  5. 组件内的守卫 (beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave):在组件内部定义的守卫。

    • 功能:用于在组件内部定义特定路由的守卫逻辑,可以访问组件实例和组件的生命周期钩子。
    • 示例:
      export default {
        beforeRouteEnter(to, from, next) {
          // 执行逻辑
          next();
        },
        beforeRouteUpdate(to, from, next) {
          // 执行逻辑
          next();
        },
        beforeRouteLeave(to, from, next) {
          // 执行逻辑
          next();
        }
      };
      

这些导航守卫可以通过在路由配置中定义相应的钩子函数来实现。它们可以用于控制路由的访问权限、执行跳转逻辑、处理异步组件等。通过结合不同的导航守卫,可以实现灵活的路由控制和导航逻辑。
都看到这了,点个赞吧,嘿嘿🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…

【剪辑必备】今天我教你如何手动去下载苹果官网4K预告片 完全免费

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起学习和进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&a…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号: T 002 。 \color{red}{本文项目编号:T002。} 本文项目编号:T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

儿时游戏“红色警戒”之“AI警戒”

一、红色警戒里“警戒”命令背后的算法原理是什么 在《红色警戒》系列即时战略游戏中,“警戒”命令背后的算法原理相对简单但又实用,其核心目标是让单位能够自动检测并反击一定范围内的敌方单位。虽然具体的实现细节未公开,但可以推测其基本…

【C++】类和对象(五)友元、内部类、匿名对象

前言:前面我们说到类和对象是一个十分漫长的荆棘地,今天我们将走到终点,也就是说我们对于C算是正式的入门了。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C学习 &…

C#根据权重抽取随机数

(游戏中一个很常见的简单功能,比如抽卡抽奖抽道具,或者一个怪物有多种攻击动作,按不同的权重随机出个攻击动作等等……) 假如有三种物品 A、B、C,对应的权重分别是A(50)&#xff0c…

寒假项目-酒店综合管理系统

目前所学的东西依然很有限,难以完成项目,目前只编写了部分代码加以参考。 test.c #ifndef __TEST_H__ #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.?.?" //服务器IP地址 #…

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信,也可以在以太网通信,有A-1E和Qna-3E两种模式,这两种都是三菱PLC通信协议中比较常用的两种,一般我们使用比较多的是以太网通信,对于FX5U系列/Q系列/Qna系列/L系列的PLC,…

糟糕,接口被刷了,怎么办?

前言 在面试时,经常会被问一个问题:如何防止别人恶意刷接口? 这是一个非常有意思的问题,防范措施挺多的。今天这篇文章专门跟大家一起聊聊,希望对你会有所帮助。 1 防火墙 防火墙是网络安全中最基本的安全设备之一&…

Python eval函数

在Python编程中,eval()函数是一个强大且灵活的内置函数,用于动态执行字符串表达式或代码。尽管eval()函数具有强大的功能,但它也带来了一些潜在的安全风险,因此在使用时需要谨慎。本文将深入探讨eval()函数的用法、语法、示例代码…

AI:129-基于深度学习的极端天气事件预警

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Kibana:如何嵌入 Kibana 仪表板

作者:Carly Richmond 像我这样的前端工程师经常提出的要求是将 Kibana 等来源的现有仪表板嵌入到 JavaScript Web 应用程序中。 这是我必须多次执行的任务,因为我们希望快速部署用户生成的视图或允许用户控制给定的视图。 从我们从精彩的开发者社区收到的…

安装 Windows Server 2019

1.镜像安装 镜像安装:Windows Server 2019 2.安装过程(直接以图的形式呈现) 先选择""我没有产品密钥"",选择桌面体验 选择自定义 设置密码后继续 安装成功

算法——组合数学——二项式定理

杨辉三角是二项式系数的典型应用当 n 较大,且需要取模时,二项式系数有两种计算方法: 一:递推公式,二:逆 方法一:用递推公式计算二项式系数 public class BinomialCoefficient {public static i…

【数据结构】16 二叉树的定义,性质,存储结构(以及先序、后序、中序遍历)

二叉树 一个二叉树是一个有穷的结点集合。 它是由根节点和称为其左子树和右子树的两个不相交的二叉树组成的。 二叉树可具有以下5种形态。 性质 一个二叉树第i层的最大结点数为 2 i − 1 2^{i-1} 2i−1, i ≥ 1 i \geq 1 i≥1 每层最大结点可以对应完美二叉树(…

可视化锻炼日记ExerciseDiary

什么是 ExerciseDiary ? ExerciseDiary 是带有 GitHub 风格的年度可视化的锻炼日记。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 exercisediary ,选择第一个 aceberg/exercisediary,版本选择 latest。 本文写作时, lat…

互联网时代的文学复兴:中文诗词大数据分析 | 开源日报 No.170

chinese-poetry/chinese-poetry Stars: 45.4k License: MIT 最全的中文诗歌古典文集数据库,包含 5.5 万首唐诗、26 万首宋诗、2.1 万首宋词和其他古典文集。数据来源于互联网。该开源项目旨在通过 JSON 格式分发,方便用户开始自己的项目,并借…

从零开始实现一个三维绘图系统

文章目录 框架布局绘图函数源代码 框架 本文的目标是实现一个下图所示的系统,通过指定 x , y , z x,y,z x,y,z的表达式,以实现三维绘图的目的。这个需求其实此前也实现过,见此文,但其内容比较驳杂,并不利于快速实现&a…

VBA中表示单元格样式A1、R1C1和R[1]C[1]之间的区别

《VBA之Excel应用》(版权10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可…

springboot189基于SpringBoot电商平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…