首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >VUE绑定与渲染机制

VUE绑定与渲染机制

作者头像
张哥编程
发布2024-12-13 18:54:29
发布2024-12-13 18:54:29
1740
举报
文章被收录于专栏:云计算linux云计算linux

绑定样式

在应用界面中, 某个(些)元素的样式是变化的 class/style 绑定就是专门用来实现动态样式效果的技术

class 绑定

  • 语法::class="xxx"
    • xxx 可以是字符串、数组、对象
    • 字符串:'classA'
    • 对象:{classA: false, classB: true}
    • 数组:['classA', 'classB']
    • xxx 是 data 属性

style 绑定

  • 语法::style="xxx"
    • xxx 可以是数组、对象
    • 对象:{color: 'red', fontSize: '18px'}
    • 数组:[{color: 'red', fontSize: '18px'},{backgroundColor: 'gray'}]
    • xxx 是 data 属性

注意:

  • 字符串写法适用于:类名不确定,要动态获取
  • 数组写法适用于:要绑定多个样式,个数不确定,名字也不确定
  • 对象写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用
代码语言:javascript
复制
<style>
    .basic {width: 300px;height: 50px;border: 1px solid black;}
    .happy {border: 3px solid red;background-color: rgba(255, 255, 0, 0.644);background: linear-gradient(30deg, yellow, pink, orange, yellow);}
    .sad {border: 4px dashed rgb(2, 197, 2);background-color: skyblue;}
    .normal {background-color: #bfa;}
    .atguigu1 {background-color: yellowgreen;}
    .atguigu2 {font-size: 20px;text-shadow: 2px 2px 10px red;}
    .atguigu3 {border-radius: 20px;}
</style>
<div id="root">
    <!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
    <div class="basic" :class="mood" @click="changeMood">{{name}}</div>


    <!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
    <div class="basic" :class="classArr">{{name}}</div>


    <!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 -->
    <div class="basic" :class="classObj">{{name}}</div>


    <!-- 绑定style样式--对象写法 -->
    <div class="basic" :style="styleObj">{{name}}</div>


    <!-- 绑定style样式--数组写法 -->
    <div class="basic" :style="styleArr">{{name}}</div>
</div>
<script>
    Vue.config.productionTip = false
    const vm = new Vue({
        el: '#root',
        data: {
            name: '张三',
            mood: 'normal',
            classArr: ['atguigu1', 'atguigu2', 'atguigu3'],
            classObj: {
                atguigu1: false,
                atguigu2: false,
            },
            styleObj: {
                fontSize: '40px',
                color: 'red',
            },
            styleObj2: {
                backgroundColor: 'orange'
            },
            styleArr: [
                {
                    fontSize: '40px',
                    color: 'blue',
                },
                {
                    backgroundColor: 'gray'
                }
            ]
        },
        methods: {
            changeMood() {
                const arr = ['happy', 'sad', 'normal']
                const index = Math.floor(Math.random() * 3)
                this.mood = arr[index]
            }
        }
    });
</script>

条件渲染

v-if

  • 写法 跟 if else 语法类似
  • v-if="表达式" v-else-if="表达式" v-else
  • 适用于:切换频率较低的场景,因为不展示的DOM元素直接被移除
  • v-if可以和v-else-if v-else一起使用,但要求结构不能被打断
  • 当条件不成立时, v-if 的所有子节点不会解析(项目中使用)

v-show

  • 写法:v-show="表达式"
  • 适用于:切换频率较高的场景,不展示的DOM元素未被移除,仅仅是使用样式隐藏掉display: none
  • 如果需要频繁切换 v-show 较好

注意:

  • 使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到
  • template标签不影响结构,页面html中不会有此标签,但只能配合v-if,不能配合v-show
代码语言:javascript
复制
<script src="../js/vue.js"></script>
<div id="root">
    <h2>当前的n值是:{{ n }}</h2>
    <button @click="n++">点我n自增</button>
    <!-- 使用v-show做条件渲染 -->
    <h2 v-show="false">你好,{{name}}</h2>
    <h2 v-show="1 === 1">你好,{{name}}</h2>
    <!-- 使用v-if做条件渲染 -->
    <h2 v-if="false">你好,{{name}}</h2>
    <h2 v-if="1 === 1">你好,{{name}}</h2>
    <!-- v-else和v-else-if -->
    <div v-show="n === 1">Angular</div>
    <div v-show="n === 2">React</div>
    <div v-show="n === 3">Vue</div>
    <div v-if="n === 1">Angular</div>
    <div v-else-if="n === 2">React</div>
    <div v-else-if="n === 3">Vue</div>
    <div v-else>其他</div>
    <!-- v-if与template的配合使用 -->
    <template v-if="n === 1">
        <h3>你好</h3>
        <h3>张三</h3>
    </template>
</div>
<script>
    Vue.config.productionTip = false
    const vm = new Vue({
        el: '#root',
        data: {
            name: '张三',
            n: 0
        }
    });
</script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 绑定样式
    • class 绑定
    • style 绑定
  • 条件渲染
    • v-if
    • v-show
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档