美文网首页
关于类与样式的绑定

关于类与样式的绑定

作者: greente_a | 来源:发表于2020-05-10 11:49 被阅读0次
    在Vue中可以使用一个对象来动态传入需要绑定的class

    看一个例子
    css代码(全文):

        <style>
            *{
                margin:0;
                padding:0;
            }
            .static{
                background: blue;
                color:yellow;
                border-width: .5px;
                border-style: solid;
                border-radius:2px;
                font-size:48px;
            }
            .active:hover{
                font-weight: bold;
                background-color:blue;
            }
            .text-danger:hover{
                font-weight:bolder;
                background-color:red;
            }
        </style>
    

    例1:

    <div id="vm1" v-bind:class="{ active: isActive }">现实点</div>
        <script type="text/javascript">
            var vm1 = new Vue({
                el: '#vm1',
                data: {
                    isActive: true
                }
            })
        </script>
    

    我们给vm1这个<div>添加了绑定的类(一个传入对象),在实际的应用中,active为传入类,而isActive为是否应用这个传入类的“真言”,在data域中,isActive为真值,因此在该对象上会应用.active类的hover效果,如下图:


    原来的盒子 hover效果触发之后的盒子

    确实,我们遇到问题,得想的现实点。。。。

    有了上面的例子,我们可以再想一个问题,既然它传入的是一个对象,那一定可以传入不止一个属性,没错,就像下面的例子一样。

    <!-- 这个例子就是一个class作为默认属性,另一个动态渲染 -->
        <div id="vm2" class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }">兄弟,现实点
        <input type="button" v-on:click="reverse" value="一键现实">
        </div>
        <script type="text/javascript">
            var vm2 = new Vue({
                el: '#vm2',
                data: {
                    isActive: true,
                    hasError: false
                },
                methods: {
                    reverse: function(){
                        this.isActive = !this.isActive;
                        this.hasError = !this.hasError;
                    }
                }
            })
        </script>
    

    一传入,还是传的两个,双响。
    有几点需要说明的是

    • 传入的类个数可以是无穷的
    • 如果类名有不适合作为JavaScript对象标识符的字符(比如‘text-danger’中的‘-’),加上引号,js也是认的
    • 在第二条的基础上,我们可以推断,实际传入的是个json对象?
      最终效果类似于这样:


      原效果
      hover效果
      一键现实之后的效果

    当然,绑定的既然是一个对象,你也可以把它扔进data中,只留一个对象名在class里

    <!-- 对象名解耦 -->
        <div id="vm3" class="static" v-bind:class="classObject">兄弟,现实点
        <input type="button" v-on:click="reverse" value="一键现实">
        </div>
        <script type="text/javascript">
            var vm3 = new Vue({
                el: '#vm3',
                data: {
                    classObject: { 
                      active: true,
                      'text-danger': false 
                    }
                }
            })
        </script>
    

    这样的操作空间岂不是更大?(效果同上)

    当然这里的“对象”也可以是一个计算属性

    <!-- 绑定一个计算属性 -->
        <div id="vm4" v-bind:class="classObject">现实就是如此残酷</div>
        <script type="text/javascript">
            var vm4 = new Vue({
                el: '#vm4',
                data: {
                  isActive: true,
                  error: null
                },
                computed: {
                  classObject: function () {
                    return {
                      active: this.isActive && !this.error,
                      'text-danger': this.error && this.error.type === 'fatal'
                    }
                    //当该组件被激活且没有发生错误时,active类激活
                    //当该组件发生错误且为致命错误时,'text-danger'激活
                    //可以用于异步等场景???
                  }
                }
            })
        </script>
    

    应用场景可以是ajax获取数据失败之类的,或者自己抛出的异常
    简单的效果:


    例子4效果

    最后,传入一个数组也是可以的

    <div id="vm5" v-bind:class="[activeClass, errorClass]">面对现实,无所畏惧</div>
        <!-- 条件表达式,即始终添加errorClass -->
        <!-- <div id="vm5" v-bind:class="[isActive ? activeClass: '', errorClass]">面对现实,无所畏惧</div> -->
        <script type="text/javascript">
            var vm5 = new Vue({
                el: '#vm5',
                data: {
                  activeClass: 'active',
                  errorClass: 'text-danger'
                }
            })
        </script>
    

    效果图:


    例子5效果图

    面对现实,我们要无所畏惧

    相关文章

      网友评论

          本文标题:关于类与样式的绑定

          本文链接:https://www.haomeiwen.com/subject/gsodnhtx.html