vite 动态引入背景图

方法1:使用import导入图片

<template>
  <div :style="{ backgroundImage: `url(${bgImage})` }"></div>
</template>

<script setup>
// 直接导入图片资源(会解析为最终路径)
import bgImage from '@/assets/background.jpg'
</script>

方法 2:动态路径(使用 new URL)


const imageName = ref('background.jpg') // 可动态修改

const getImageUrl = (name) => {
  // 路径相对于当前文件位置(重要!)
  return new URL(`../assets/${name}`, import.meta.url).href
}
</script>

这里的url一定是相对位置,使用@/assets 不起作用

简单的静态路径

// 正确路径
const bgImage1 = new URL(`@/assets/img/screen/menu-active.png`, import.meta.url).href;
// 错误路径 (路径中不能有中文)
const bgImage2 = new URL('@/assets/img/screen/menus/曹娥江.png', import.meta.url).href;

方法 3:使用公共目录(public)

<template>
  <!-- 直接使用绝对路径(文件放在 public 目录) -->
  <div :style="{ backgroundImage: 'url(/images/background.jpg)' }"></div>
</template>

关于以上三种方法适应的注意事项

1、backgroundImage 路径写法

// 正确(使用模板字符串)
 backgroundImage: `url(${imageUrl})`

// 错误(缺少 url() 包裹)
`backgroundImage: ${imageUrl}`

2、文件位置

  • 静态资源通常放在:
    /src/assets - 需要导入
    /public - 直接引用

示例目录结构

project-root/
├── public/
│   └── images/      # 直接通过 /images/xxx 访问
│       └── bg.jpg
├── src/
│   ├── assets/      # 需要 import 或 new URL
│   │   └── header.jpg
│   ├── components/
│   │   └── MyComponent.vue
│   └── App.vue

进阶 import.meta.glob 动态引入多个背景图片

<template>
    <ul class="navigation">
        <li 
         	v-for="item in menus" 
	        :key="item.label" 
	        :style="getItemStyle(item)" >
            {{ item.label }}
        </li>
     
    </ul>
</template>

<script setup lang="ts">

const props = defineProps<{
    pagename?: string;
}>();

// 1. 使用 glob 批量导入图片
const bgModules = import.meta.glob('@/assets/img/screen/menus/*.{jpg,png,webp}', {
    eager: true, // 立即加载
    import: 'default', // 直接获取默认导出
});

// 2. 转换导入结果为 { 文件名: URL } 的映射表
const bgImageMap = Object.entries(bgModules).reduce((acc, [path, module]) => {
    const fileName = path
        .split('/')
        .pop()
        .replace(/\.[^/.]+$/, ''); // 提取不带扩展名的文件名
    acc[fileName] = module;
    return acc;
}, {});

const menus = ref([
    {
        label: '第三方监管',
        router: 'thirdPartySupervision',
    },
    {
        label: '饮用水源地',
        router: 'drinkingWaterSource',
    },
    {
        label: '曹娥江',
        router: 'caoeRiver',
    },
]);

// 动态获取样式
const getItemStyle = (item) => {
    const imageUrl = item.label == props.pagename ? bgImageMap[item.label + '_active'] : bgImageMap[item.label];
    return {
        backgroundImage: `url(${imageUrl})`,
    };
};
</script>

在这里插入图片描述

性能优化:

图片较多时使用 eager: false + 按需加载

const bgImages = import.meta.glob('@/assets/bg-images/*.webp');

// 动态加载单张图片
const loadImage = async (name) => {
  const module = await bgImages[`/src/assets/bg-images/${name}.webp`]();
  return module.default;
};
### Vue3 + Vite 中正确配置和使用 ECharts #### 安装依赖包 为了在 Vue3 和 Vite 的环境中顺利运行 ECharts,需先安装必要的 npm 包。通过命令行工具执行以下指令来完成安装: ```bash npm install echarts vue-echarts --save ``` 此操作会下载并保存 `echarts` 及其官方推荐用于 Vue 的封装组件 `vue-echarts` 到项目的 node_modules 文件夹内。 #### 注册全局或局部组件 对于希望在整个应用范围内都可访问到的图表实例来说,在 main.js 或者 main.ts 中注册 `vue-echarts` 作为全局组件是一种常见做法;而对于只需要特定页面展示的情况,则可以在单文件组件内部按需导入即可[^1]。 #### 创建渲染容器 HTML 结构部分定义了一个 div 元素充当图表绘制区域,并为其指定了唯一 ID 属性以便后续 JavaScript 脚本能够准确定位它。同时设置了样式规则使该容器居中显示且具有适当大小以容纳图形内容[^2]。 ```html <template> <div class="echarts-container"> <div id="main" style="width: 600px;height:400px;"></div> <!-- 图表容器 --> </div> </template> <style scoped> .echarts-container { display: flex; justify-content: center; align-items: center; } </style> ``` #### 初始化与更新选项数据 当 DOM 加载完成后调用生命周期钩子函数 `onMounted()` 来初始化 ECharts 实例对象并与之前准备好的 HTML 元素关联起来。接着可以设置主题风格并通过 `setOption()` 方法传入具体的可视化参数描述符从而实现动态绘图效果[^3]。 ```javascript import { ref, onMounted } from 'vue'; import * as echarts from 'echarts/core'; import wonderland from '@/tool/wonderland'; export default { setup() { let myChart = null; onMounted(() => { // 注册自定义的主题 echarts.registerTheme('wonderland', wonderland); // 基于准备好的dom,初始化echarts实例 myChart = echarts.init(document.getElementById('main'), 'wonderland'); // 设置一些基础配置项... const option = {}; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); }); return {}; }, }; ``` #### 处理静态资源路径问题 针对某些情况下可能出现的地图背景图片或其他外部素材加载失败的现象,应该注意调整引用地址格式确保它们能被正确解析为相对 URL 形式而非绝对路径。例如将本地存储下的 PNG 文件链接转换成如下所示模式[^4]: ```javascript datas.forEach((item, index) => { item.url = new URL(`../assets/images/technology/brands/tech_${index}.png`, import.meta.url).href; }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值