当前位置:   article > 正文

java程序员如何使用CDN的方式写Vue_cdn type="module

cdn type="module

前言

虽然现在前后端分离已成大趋势,java后端就不用写页面了,但是偶尔自己写个小项目也是需要自己写前端页面的。不分离的时候页面写在templates或者static文件夹下,使用npm的方式就显得有点麻烦了,那么我们就用CDN引入的方式来写。Vue官网推荐新手使用CDN的方式学习Vue。

项目结构如下图

一、CDN引入

在index.html页面引入Vue相关的js和css,请求后台接口使用axios,UI我们使用饿了么的element-ui。

  1. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
  2. <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
  3. <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
  4. <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/index.js"></script>
  5. <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/theme-chalk/index.css" rel="stylesheet" />

二、封装axios请求工具

1、创建axios示例,添加请求拦截器和响应拦截器。

注意使用element-ui的message组件时,要使用 ELEMENT.Message,在这里我们没法和npm方式似的把message组件import进来。

request.js

  1. // create an axios instance
  2. const service = axios.create({
  3. baseURL: 'http://localhost:8888',
  4. timeout: 60000 // request timeout
  5. });
  6. // request interceptor
  7. service.interceptors.request.use(
  8. config => {
  9. // do something before request is sent
  10. return config
  11. },
  12. error => {
  13. // do something with request error
  14. console.log(error); // for debug
  15. return Promise.reject(error)
  16. }
  17. );
  18. // response interceptor
  19. service.interceptors.response.use(
  20. response => {
  21. const res = response.data;
  22. const code = res.code;
  23. if (code === undefined){
  24. return response;
  25. }
  26. if (code !== 200) {
  27. ELEMENT.Message({
  28. message: res.msg || 'Error',
  29. type: 'error',
  30. duration: 5 * 1000
  31. });
  32. return Promise.reject(new Error(res.message || 'Error'))
  33. } else {
  34. return res
  35. }
  36. },
  37. error => {
  38. console.log('err' + error); // for debug
  39. ELEMENT.Message({
  40. message: error.message,
  41. type: 'error',
  42. duration: 5 * 1000
  43. });
  44. return Promise.reject(error)
  45. }
  46. );
  47. export default service

 2、根据axios实例,添加请求。

注意函数的参数的区别,params是键值对的参数,是一个一个的,后台可以用@RequestParam来接收,而data是json格式的参数,后台可以用@RequestBody来接收。

  1. import request from '../utils/request.js'
  2. export function getDatabaseLink(params) {
  3. return request({
  4. url: 'link',
  5. method: 'get',
  6. params
  7. })
  8. }
  9. export function addTables(data) {
  10. return request({
  11. url: 'tables',
  12. method: 'post',
  13. data
  14. })
  15. }

三、初始化

写一个id为app的div,然后初始化Vue,注意script标签有一个type="module"的属性,只有添加了这个属性以后才可以使用import,把前面写好的请求接口工具import进来。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
  7. <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
  8. <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
  9. <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/index.js"></script>
  10. <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/theme-chalk/index.css" rel="stylesheet" />
  11. </head>
  12. <body>
  13. <div id="app">
  14. <el-button @click="alert">{{message}}</el-button>
  15. </div>
  16. <script type="module">
  17. import { getDatabaseLink, addTables } from "./api/database.js";
  18. const app = new Vue({
  19. el: '#app',
  20. data: {
  21. message:'按钮',
  22. data: ''
  23. },
  24. methos: {
  25. alert() {
  26. getDatabaseLink().then(response => {
  27. this.data = response.data;
  28. })
  29. console.log('点击了按钮');
  30. }
  31. }
  32. })
  33. </script>

四、注册icon组件

element-ui官方提供了很多图标,但是总有一些是没有的。所以,我们可以自定义一个icon组件,从https://www.iconfont.cn/找到我们想要的。

1、iconfont.js是从网站上下载的

2、icons/index.js

  1. //全局注册icon-svg
  2. Vue.component('svg-icon', {
  3. props: {
  4. iconClass: {
  5. type: String,
  6. required: true
  7. },
  8. },
  9. template: '<svg class="svg-icon" aria-hidden="true">\n' +
  10. ' <use :xlink:href="iconName"></use>\n' +
  11. ' </svg>',
  12. computed: {
  13. iconName() {
  14. return `#icon-${this.iconClass}`
  15. }
  16. }
  17. });

3、再添加一个样式,styles/svg-icon.css

  1. .svg-icon {
  2. width: 1em;
  3. height: 1em;
  4. vertical-align: -0.15em;
  5. fill: currentColor;
  6. overflow: hidden;
  7. }

4、使用

添加styles/svg-icon.css,icons/iconfont.js,icons/index.js

在页面中添加<svg-icon :icon-class="" ></svg-icon>标签即可

icon-class是从IconFont网站下载的实例中的Symbol中红色方框内容。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
  7. <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
  8. <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
  9. <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/index.js"></script>
  10. <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/theme-chalk/index.css" rel="stylesheet" />
  11. <link href="styles/svg-icon.css" rel="stylesheet">
  12. </head>
  13. <body>
  14. <div id="app">
  15. <svg-icon :icon-class="iconName" ></svg-icon>
  16. <el-button @click="alert">{{message}}</el-button>
  17. </div>
  18. <script src="icons/iconfont.js"></script>
  19. <script src="icons/index.js"></script>
  20. <script type="module">
  21. import { getDatabaseLink, addTables } from "./api/database.js";
  22. const app = new Vue({
  23. el: '#app',
  24. data: {
  25. message:'按钮',
  26. data: '',
  27. iconName: 'home'
  28. },
  29. methos: {
  30. alert() {
  31. getDatabaseLink().then(response => {
  32. this.data = response.data;
  33. })
  34. console.log('点击了按钮');
  35. }
  36. }
  37. })
  38. </script>

写在最后的话

个人感觉还是npm方式更好用,每一个小的组件可以写成.vue文件,但是CDN的方式没法这么写,而且CDN方式使用Vue Router比较麻烦,定义模板要把html代码写在字符串里。可能是我没找到简单的方法,如果有更好的方法,可以留言告诉我。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/165460?site
推荐阅读
相关标签
  

闽ICP备14008679号