vue如何操作html模版,使页面样式发生改变
vue可以是使用两种方法使页面发生改变
1. 动态改变class 使class增加、删除达到页面的改变
2. 动态的操作style内联样式

863b5c4add513c625ba06d8931bc3cb9.png

------------------------ 动态class-----------------------------

显示或者隐藏

需求1. 点击图片使isCircle取反
需要2. 如果isCircle使false,就没有circle这个class

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>动态样式添加</title>
    <style>
 .shape{
 height: 100px;
 width: 100px;
 background-color: gray;
 display: inline-block;
 margin: 10px;
        }
 .circle{
 border-radius: 50%;
        }
 .blue{
 background-color: blue;
        }
    </style>
</head>
<body>
    <div id="app">
        <div class="shape" @click = "isCircle = !isCircle" :class = "{ circle : isCircle, blue : !isCircle }"></div>
 <!-- 刚才矛盾了,前面的class中circle没取消 -->
        <p>{{ isCircle }}</p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
 new Vue({
            el: "#app",
            data: {
                isCircle: false,
            }
        })
    </script>
</body>
</html>

v-bind:class 和 v-bind:style 由vue经过特殊处理,可以在后面写对象,对象中的键为属性,值为false则隐藏该属性,值为true为显示该属性

:class 可以绑定多个类
问题: 写多了class的html模版会使可读性很差
解决: 我们可以把它定义在js下,但不能定义在data下,因为在data里不能获取data的数据(底层还没有绑定上),所以我们把它定义在计算属性下

<div id="app">
    <div class="shape" @click = "isCircle = !isCircle" :class = "divClass"></div>
    <p>{{ isCircle }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
 new Vue({
     el: "#app",
     data: {
         isCircle: false,
     },
     computed: {
         divClass: function() {
             return {
                 circle: this.isCircle,
                 blue: !this.isCircle,
             }
          }
      }
})
</script>

当它被点击发生true的东西,计算属性检测到它依赖的东西在发生改变,所有返回一个新的对象。

改变类名

<!-- css代码 -->
<style>
    .shape{
        height: 100px;
        width: 100px;
        background-color: gray;
        display: inline-block;
        margin: 10px;
    }
    .circle{
        border-radius: 50%;
    }
    .blue{
        background-color: blue;
    }
    .red{
        background-color: red;
    }
</style>





<!-- html代码 -->
<div id="app">
    <div class="shape" @click = "isCircle = !isCircle" :class = "color" ></div>
    <p>{{ isCircle }}</p>
    <input type="text" v-model = "color">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            isCircle: false,
            color: "blue"
            },
        computed: {
        divClass: function() {
            return {
                circle: this.isCircle,
                blue: !this.isCircle,
            }
        }
    }
})
</script>

在div上绑定data的color属性,color属性的值为blue,所有class = blue这个类;

我们添加一个input框,使v-model双向绑定data的color属性,所以当color属性改为red使,div的class也成red类

d022686e53e980e65ff0a4f7ed401c28.png

有多个class类可以写成数组

使用input来改动class类,使用点击来隐藏或显示类

<!-- html代码 -->
<div class="shape" @click = "isCircle = !isCircle" :class = "[color, {circle : isCircle}]" ></div>

<!-- js代码 -->
new Vue({
    el: "#app",
    data: {
        isCircle: false,
        color: "blue"
    },
})

cc35073aeb07e3e52e9574f952dd620a.png

--------------------------动态style-------------------------

使用v-bind绑定style样式

style样式是对象形式,但不能在属性中包含中划线,我们可以把它写成字符串或者驼峰式

<!-- 包含在#app div中的html代码 -->
<div class="shape" :style = "{ 'background-color':color }"></div>
<!-- 字符串 -->
<div class="shape" :style = "{ backgroundColor:color }"></div>
<!-- 驼峰式 -->

对象后面绑定的是data里的color的数据

 new Vue({
     el: "#app",
     data: {
         color: "blue"
     },
})

eadcda632ddb433f79b1cee3fa1d1c2d.png

双向数据绑定,改变color值

可以直接在input框中输入想要的值

<div class="shape" :style = "{ 'background-color':color }"></div>
<input type="text" v-model = 'color'>

aaecc8fde883f075ad844e66fc830b27.png

多个style属性

<!-- html代码 -->
<div class="shape" :style = "{ 'background-color':color, width:width + 'px' }"></div>
<input type="text" v-model = 'color'>
<input type="text" v-model = 'width'>

<!-- js代码 -->
 new Vue({
     el: "#app",
     data: {
         isCircle: false,
         color: "blue",
         width: 200,
     },
 })

45648bc411bb49d56ce7f2335f824c9a.png

问题: 有冗余,可读性不高

解决方式: 使用计算属性

<!-- html代码 -->
<div class="shape" :style = "divStyle"></div>
<input type="text" v-model = 'color'>
<input type="text" v-model = 'width'>

<!-- js代码 -->
new Vue({
    el: "#app",
    data: {
        isCircle: false,
        color: "blue",
        width: 200,
    },
    computed: {
        divStyle: function() {
            return {
                backgroundColor: this.color,
                width: this.width + 'px'
            }
       }
    }
})

cafc5f8de57e5803590a70a6496efeda.png

混合多个样式

<!-- html代码 -->
<div class="shape" :style = "[divStyle, {height: height + 'px'}]"></div>
<input type="text" v-model = 'height'>

<!-- js的Vue的#app控制的data代码 -->
data: {
    isCircle: false,
    color: "blue",
    width: 200,
    height: 50,
},
Logo

前往低代码交流专区

更多推荐