Vue 动态图片加载路径问题和解决方法

最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件。因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载。下面是核心组件代码:

 <el-tree :data="data" class="tree-view" node-key="id" :props="defaultProps" @node-click="click" :default-checked-keys="[1]">
            <span class="custom-tree-node" slot-scope="{node, data}">
            <img v-if="data.iconSkin != undefined" :src="data.iconSkin" style="margin-right: 0.3em; " />
            <span @click="getChildNodes(data.id) ">{{ node.label }}</span>
            </span>
</el-tree>

后台交互使用了vuex和axios,本篇文章后台数据没有问题,所以不做展示了。后台传入的数据结构是这样的:

{
    "id": "2|299|0",
    "open": false,
    "maxStatus": 0,
    "iconSkin": "res1",
    "name": "test",
    "children": [],
    "parent": false
}

Vue中动态加载图片需要使用require,这个很多文章都有介绍。具体可以参考这篇文章vue的 v-for 循环中图片加载路径问题

一开始我认为直接在后台传入完整的js语句就能加载,所以我把后台传入的数据iconSkin写成了完整的路径。也就是require(@/assets/resourceimage/res1.png),具体代码跟最上面的代码片段一致。

本来以为这样就能加载成功了,打开chrome查看发现图片裂开了,也就是图片获取失败了。检查HTML元素,发现图片的路径是字符串。

这是因为js在解析对象的时候并不会把字符串当成js对象去解析,因此解析出的路径显示成了字符串。在多次尝试和查资料以后我找到了几个解决方案

方案一:在src路径写require

这个方案比较简单,<img v-if="data.iconSkin != undefined" :src="require(@/assets/resourceimage/${data.iconSkin}.png)" style="margin-right: 0.3em; " />

只要保证数据是正确的,这个方案是完全可以的。

方案二:使用computed

computed是Vue里的计算属性,computed会在state数据更新时自动计算。

    computed: mapState({
        tree: function(state) {
            const data = state.resTree.treeResult;
            if (data != null) {
                const result = state.resTree.treeResult;
                return result.data;
            }
        }
    })

但是注意,此时不能使用方案一那样的形式了,应该将computed的数据绑定在组件上,然后通过v-for的方式进行调用。以element-UI的el-tree组件为例,我们可以这样写:

<el-tree :data="tree" class="tree-view" node-key="id" :props="defaultProps" >
            <span class="custom-tree-node" slot-scope="{node, tree}">
                <img :src="getUrl(`${node.icon}`)" style="margin-right: 0.3em; " />
                <span>{{node.label}}</span>
            </span>
        </el-tree>
<script>
methods: {
    getUrl(url) {
        return require(`@/assets/resourceimage/${url}.png`);
    }
}
</script>

这个用法比较简单,它把computed的计算结果——也就是tree绑定到el-tree的data上,这样就可以使用内部的node使用tree中的数据了。

切记不要使用下面的记住写法:

  1. require(‘@/assets/resourceimage/‘+${node.icon}‘+‘.png‘);
  2. require(‘@/assets/resourceimage/‘+{{node.icon}}‘+‘.png‘);

原文地址:https://www.cnblogs.com/rever/p/9589024.html

时间: 2024-10-19 13:58:49

Vue 动态图片加载路径问题和解决方法的相关文章

linux和windows动态库加载路径区别

# linux和windows动态库加载路径区别 ### 简介------------------------------ linux加载动态库的路径是系统目录/lib和/usr/lib.- windows加载动态库的路径是本地目录下,然后再搜索windows/system和windows/system32目录 ### 备注------------------------------ linux加载动态库的路径方式,对于习惯windows开发的开发者是不太方便的.- 其实linux下可以设置从当

spring加载过程中jar包加载不了,解决方法

当我们在开发spring项目时,一般会将jar包放到webInf/lib下,这样是myeclipse自动将jar包加载到tomcat中webapps下,但是当我们新建一个lib文件夹的情况下,我们add building Path时就会出错,这时候我们有个技巧供使用. 1.项目上点击右键搜索de,找到deployment assembly 目的就是将此处添加的jar包添加到系统webINF/lib路径下 来自为知笔记(Wiz) spring加载过程中jar包加载不了,解决方法

Java的cmd配置(也即Java的JDK配置及相关常用命令)——找不到或无法加载主类 的解决方法

Java的cmd配置(也即Java的JDK配置及相关常用命令) ——找不到或无法加载主类  的解决方法 这段时间一直纠结于cmd下Java无法编译运行的问题.主要问题描述如下: javac 命令可以正常运行,而java命令有时可以正常运行,有时却不可以,不可以的症状就是显示“找不到或无法加载主类”. 在网上找了各种资料,最终发现是因为代码里含有package语句,所以无法在cmd下运行java命令解释.class文件.而那些可以运行的文件就是因为没有使用package语句. 我这种问题的解决方法

U盘加载速度慢的解决方法

在日常的生活和工作中,我们经常用U盘存储一些文件和程序.然而,一些朋友发现U盘有时候在使用过程中的识别加载速度非常缓慢.是U盘出故障了吗?其实不尽然,下面就为大家分享一下如何快速解决U盘加载缓慢的方法. U盘加载速度缓慢的解决方法 1.使用"WIN+R"打开运行对话框,输入"services.msc"并点击确定,打开系统服务配置. 2.在系统服务配置的窗口中,找到"Shell Hardware Detection"服务,右键单击该服务并选择&qu

vue的 v-for 循环中图片加载路径问题

先看一下产品需求,如下图所示, 产品要求图片和它的名称一一对应,本来是非常简单的需求,后台直接返回图片路径和名称,前台直接读取就可以了,但是我们没有存储图片的服务器,再加上是一个实验性的需求,图片需要存放到前台.当时我想,vue 中的img 的src 可以动态绑定到一个变量上, 很简单吗,就没有考虑太多,直接开始做了. 首先和后台商量一下数据结构,因为图片要和名称一一对应,所以后台要返回中英文的名称的映射,我把前台的图片名称直接设置给后台给的英文名称,从而读取图片,图片和中文名称就一一对应了.数

Java编译时报错“错误: 找不到或无法加载主类”的解决方法

一.问题描述 java在执行的时候,会遇到这样的报错,编译可以正常通过,只是执行java命令时会报错,例如: G:\1\JavaPrac\tankproject\src\tank1>javac TankGame1.java G:\1\JavaPrac\tankproject\src\tank1>java TankGame1错误: 找不到或无法加载主类 TankGame1 二.解决方法 主要是配置环境变量可能有问题,着重检查环境变量. 环境变量配置: 第一步: "变量名":J

mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法

发现问题 切换到mac平台后,突然想写点程序运行在mac下,想到mac自带java,会方便好多.不过在这过程中遇到了麻烦: 总是提示 “错误: 找不到或无法加载主类” 工程结构 查了好久,终于找到原型所在,发现网上很多资料都写的都不太多,自己记录一下.先看看工程的位置和目录. 我的eclipse 工作空间位置是: /Users/zhangyunfei/workspace_java 我的工程名字叫:hellodemo 我的main class 的package name (包名)为: hellod

Hibernate懒加载异常说明及其解决方法

在集成ssh2三大框架的时候很容易就会造成懒加载异常,通常显示的错误信息是: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 懒加载异常出现的原因: 我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibern

Xcode7.0无法加载网络内容,解决方法

一.复制下面这行代码: <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 二.打开你要加载内容的工程,找到 Info.plist右键,找到Source Code进去 三.把刚才复制内容粘贴到这里 四.再编译运行一下你的程序.