请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么老师的Icon组件只能使用一次呢?

老师,我发现您的icon组件只能使用一次,第二次就不渲染图标了。

测试代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试Icon组件是否可用</title>
    <script src="./js/vue.global.js"></script>
    <script src="../dist/jingsi.data-visual.js"></script>
    <style>
        .vue-icon {
            width: 50px;
            height: 50px;
            color: purple;
        }
    </style>
</head>
<body>
<div id="app">
    <div>{{message}}</div>
    <!--  原生SVG  -->
    <div style="width: 50px;height: 50px;display: inline-block;color: aqua;">
        <svg width="100%" height="100%" viewBox="0 0 100 100">
            <line x1="0" y1="0" x2="100" y2="100" stroke-width="1" stroke="currentColor"/>
            <line x1="100" y1="0" x2="0" y2="100" stroke-width="1" stroke="currentColor"/>
        </svg>
    </div>
    <!--  引用原生SVG, width和height设为0,是为了不显示出来,只被引用就好了  -->
    <svg width="0" height="0">
        <defs>
            <symbol id="icon1" viewBox="0 0 100 100">
                <line x1="0" y1="0" x2="100" y2="100" stroke-width="1" stroke="currentColor"/>
                <line x1="100" y1="0" x2="0" y2="100" stroke-width="1" stroke="currentColor"/>
            </symbol>
        </defs>
    </svg>
    <div style="width: 50px;height: 50px;display: inline-block;color: red;">
        <svg width="100%" height="100%">
            <use href="#icon1"/>
        </svg>
    </div>
    <!--  SVG的VUE3组件  -->
    <svg width="0" height="0">
        <defs>
            <symbol id="icontimes" viewBox="0 0 100 100">
                <line x1="0" y1="0" x2="100" y2="100" stroke-width="1" stroke="currentColor"/>
                <line x1="100" y1="0" x2="0" y2="100" stroke-width="1" stroke="currentColor"/>
            </symbol>
        </defs>
    </svg>
    <icon name="times" style="width: 50px;height: 50px;color: bisque;"/>
    <icon name="times" :clazz="['vue-icon']"/>

    <svg width="50px" height="50px" viewBox="0 0 100 100">
        <circle r="50" cx="50" cy="50"/>
    </svg>
    <svg width="0" height="0">
        <defs>
            <symbol id="iconcircle" viewBox="0 0 100 100">
                <circle r="50" cx="50" cy="50"/>
            </symbol>
        </defs>
    </svg>
    <icon name="circle" :clazz="['vue-icon']"/>
</div>
<script>
    Vue.createApp({
        setup() {
            return {
                message: 'hello world!'
            }
        }
    }).use(DataVisual).mount('#app');
</script>
</body>
</html>

这段代码只渲染了的图标,的图标没渲染。这是什么原因呢?


ps:

  1. 下面是我的组件:

<template>
    <div class="icon-container">
        <div class="icon-wrapper" :style="style" :class="clazz">
            <svg class="icon">
                <use :href="iconId"/>
            </svg>
        </div>
    </div>
</template>

<script>
    export default {
        name: 'icon',
        props: {
            name: {
                type: String,
                default: ''
            },
            prefix: {
                type: String,
                default: 'icon'
            },
            style: {
                type: Object,
                default: {}
            },
            clazz: {
                type: Array || Object,
                default: []
            }
        },
        setup(ctx) {
            const iconId = `#${ctx.prefix}${ctx.name}`
            return {
                iconId
            }
        }
    }
</script>

<style lang="scss" scoped>
    .icon-wrapper {
        display: inline-block;

        .icon {
            width: 100%;
            height: 100%;
            fill: currentColor;
        }
    }
</style>

<style lang="scss">
    .icon-container {
        display: inline-block;
    }
</style>


正在回答

1回答

同学你好,在icon组件外面套一个元素包裹一下就可以了,在使用时name应该为全称iconcircle和icontimes。如果不能解决你的问题,可以继续追问。

0 回复 有任何疑惑可以回复我~
  • 真的可以!那为什么包裹一层div就可以了呢?没懂其中的奥秘。
    回复 有任何疑惑可以回复我~ 2020-07-14 08:10:36
  • 我贴上了我的组件的代码,为什么我在组件内的外层包裹一个div就不行,而在使用组件时包裹一个div就可以呢?谢谢老师。我和您的代码都有这个问题,所以我现在贴的是我的代码了。
    另外,我的组件的prefix默认为icon,所以不用写icon也行。
    回复 有任何疑惑可以回复我~ 2020-07-15 10:32:33
  • 扬_灵 回复 提问者 他门说这就是人生 #3
    每个icon组件都需要添加一个div才能显示
    回复 有任何疑惑可以回复我~ 2020-07-15 18:30:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信