vue开发中遇到的问题记录

文章探讨了Vue开发中遇到的问题,如ScopedCSS生效、路由配置重复、组件间正确事件传递、动态配置组件警告及Vite构建动态路由的解决方案。


前言

1、css 即时使用了scoped子组件依然会生效

2、路由配置如果出现重复name,只会生效最后一个,且前端的路由无效

3、组件之间事件传递回调需要先定义emits: [‘’],不然会警告提示

export default defineComponent({
  ...
  emits: ['click', 'update:tabs']
  setup(props, { emit }) {
    ...
    emit("click", pane.paneName as string)	
  }

在这里插入图片描述

4、动态配置数据中引入了组件为参数,出现警告提示

翻译为:Vue收到了一个组件,该组件被设置为反应对象。这可能会导致不必要的性能开销,应该通过用“markRaw”标记组件或使用“shallowRef”而不是“ref”来避免。

shallowref

  • 解决办法(优化开销,减少不必要的深度监听)
    在动态配置数据中使用markRaw或者shallowRef来将一个对象标记为不可被转为代理。返回该对象本身。

  • shallowRef
    ref() 的浅层作用形式。
    和 ref() 不同,浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。
    shallowRef() 常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。

5、根据文件目录动态引入路由,格式为渲染函数(.ts/.js)文件,部署在服务器找不到文件(vite构建有问题,webpack的正常)

在这里插入图片描述
原因是因为在vite构建中,动态拼接路由不生效,且vite使用import.meta.glob("../views/**/index.ts", { eager: true });获取目录后应该是和import一样的效果

  • 具体是component: () => import(/* @vite-ignore */ componentPath)修改为component: () => component即可

  • 优化前

/**
 * 路由配置文件
 */

import { DEFAULT_DOCUMENT_TITLE } from "@/const/base";
import type { RouteRecordRaw } from "vue-router";

function getComponent(type: string = "") {
  switch (type) {
    case "system-pages/":
      return import.meta.glob("../views/system-pages/**/index.ts", {
        eager: true,
      });
    case "contents-pages/":
      return import.meta.glob("../views/contents-pages/**/index.ts", {
        eager: true,
      });
    default:
      return import.meta.glob("../views/**/index.ts", { eager: true });
  }
}
// 获取路由文件
export const vueRouters = (type: string): RouteRecordRaw[] => {
  const routerList: RouteRecordRaw[] = [];
  const files = getComponent(type);
  Object.keys(files).forEach((fileSrc: string) => {
    const component = files[fileSrc] as any;
    const componentPath = fileSrc.replace(/^\.\//, "")
    const routerPath = componentPath.replace(`../views/${type}`, "").replace(/\/index.ts$/, "");
    if (!componentPath.includes("components")) {
      routerList.push({
        path: routerPath || component.default.name,
        name: component.default.name,
        component: () => import(/* @vite-ignore */ componentPath),
        meta: {
          title: component.default.title || DEFAULT_DOCUMENT_TITLE,
          // skeleton: component.skeleton, // TODO 待处理页面骨架屏
          // background: component.backgroundColor, // TODO 待处理页面级别颜色
        },
      });
    }
  });

  return routerList;
};
  • 优化后
/**
 * 路由配置文件
 */

import { DEFAULT_DOCUMENT_TITLE } from "@/const/base";
import type { RouteRecordRaw } from "vue-router";

function getComponent(type: string = "") {
  switch (type) {
    case "system-pages/":
      return import.meta.glob("../views/system-pages/**/index.ts", {
        eager: true,
      });
    case "contents-pages/":
      return import.meta.glob("../views/contents-pages/**/index.ts", {
        eager: true,
      });
    default:
      return import.meta.glob("../views/**/index.ts", { eager: true });
  }
}

// 获取路由文件
export const vueRouters = (type: string): RouteRecordRaw[] => {
  const routerList: RouteRecordRaw[] = [];
  const files = getComponent(type);
  Object.keys(files).forEach((fileSrc: string) => {
    const component = files[fileSrc] as any;
    const componentPath = fileSrc.replace(/^\.\//, "");
    const routerPath = componentPath
      .replace(`../views/${type}`, "/")
      .replace(/\/index.ts$/, "");
    if (!componentPath.includes("components")) {
      routerList.push({
        path: routerPath || component.default.name,
        name: component.default.name,
        component: () => component,
        meta: {
          title: component.default.title || DEFAULT_DOCUMENT_TITLE,
          // skeleton: component.skeleton, // TODO 待处理页面骨架屏
          // background: component.backgroundColor, // TODO 待处理页面级别颜色
        },
      });
    }
  });

  return routerList;
};


总结

如有启发,可点赞收藏哟~

<think>好的,我现在需要回答用户关于SpringBoot和Vue开发中常见问题及解决方法的问题。首先,我得回忆一下自己之前学过的相关知识,或者查阅一些资料来确保回答准确。 用户提到了他们提供的几个引用,里面提到了SpringBoot创建Bean的错误、数组参数处理、跨域问题等。我需要把这些内容整合起来,同时可能还需要补充其他常见问题,比如前后端数据交互、配置问题、部署问题等。 首先,Bean创建错误通常和依赖注入有关,可能是缺少注解或者配置不正确。需要检查@Component或@Service等注解是否正确使用,以及依赖是否注入正确。比如引用1中的Error creating bean with name “XXX”错误,可能是bean没有被正确扫描到,或者构造函数有问题。 接下来是跨域问题,这在前后端分离的项目中很常见。后端需要配置CORS,允许前端的域名访问。引用3提到了解决跨域问题的方法,可以通过@CrossOrigin注解或者配置CorsFilter来实现。这里需要详细说明如何配置,以及可能的注意事项。 然后是参数接收的问题,比如SpringBoot接收数组参数。引用2提到,前端传递数组时,可能需要使用@RequestParam注解,并且在后端正确接收。比如用List或者数组来接收,同时注意请求参数的格式是否正确。 文件上传的问题,引用2和4提到可能会抛出异常,比如文件大小限制。这时候需要调整SpringBoot的配置,增加spring.servlet.multipart.max-file-size和max-request-size参数。 另外,可能还有前端Vue访问后端API时的代理问题。在开发环境下,Vue可以通过配置vue.config.js中的devServer.proxy来代理请求,避免跨域。这也是常见的解决方案之一。 还有静态资源处理的问题,比如SpringBoot需要正确配置静态资源的路径,以便Vue打包后的文件能够被正确访问。可能需要配置资源处理器,或者将Vue的dist目录放在SpringBoot的resources/static下。 还有可能遇到数据格式的问题,比如日期格式前后端不一致,这时候需要使用@JsonFormat注解来格式化日期,或者统一使用时间戳传输。 此外,用户认证和权限控制也是一个常见问题,比如使用JWT时,前后端如何传递token,如何处理拦截器等。需要确保请求头中携带正确的Authorization头,后端配置拦截器或过滤器来验证token。 数据库连接问题,比如配置数据源时的驱动类、URL格式是否正确,尤其是在使用不同数据库时,比如MySQL版本不同可能导致驱动类名或URL需要调整。 日志配置问题,比如如何启用SpringBoot的日志功能,配置logback或log4j2,记录请求和响应信息,方便调试。 部署问题,比如将SpringBoot打包成jar或war,部署到服务器时需要注意端口是否开放,环境变量配置是否正确。Vue项目需要打包生成静态文件,部署到Nginx或SpringBoot的静态资源目录中。 还有可能遇到前端路由与后端Controller冲突的问题,比如直接访问Vue的路由路径时,后端没有对应的处理,导致404。这时候需要配置后端捕获所有前端路由,返回index.html,由前端路由处理。 现在需要把这些整理成结构清晰的回答,分点列出每个问题,对应的解决方案,并附上引用来源。同时,生成相关问题,帮助用户进一步了解。 需要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不太涉及数学公式,不过需要注意其他格式要求,比如代码块使用三个反引号包裹,正确的高亮语言标记。 最后检查是否覆盖了用户提供的引用中的问题,并补充其他常见问题,确保回答全面。同时,语言要口语化,避免使用专业术语过多,或者解释清楚术语。</think>### SpringBoot与Vue开发常见问题及解决方案 #### 1. **Bean创建失败** **问题现象**: 启动时抛出`Error creating bean with name "XXX"`错误[^1]。 **原因**: - 依赖注入失败(如缺少`@Autowired`或构造函数问题)。 - Bean未被扫描到(未添加`@Component`、`@Service`等注解)。 **解决方案**: - 检查类是否添加了正确的注解。 - 确保包路径在`@SpringBootApplication`扫描范围内。 - 使用`@Lazy`延迟加载解决循环依赖问题。 --- #### 2. **跨域问题(CORS)** **问题现象**: 前端请求后端API时提示跨域错误[^3]。 **解决方案**: - **后端配置**:通过`@CrossOrigin`注解或全局配置类: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE"); } } ``` - **前端代理**:在`vue.config.js`中配置代理: ```javascript devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } ``` --- #### 3. **接收数组参数异常** **问题现象**: 后端无法正确接收前端传递的数组参数[^2]。 **解决方案**: - 使用`@RequestParam`接收参数: ```java @PostMapping("/test") public void test(@RequestParam("ids") List<Integer> ids) { ... } ``` - 前端传递参数时,确保格式为`ids=1&ids=2`或使用JSON格式。 --- #### 4. **文件上传大小限制** **问题现象**: 上传大文件时抛出`MaxUploadSizeExceededException`。 **解决方案**: 在`application.properties`中调整限制: ```properties spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` --- #### 5. **静态资源访问失败** **问题现象**: Vue打包后的静态文件(如JS/CSS)无法加载。 **解决方案**: - 将Vue的`dist`目录内容复制到SpringBoot的`src/main/resources/static`目录。 - 配置资源路径映射: ```java @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } ``` --- #### 6. **前端路由404问题** **问题现象**: 直接访问Vue路由路径(如`/user`)时返回404。 **解决方案**: 配置SpringBoot捕获所有路径并返回`index.html`: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/{path:[^\\.]*}") .setViewName("forward:/index.html"); } } ``` --- #### 7. **日期格式不一致** **问题现象**: 前后端传输的日期格式不匹配。 **解决方案**: - 后端使用`@JsonFormat`注解: ```java @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; ``` - 前端使用库(如`moment.js`)格式化日期。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值