Vue.js can't toggle a font-awesome icon












1















I am trying to toggle a font awesome icon based on a boolean value but it seems that the font-awesome icon remains on the screen after it is drawn:



https://jsfiddle.net/50wL7mdz/200312/



HTML:



<script src="https://unpkg.com/vue"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js" integrity="sha384-SlE991lGASHoBfWbelyBPLsUlwY1GwNDJo3jSJO04KZ33K2bwfV9YBauFfnzvynJ" crossorigin="anonymous"></script>



<div id="app">
<input v-model="marked" type="checkbox"/>
<i v-if="marked" class="far fa-check-square"></i>
</div>


JS:



new Vue({
el: '#app',
data: {
marked: false
}
})


Am I doing something wrong or is there a bug in font-awesome or vue.js?










share|improve this question























  • This sometimes remains and sometimes doesn't. Do you also see this behavior?

    – acdcjunior
    Mar 18 '18 at 0:47






  • 1





    By me, once it appears it remains.

    – TheOne
    Mar 18 '18 at 0:48











  • github.com/vuetifyjs/vuetify/issues/3058

    – TheOne
    Mar 18 '18 at 0:49











  • I hate when this things happen when I'm teaching it to someone. It messes my mind.

    – rturkek
    Mar 18 '18 at 0:53
















1















I am trying to toggle a font awesome icon based on a boolean value but it seems that the font-awesome icon remains on the screen after it is drawn:



https://jsfiddle.net/50wL7mdz/200312/



HTML:



<script src="https://unpkg.com/vue"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js" integrity="sha384-SlE991lGASHoBfWbelyBPLsUlwY1GwNDJo3jSJO04KZ33K2bwfV9YBauFfnzvynJ" crossorigin="anonymous"></script>



<div id="app">
<input v-model="marked" type="checkbox"/>
<i v-if="marked" class="far fa-check-square"></i>
</div>


JS:



new Vue({
el: '#app',
data: {
marked: false
}
})


Am I doing something wrong or is there a bug in font-awesome or vue.js?










share|improve this question























  • This sometimes remains and sometimes doesn't. Do you also see this behavior?

    – acdcjunior
    Mar 18 '18 at 0:47






  • 1





    By me, once it appears it remains.

    – TheOne
    Mar 18 '18 at 0:48











  • github.com/vuetifyjs/vuetify/issues/3058

    – TheOne
    Mar 18 '18 at 0:49











  • I hate when this things happen when I'm teaching it to someone. It messes my mind.

    – rturkek
    Mar 18 '18 at 0:53














1












1








1


0






I am trying to toggle a font awesome icon based on a boolean value but it seems that the font-awesome icon remains on the screen after it is drawn:



https://jsfiddle.net/50wL7mdz/200312/



HTML:



<script src="https://unpkg.com/vue"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js" integrity="sha384-SlE991lGASHoBfWbelyBPLsUlwY1GwNDJo3jSJO04KZ33K2bwfV9YBauFfnzvynJ" crossorigin="anonymous"></script>



<div id="app">
<input v-model="marked" type="checkbox"/>
<i v-if="marked" class="far fa-check-square"></i>
</div>


JS:



new Vue({
el: '#app',
data: {
marked: false
}
})


Am I doing something wrong or is there a bug in font-awesome or vue.js?










share|improve this question














I am trying to toggle a font awesome icon based on a boolean value but it seems that the font-awesome icon remains on the screen after it is drawn:



https://jsfiddle.net/50wL7mdz/200312/



HTML:



<script src="https://unpkg.com/vue"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js" integrity="sha384-SlE991lGASHoBfWbelyBPLsUlwY1GwNDJo3jSJO04KZ33K2bwfV9YBauFfnzvynJ" crossorigin="anonymous"></script>



<div id="app">
<input v-model="marked" type="checkbox"/>
<i v-if="marked" class="far fa-check-square"></i>
</div>


JS:



new Vue({
el: '#app',
data: {
marked: false
}
})


Am I doing something wrong or is there a bug in font-awesome or vue.js?







javascript vue.js font-awesome






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Mar 18 '18 at 0:45









TheOneTheOne

4,724145699




4,724145699













  • This sometimes remains and sometimes doesn't. Do you also see this behavior?

    – acdcjunior
    Mar 18 '18 at 0:47






  • 1





    By me, once it appears it remains.

    – TheOne
    Mar 18 '18 at 0:48











  • github.com/vuetifyjs/vuetify/issues/3058

    – TheOne
    Mar 18 '18 at 0:49











  • I hate when this things happen when I'm teaching it to someone. It messes my mind.

    – rturkek
    Mar 18 '18 at 0:53



















  • This sometimes remains and sometimes doesn't. Do you also see this behavior?

    – acdcjunior
    Mar 18 '18 at 0:47






  • 1





    By me, once it appears it remains.

    – TheOne
    Mar 18 '18 at 0:48











  • github.com/vuetifyjs/vuetify/issues/3058

    – TheOne
    Mar 18 '18 at 0:49











  • I hate when this things happen when I'm teaching it to someone. It messes my mind.

    – rturkek
    Mar 18 '18 at 0:53

















This sometimes remains and sometimes doesn't. Do you also see this behavior?

– acdcjunior
Mar 18 '18 at 0:47





This sometimes remains and sometimes doesn't. Do you also see this behavior?

– acdcjunior
Mar 18 '18 at 0:47




1




1





By me, once it appears it remains.

– TheOne
Mar 18 '18 at 0:48





By me, once it appears it remains.

– TheOne
Mar 18 '18 at 0:48













github.com/vuetifyjs/vuetify/issues/3058

– TheOne
Mar 18 '18 at 0:49





github.com/vuetifyjs/vuetify/issues/3058

– TheOne
Mar 18 '18 at 0:49













I hate when this things happen when I'm teaching it to someone. It messes my mind.

– rturkek
Mar 18 '18 at 0:53





I hate when this things happen when I'm teaching it to someone. It messes my mind.

– rturkek
Mar 18 '18 at 0:53












4 Answers
4






active

oldest

votes


















4














"i" tag comments out after fire turning to svg, use some wrap <span v-if="marked"><i class="far fa-check-square"></i></span>






share|improve this answer
























  • That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

    – TheOne
    Mar 18 '18 at 19:46





















0














This answer applies to using Font Awesome with SVG.



For some reason, you need to wrap the i tag twice. For example, instead of this:



<div v-if="condition">
<i class="fal fa-caret-left"></i>
</div>
<div v-else>
<i class="fas fa-caret-left"></i>
</div>


do this:



<template v-if="condition">
<div>
<i class="fal fa-caret-left"></i>
</div>
</template>
<template v-else>
<div>
<i class="fas fa-caret-left"></i>
</div>
</template>


Not entirely sure why you need to wrap it twice since I'd think you decouple the i tag enough by wrapping it once, but it worked for me this way so there's apparently something else going on.



Also, keep in mind that the inner div can't be replaced with template for obvious reasons (template tags do not get rendered).






share|improve this answer































    0














    I ran into this issue recently when using Vue.js 2.5.x with FontAwesome 5.5.x — the icon classes were not being updated as expected.



    After switching from the FontAwesome Web Fonts + CSS implementation to SVG + JS, the following code no longer worked:



    <i :class="[sortByFirstNameAsc ? 'fa-chevron-up' : 'fa-chevron-down', 'fa']"></i>


    What would happen is that FontAwesome JavaScript would fire and wrap the <i> tag and replace it with an SVG element, as in the following simplified example:



    <span data-v-2614dbd6="">
    <svg data-v-2614dbd6="" class="svg-inline--fa fa-caret-up" ...">
    ...
    </svg>

    <!-- <i data-v-2614dbd6="" class="fa fa-caret-up"></i> -->
    </span>


    Unfortunately, the active class was being toggled on the inner, hidden <i> tag and not the outer, visible SVG element.



    The workaround that restored the dynamic active class toggling was to wrap the FontAwesome icons in a span and use the v-show directive, as illustrated in the following code snippet:



    <span v-show="sortByFirstNameAsc"><i class="fa fa-caret-up"></i></span>
    <span v-show="sortByFirstNameDesc"><i class="fa fa-caret-down"></i></span>




    The FontAwesome documentation now recommends using their Vue component to avoid conflicts in the DOM:




    Compatibility Heads Up!
    If you are using Vue you need the vue-fontawesome package or Web Fonts with CSS.




    The SVG core package is helpful and recommended in the following cases:




    • to subset a large number of icons into only the icons that you are using

    • as base libraries for larger integrations with tools like React, Angular, Vue, or Ember (in fact our own components use these packages)

    • as CommonJS/ES6 Modules bundling tool like Webpack, Rollup, or Parcel

    • as UMD-style loader library like RequireJS

    • directly on the server with CommonJS (see our Server Side Rendering docs






    share|improve this answer































      0














      I fixed this by creating a template for each icon, then loading either template conditionally based on a boolean.



      Here's my main template:






       <div v-if="minimised">

      <maximise-icon>

      </maximise-icon>

      </div>

      <div v-if="!minimised">

      <minimise-icon>

      </minimise-icon>
      </div>





      Then just create the icons like so:






      FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

      Vue.component('minimise-icon', {

      template:
      `
      <i class="fas fa-minus "></i>

      `

      })


      Vue.component('maximise-icon', {

      template:
      `
      <i class="fas fa-plus "></i>

      `

      })





      If there's a more elegant way I'm all ears!






      share|improve this answer

























        Your Answer






        StackExchange.ifUsing("editor", function () {
        StackExchange.using("externalEditor", function () {
        StackExchange.using("snippets", function () {
        StackExchange.snippets.init();
        });
        });
        }, "code-snippets");

        StackExchange.ready(function() {
        var channelOptions = {
        tags: "".split(" "),
        id: "1"
        };
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function() {
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled) {
        StackExchange.using("snippets", function() {
        createEditor();
        });
        }
        else {
        createEditor();
        }
        });

        function createEditor() {
        StackExchange.prepareEditor({
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader: {
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        },
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        });


        }
        });














        draft saved

        draft discarded


















        StackExchange.ready(
        function () {
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49343425%2fvue-js-cant-toggle-a-font-awesome-icon%23new-answer', 'question_page');
        }
        );

        Post as a guest















        Required, but never shown

























        4 Answers
        4






        active

        oldest

        votes








        4 Answers
        4






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        4














        "i" tag comments out after fire turning to svg, use some wrap <span v-if="marked"><i class="far fa-check-square"></i></span>






        share|improve this answer
























        • That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

          – TheOne
          Mar 18 '18 at 19:46


















        4














        "i" tag comments out after fire turning to svg, use some wrap <span v-if="marked"><i class="far fa-check-square"></i></span>






        share|improve this answer
























        • That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

          – TheOne
          Mar 18 '18 at 19:46
















        4












        4








        4







        "i" tag comments out after fire turning to svg, use some wrap <span v-if="marked"><i class="far fa-check-square"></i></span>






        share|improve this answer













        "i" tag comments out after fire turning to svg, use some wrap <span v-if="marked"><i class="far fa-check-square"></i></span>







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 18 '18 at 0:49









        DialogDialog

        653




        653













        • That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

          – TheOne
          Mar 18 '18 at 19:46





















        • That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

          – TheOne
          Mar 18 '18 at 19:46



















        That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

        – TheOne
        Mar 18 '18 at 19:46







        That won't help in this case: jsfiddle.net/50wL7mdz/201741 I switched from the js to the css as mentioned in the above link and that resolved the issue.

        – TheOne
        Mar 18 '18 at 19:46















        0














        This answer applies to using Font Awesome with SVG.



        For some reason, you need to wrap the i tag twice. For example, instead of this:



        <div v-if="condition">
        <i class="fal fa-caret-left"></i>
        </div>
        <div v-else>
        <i class="fas fa-caret-left"></i>
        </div>


        do this:



        <template v-if="condition">
        <div>
        <i class="fal fa-caret-left"></i>
        </div>
        </template>
        <template v-else>
        <div>
        <i class="fas fa-caret-left"></i>
        </div>
        </template>


        Not entirely sure why you need to wrap it twice since I'd think you decouple the i tag enough by wrapping it once, but it worked for me this way so there's apparently something else going on.



        Also, keep in mind that the inner div can't be replaced with template for obvious reasons (template tags do not get rendered).






        share|improve this answer




























          0














          This answer applies to using Font Awesome with SVG.



          For some reason, you need to wrap the i tag twice. For example, instead of this:



          <div v-if="condition">
          <i class="fal fa-caret-left"></i>
          </div>
          <div v-else>
          <i class="fas fa-caret-left"></i>
          </div>


          do this:



          <template v-if="condition">
          <div>
          <i class="fal fa-caret-left"></i>
          </div>
          </template>
          <template v-else>
          <div>
          <i class="fas fa-caret-left"></i>
          </div>
          </template>


          Not entirely sure why you need to wrap it twice since I'd think you decouple the i tag enough by wrapping it once, but it worked for me this way so there's apparently something else going on.



          Also, keep in mind that the inner div can't be replaced with template for obvious reasons (template tags do not get rendered).






          share|improve this answer


























            0












            0








            0







            This answer applies to using Font Awesome with SVG.



            For some reason, you need to wrap the i tag twice. For example, instead of this:



            <div v-if="condition">
            <i class="fal fa-caret-left"></i>
            </div>
            <div v-else>
            <i class="fas fa-caret-left"></i>
            </div>


            do this:



            <template v-if="condition">
            <div>
            <i class="fal fa-caret-left"></i>
            </div>
            </template>
            <template v-else>
            <div>
            <i class="fas fa-caret-left"></i>
            </div>
            </template>


            Not entirely sure why you need to wrap it twice since I'd think you decouple the i tag enough by wrapping it once, but it worked for me this way so there's apparently something else going on.



            Also, keep in mind that the inner div can't be replaced with template for obvious reasons (template tags do not get rendered).






            share|improve this answer













            This answer applies to using Font Awesome with SVG.



            For some reason, you need to wrap the i tag twice. For example, instead of this:



            <div v-if="condition">
            <i class="fal fa-caret-left"></i>
            </div>
            <div v-else>
            <i class="fas fa-caret-left"></i>
            </div>


            do this:



            <template v-if="condition">
            <div>
            <i class="fal fa-caret-left"></i>
            </div>
            </template>
            <template v-else>
            <div>
            <i class="fas fa-caret-left"></i>
            </div>
            </template>


            Not entirely sure why you need to wrap it twice since I'd think you decouple the i tag enough by wrapping it once, but it worked for me this way so there's apparently something else going on.



            Also, keep in mind that the inner div can't be replaced with template for obvious reasons (template tags do not get rendered).







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Oct 26 '18 at 18:38









            DeuxAlphaDeuxAlpha

            13627




            13627























                0














                I ran into this issue recently when using Vue.js 2.5.x with FontAwesome 5.5.x — the icon classes were not being updated as expected.



                After switching from the FontAwesome Web Fonts + CSS implementation to SVG + JS, the following code no longer worked:



                <i :class="[sortByFirstNameAsc ? 'fa-chevron-up' : 'fa-chevron-down', 'fa']"></i>


                What would happen is that FontAwesome JavaScript would fire and wrap the <i> tag and replace it with an SVG element, as in the following simplified example:



                <span data-v-2614dbd6="">
                <svg data-v-2614dbd6="" class="svg-inline--fa fa-caret-up" ...">
                ...
                </svg>

                <!-- <i data-v-2614dbd6="" class="fa fa-caret-up"></i> -->
                </span>


                Unfortunately, the active class was being toggled on the inner, hidden <i> tag and not the outer, visible SVG element.



                The workaround that restored the dynamic active class toggling was to wrap the FontAwesome icons in a span and use the v-show directive, as illustrated in the following code snippet:



                <span v-show="sortByFirstNameAsc"><i class="fa fa-caret-up"></i></span>
                <span v-show="sortByFirstNameDesc"><i class="fa fa-caret-down"></i></span>




                The FontAwesome documentation now recommends using their Vue component to avoid conflicts in the DOM:




                Compatibility Heads Up!
                If you are using Vue you need the vue-fontawesome package or Web Fonts with CSS.




                The SVG core package is helpful and recommended in the following cases:




                • to subset a large number of icons into only the icons that you are using

                • as base libraries for larger integrations with tools like React, Angular, Vue, or Ember (in fact our own components use these packages)

                • as CommonJS/ES6 Modules bundling tool like Webpack, Rollup, or Parcel

                • as UMD-style loader library like RequireJS

                • directly on the server with CommonJS (see our Server Side Rendering docs






                share|improve this answer




























                  0














                  I ran into this issue recently when using Vue.js 2.5.x with FontAwesome 5.5.x — the icon classes were not being updated as expected.



                  After switching from the FontAwesome Web Fonts + CSS implementation to SVG + JS, the following code no longer worked:



                  <i :class="[sortByFirstNameAsc ? 'fa-chevron-up' : 'fa-chevron-down', 'fa']"></i>


                  What would happen is that FontAwesome JavaScript would fire and wrap the <i> tag and replace it with an SVG element, as in the following simplified example:



                  <span data-v-2614dbd6="">
                  <svg data-v-2614dbd6="" class="svg-inline--fa fa-caret-up" ...">
                  ...
                  </svg>

                  <!-- <i data-v-2614dbd6="" class="fa fa-caret-up"></i> -->
                  </span>


                  Unfortunately, the active class was being toggled on the inner, hidden <i> tag and not the outer, visible SVG element.



                  The workaround that restored the dynamic active class toggling was to wrap the FontAwesome icons in a span and use the v-show directive, as illustrated in the following code snippet:



                  <span v-show="sortByFirstNameAsc"><i class="fa fa-caret-up"></i></span>
                  <span v-show="sortByFirstNameDesc"><i class="fa fa-caret-down"></i></span>




                  The FontAwesome documentation now recommends using their Vue component to avoid conflicts in the DOM:




                  Compatibility Heads Up!
                  If you are using Vue you need the vue-fontawesome package or Web Fonts with CSS.




                  The SVG core package is helpful and recommended in the following cases:




                  • to subset a large number of icons into only the icons that you are using

                  • as base libraries for larger integrations with tools like React, Angular, Vue, or Ember (in fact our own components use these packages)

                  • as CommonJS/ES6 Modules bundling tool like Webpack, Rollup, or Parcel

                  • as UMD-style loader library like RequireJS

                  • directly on the server with CommonJS (see our Server Side Rendering docs






                  share|improve this answer


























                    0












                    0








                    0







                    I ran into this issue recently when using Vue.js 2.5.x with FontAwesome 5.5.x — the icon classes were not being updated as expected.



                    After switching from the FontAwesome Web Fonts + CSS implementation to SVG + JS, the following code no longer worked:



                    <i :class="[sortByFirstNameAsc ? 'fa-chevron-up' : 'fa-chevron-down', 'fa']"></i>


                    What would happen is that FontAwesome JavaScript would fire and wrap the <i> tag and replace it with an SVG element, as in the following simplified example:



                    <span data-v-2614dbd6="">
                    <svg data-v-2614dbd6="" class="svg-inline--fa fa-caret-up" ...">
                    ...
                    </svg>

                    <!-- <i data-v-2614dbd6="" class="fa fa-caret-up"></i> -->
                    </span>


                    Unfortunately, the active class was being toggled on the inner, hidden <i> tag and not the outer, visible SVG element.



                    The workaround that restored the dynamic active class toggling was to wrap the FontAwesome icons in a span and use the v-show directive, as illustrated in the following code snippet:



                    <span v-show="sortByFirstNameAsc"><i class="fa fa-caret-up"></i></span>
                    <span v-show="sortByFirstNameDesc"><i class="fa fa-caret-down"></i></span>




                    The FontAwesome documentation now recommends using their Vue component to avoid conflicts in the DOM:




                    Compatibility Heads Up!
                    If you are using Vue you need the vue-fontawesome package or Web Fonts with CSS.




                    The SVG core package is helpful and recommended in the following cases:




                    • to subset a large number of icons into only the icons that you are using

                    • as base libraries for larger integrations with tools like React, Angular, Vue, or Ember (in fact our own components use these packages)

                    • as CommonJS/ES6 Modules bundling tool like Webpack, Rollup, or Parcel

                    • as UMD-style loader library like RequireJS

                    • directly on the server with CommonJS (see our Server Side Rendering docs






                    share|improve this answer













                    I ran into this issue recently when using Vue.js 2.5.x with FontAwesome 5.5.x — the icon classes were not being updated as expected.



                    After switching from the FontAwesome Web Fonts + CSS implementation to SVG + JS, the following code no longer worked:



                    <i :class="[sortByFirstNameAsc ? 'fa-chevron-up' : 'fa-chevron-down', 'fa']"></i>


                    What would happen is that FontAwesome JavaScript would fire and wrap the <i> tag and replace it with an SVG element, as in the following simplified example:



                    <span data-v-2614dbd6="">
                    <svg data-v-2614dbd6="" class="svg-inline--fa fa-caret-up" ...">
                    ...
                    </svg>

                    <!-- <i data-v-2614dbd6="" class="fa fa-caret-up"></i> -->
                    </span>


                    Unfortunately, the active class was being toggled on the inner, hidden <i> tag and not the outer, visible SVG element.



                    The workaround that restored the dynamic active class toggling was to wrap the FontAwesome icons in a span and use the v-show directive, as illustrated in the following code snippet:



                    <span v-show="sortByFirstNameAsc"><i class="fa fa-caret-up"></i></span>
                    <span v-show="sortByFirstNameDesc"><i class="fa fa-caret-down"></i></span>




                    The FontAwesome documentation now recommends using their Vue component to avoid conflicts in the DOM:




                    Compatibility Heads Up!
                    If you are using Vue you need the vue-fontawesome package or Web Fonts with CSS.




                    The SVG core package is helpful and recommended in the following cases:




                    • to subset a large number of icons into only the icons that you are using

                    • as base libraries for larger integrations with tools like React, Angular, Vue, or Ember (in fact our own components use these packages)

                    • as CommonJS/ES6 Modules bundling tool like Webpack, Rollup, or Parcel

                    • as UMD-style loader library like RequireJS

                    • directly on the server with CommonJS (see our Server Side Rendering docs







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 27 '18 at 0:15









                    rjbrjb

                    7,36213240




                    7,36213240























                        0














                        I fixed this by creating a template for each icon, then loading either template conditionally based on a boolean.



                        Here's my main template:






                         <div v-if="minimised">

                        <maximise-icon>

                        </maximise-icon>

                        </div>

                        <div v-if="!minimised">

                        <minimise-icon>

                        </minimise-icon>
                        </div>





                        Then just create the icons like so:






                        FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                        Vue.component('minimise-icon', {

                        template:
                        `
                        <i class="fas fa-minus "></i>

                        `

                        })


                        Vue.component('maximise-icon', {

                        template:
                        `
                        <i class="fas fa-plus "></i>

                        `

                        })





                        If there's a more elegant way I'm all ears!






                        share|improve this answer






























                          0














                          I fixed this by creating a template for each icon, then loading either template conditionally based on a boolean.



                          Here's my main template:






                           <div v-if="minimised">

                          <maximise-icon>

                          </maximise-icon>

                          </div>

                          <div v-if="!minimised">

                          <minimise-icon>

                          </minimise-icon>
                          </div>





                          Then just create the icons like so:






                          FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                          Vue.component('minimise-icon', {

                          template:
                          `
                          <i class="fas fa-minus "></i>

                          `

                          })


                          Vue.component('maximise-icon', {

                          template:
                          `
                          <i class="fas fa-plus "></i>

                          `

                          })





                          If there's a more elegant way I'm all ears!






                          share|improve this answer




























                            0












                            0








                            0







                            I fixed this by creating a template for each icon, then loading either template conditionally based on a boolean.



                            Here's my main template:






                             <div v-if="minimised">

                            <maximise-icon>

                            </maximise-icon>

                            </div>

                            <div v-if="!minimised">

                            <minimise-icon>

                            </minimise-icon>
                            </div>





                            Then just create the icons like so:






                            FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                            Vue.component('minimise-icon', {

                            template:
                            `
                            <i class="fas fa-minus "></i>

                            `

                            })


                            Vue.component('maximise-icon', {

                            template:
                            `
                            <i class="fas fa-plus "></i>

                            `

                            })





                            If there's a more elegant way I'm all ears!






                            share|improve this answer















                            I fixed this by creating a template for each icon, then loading either template conditionally based on a boolean.



                            Here's my main template:






                             <div v-if="minimised">

                            <maximise-icon>

                            </maximise-icon>

                            </div>

                            <div v-if="!minimised">

                            <minimise-icon>

                            </minimise-icon>
                            </div>





                            Then just create the icons like so:






                            FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                            Vue.component('minimise-icon', {

                            template:
                            `
                            <i class="fas fa-minus "></i>

                            `

                            })


                            Vue.component('maximise-icon', {

                            template:
                            `
                            <i class="fas fa-plus "></i>

                            `

                            })





                            If there's a more elegant way I'm all ears!






                             <div v-if="minimised">

                            <maximise-icon>

                            </maximise-icon>

                            </div>

                            <div v-if="!minimised">

                            <minimise-icon>

                            </minimise-icon>
                            </div>





                             <div v-if="minimised">

                            <maximise-icon>

                            </maximise-icon>

                            </div>

                            <div v-if="!minimised">

                            <minimise-icon>

                            </minimise-icon>
                            </div>





                            FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                            Vue.component('minimise-icon', {

                            template:
                            `
                            <i class="fas fa-minus "></i>

                            `

                            })


                            Vue.component('maximise-icon', {

                            template:
                            `
                            <i class="fas fa-plus "></i>

                            `

                            })





                            FontAwesomeConfig = { autoReplaceSvg: 'nest' }//important addition!

                            Vue.component('minimise-icon', {

                            template:
                            `
                            <i class="fas fa-minus "></i>

                            `

                            })


                            Vue.component('maximise-icon', {

                            template:
                            `
                            <i class="fas fa-plus "></i>

                            `

                            })






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Jan 26 at 12:30

























                            answered Jan 24 at 22:01









                            Charles BannisterCharles Bannister

                            32




                            32






























                                draft saved

                                draft discarded




















































                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid



                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f49343425%2fvue-js-cant-toggle-a-font-awesome-icon%23new-answer', 'question_page');
                                }
                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

                                Calculate evaluation metrics using cross_val_predict sklearn

                                Insert data from modal to MySQL (multiple modal on website)