Vue语法(2)

文章详细介绍了Vue.js中的样式绑定,包括class和style属性的动态绑定,以及数据绑定v-model的使用,包括修饰符lazy、number和trim。同时,文章讨论了条件渲染的v-if和v-show的区别,以及循环渲染v-for的实现,强调了它们在不同场景下的适用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 样式绑定

1.1 class属性绑定

1.2 style属性绑定

 2. 数据绑定——v-model

3. 条件渲染——v-if&v-show

3.1 v-if

3.2 v-show="变量"

4. 循环渲染——v-for


1. 样式绑定

1.1 class属性绑定

语法 ==> v-bind:class

语法糖 ==> :class

可以通过改变元素的类名,来实现该元素的不同样式。以下案例写了三种不同的绑定class的语法:变量、对象、数组。

<style>
    .box1 {
        width: 100px;
        height: 100px;
        background-color: aquamarine;
    }
    .hide {
        /* 隐藏元素 */
        display: none;
    }
</style>
<div id="app">
    {{test}}
    <div :class="a">box1</div>
    <hr>
    <button @click="hide_box2">点击隐藏box2</button>
    <div :class="b">box2</div>
    <hr>
    <button v-on:click="hide_box3">点击隐藏box3</button>
    <div :class="[c,'box1']">box3</div>
    </div>
<script>
    const app = {
        data() {
            return {
                test: "测试",
                a: 'box1',
                // 对象写法,通过布尔值,来决定是否修改类名,从而达到是否在页面中显示元素
                b: { 'box1': true, 'hide': false },
                flag: true,
                // 开关,为true时,就添加类名;
                c:'box1'
            }
        },
        methods: {
            hide_box2() {
                this.flag = !this.flag;
                if (this.flag) {
                    this.b.hide = false;
                } else {
                    this.b.hide = true;
                }
            },
            hide_box3() {
                this.flag = !this.flag;
                if (this.flag) {
                    this.c = 'box1';
                } else {
                    this.c = 'hide';
                }
            }
        },
    };
    Vue.createApp(app).mount('#app');
</script>

最终实现,点击隐藏按钮,隐藏响应的div盒子。box2中,始终存在的样式是.box,通过点击事件,来修改data中的b的hide的值,从而达到是否隐藏该元素。box3中同样的方式。

1.2 style属性绑定

语法 ==> v-bind:style

语法糖 ==> :style

注意:在:style = '变量名',其中的变量名要满足css的写法,比如:

    <style>
        .box {
            width: 100px;
            height: 100px;
        }
    </style>
    <div id="app">
        <div class="box" :style="a">box</div>
    </div>
    <script>
        const app = {
            data() {
                return {
                    a: 'background-color:blue;color:red',
                }
            },
        };
        Vue.createApp(app).mount('#app');
    </script>

以上案例是变量的写法,其中data中的a的值为css写样式时候的字符串样子,上面代码实现结果如下:

        对象写法,需要注意在style中写样式时,属性名满足驼峰命名法。比如说正常写行内css样式时,为 style="background-color : blue,而在vue框架内写style样式时不支持下划线格式,那前面修改盒子背景色应该写成 :style="{backroundColor : 'blue' }"。以下案例包含对象语法和数组语法:

    <style>
        .box {
            width: 100px;
            height: 100px;
        }
    </style>
    <div id="app">
        <div class="box" :style="a">box</div>
        <div class="box" :style="{display:b,backgroundColor:'brown'}">box2</div>
        <!-- 对象写法 -->
        <div class="box" :style="[{display:c},{color:'blueviolet'}]">box3</div>
    </div>
    <script>
        const app = {
            data() {
                return {
                    a: 'background-color:blue;color:red',
                    b: 'block',
                    // box3隐藏
                    c: 'none',
                }
            },
        };
        Vue.createApp(app).mount('#app');
    </script>

总结:

        a. :style="对象" 或  :style="变量",变量中保存对象==>对象的属性就是css的样式代码,属性值就是css样式的值;

        b. :style={ color: '变量' } ==>变量保存的是样式的值

        c. :style="数组"或者:style="变量",变量保存一个数组 ==>数组中保存对象

 2. 数据绑定——v-model

        首先,我们需要弄清楚在vue框架中的响应式数据和双向绑定数据的概念。

响应式数据:只能由代码改变UI或者只能由UI改变代码

双向绑定数据:Vue的数据源变化,模板跟着改变;页面改变,数据源也会变化。用于用户交互

下面写一个案例来看看什么是响应式数据:

    <div id="app">
        <p>{{email}}</p>
        <input type="text">
        <!-- 点击按钮 获取输入框的内容 -->
        <button @click="fn1">getData</button>
        <button @click="fn2">setData</button>
        
    </div>
    <script>
        const app = Vue.createApp({
            data(){
                return {
                    email:'123',
                }
            },
            methods:{
                fn1(){
                    console.log(this.email);
                },
                fn2() {
                    this.email = '改数据了';
                }
            }
        });
        app.mount('#app');
    </script>

        上面案例中,点击getData按钮,控制台会打印email的值,也就是123;但当改变输入框里面的值时,页面中的p标签并没有改变内容,获取输入框内的数据时,仍然是123。这是因为在输入框中输入内容时,修改的是DOM元素中的input.value,但Vue中的data.email没有改变,所以获取到的数据只能是原始数据123。想要实现当输入不同的内容时,会更改data中的email的值。那就需要实现数据的双向绑定。

运行结果:

1. 语法:v-model = "变量"

2. 修饰符

案例:

    <div id="app">
        <p>{{account}}</p>
        <input type="text" :value="account" v-model="account">
        <br>
        <p>lazy{{email}}</p>
        <input type="text" :value="email" v-model.lazy="email">
        <br>
        <p>number:{{tel}}</p>
        <input type="text" :value="tel" v-model.lazy.number="tel">
        <br>
        <p>去掉前后导空格{{nickname}}</p>
        <input type="text" :value="nickname" v-model.lazy.trim="nickname">
    </div>
    <script>
        const app = {
            data() {
                return {
                    account: '',
                    email: '',
                    tel: '',
                    nickname: '',
                }
            },
        };
        Vue.createApp(app).mount('#app');
    </script>

        1. .lazy 等用户输入完再读取数, 底层是change事件(触发条件:光标失焦、输入框内容改变)

        2. .number 输入框内容以数字开头时,从非数字开始的字符会被去掉;当以非数字开头时,绑定的数据就是输入框中的内容。实际使用中,可以用来去掉带有单位的数据,方便验证

        3. .trim 去掉输入框前后导空格。可以用来用户交互时的数据验证

        总结:页面被用户交互了(提交表单),用修改了文档树的节点属性值,本来是不会刷新数据源,想办法数据源。方法:1. 自己绑定交互事件,获取交互结果设置到数据源中 2. v-model是方法1设计的语法糖。 

3. 条件渲染——v-if&v-show

3.1 v-if

方法类似js语法中的if{ }else{ }

用法如下:

        <button :onclick="fn">btn</button>
        <div v-if="a">内容1</div>
        <div v-else-if="b">内容3</div>
        <div v-else>内容2222</div>
        <div>固定的</div>

vue中data代码:

 data() {
     return {
              a: true,
              b: false,
              a2: true,
            }
        },
methods: {
        fn() {
            this.a = !this.a;
            // this.b = !this.b;
        },
    }

        点击btn按钮,当a为true时,显示内容1;如果为false,则去判断b,b为true就显示内容3,反之显示内容222。

3.2 v-show="变量"

当变量为true时,就显示该元素。其底层原理是创建了元素节点,当要显示时就删掉 display:none;如果不显示元素,则在该元素上添加上display:none

总结:v-if & v-show的区别?

         v-if: 创建或销毁元素节点

         v-show: 元素节点隐藏或显示,元素节点还在

两者的选择需要根据使用场景。当高频切换时,使用v-show,具有更高的渲染消耗;反之,使用v-if。

4. 循环渲染——v-for

        v-for指令所在区块会被克隆,数组有几个元素就克隆几次。vue2 x版本克隆的是区块;vue3的旧版本克隆的是已经创建了的节点树;vue3新版本解决了前面的bug,克隆的是区块(v-for所在模模板)。用法如下:

<div v-for="el in arr4">
      <div class="box1" v-if="el.age>=18">
          <h3>姓名:{{el.name}}</h3>
          <span>年龄:{{el.age}}岁</span>
      </div>
</div>
<script>
    const app = Vue.createApp({
       data() {
             return {
                  arr4: [{ name: 'jjj', age: 13 },
                         { name: 'ccc', age: 23 },
                         { name: 'mmm', age: 15 },
                         { name: 'www', age: 55 },]
                }
            },
        });
    app.mount('#app');
</script>

页面显示如下,其中还筛选了年龄大于18岁的人员信息,也就是v-for和v-if连用。

        注意:v-if和v-for不建议写在同一元素上。当必须要这么做来实现功能的话,可以使用Vue中的<template></template >标签,将你要使用v-if和v-for的元素包裹起来,它就是一个不起作用的包装器元素,不会创建DOM节点,如下的用法: 

<template>
    <span v-for="el in arr5">{{ el }}</span>
</template >

key的意义:1. 更高效地渲染页面(响应式数据)

                     2. 让数据和节点关联,当刷新数据时,使两者不错位 

<think>好的,我现在需要帮助用户了解Vue.js的相关语法,包括教程和示例。首先,我要整理用户提供的引用内容,看看有哪些信息可以利用。用户给出的引用[1]、[2]、[3]主要涉及Vue.js的实战教程、核心特性和基础语法,比如创建Vue实例、数据绑定、组件化等。 接下来,我需要按照用户的要求来组织回答结构。用户希望回答清晰,逐步解决问题,并且保证真实可靠。根据系统级指令,必须使用中文,还要生成相关问题。同时,数学公式需要用正确的LaTeX格式,不过当前问题主要关于Vue.js,可能不太涉及数学表达式,但要注意其他格式要求,比如独立代码块使用```包裹,行内代码用反引号。 首先,回答的结构应该包括以下几个部分:核心语法概念、数据绑定、指令、组件化、生命周期钩子、示例代码和相关问题。每个部分需要结合引用内容展开。例如,引用[3]提到了创建Vue实例,引用[2]提到了核心特性,引用[1]提到了动态课程表的示例。 需要确保每个部分都有引用标注,比如在讲解Vue实例时,末尾添加[^3],在数据绑定时引用[^2]和。同时,示例代码部分需要参考引用[1]中的课程表案例,可能需要模拟一个简单的数据绑定示例,展示课程列表的渲染。 另外,生成的相关问题要围绕Vue.js语法和应用,比如如何实现双向绑定、组件通信方法、生命周期钩子的使用场景等,这些问题应该基于回答内容中的知识点,帮助用户进一步学习。 在编写过程中要注意检查LaTeX格式是否正确,虽然这里可能用不到数学公式,但如果有任何变量或代码内的数学符号,要正确使用$...$或$$...$$。例如,如果有表达式,确保格式正确,但当前问题可能不需要。 最后,确保所有引用标注正确对应到用户提供的引用内容,引用[1]、[2]、[3]分别对应教程、核心特性和基础语法部分。同时,代码示例要符合语法高亮,使用正确的语言标识,如javascript或html。 现在,组织这些内容,确保结构清晰,分点说明,并自然融入引用标注。检查是否有遗漏的核心概念,比如计算属性、方法、事件处理等,可能需要补充。还要注意用户可能关心的常见问题,如指令的用法、组件创建步骤,这些都需要涵盖在回答中。</think>### Vue.js 核心语法详解与示例 #### 1. **核心语法概念** Vue.js 的核心是**响应式数据绑定**和**组件化架构**。通过创建 Vue 实例连接数据与视图,实现动态更新[^2][^3]。 #### 2. **Vue 实例与数据绑定** 所有 Vue 应用都从创建 Vue 实例开始: ```javascript var app = new Vue({ el: '#app', // 挂载到 DOM 元素 data: { // 响应式数据 message: 'Hello, Vue!', courses: [] }, methods: { // 定义方法 addCourse: function() { /* ... */ } } }) ``` - `el` 指定 Vue 实例控制的 DOM 区域。 - `data` 中的属性会自动响应视图变化[^3]。 #### 3. **模板语法与指令** - **插值表达式**:`{{ message }}` 将数据渲染到页面。 - **指令**: - `v-bind`:绑定属性,如 `v-bind:href="url"` 或简写 `:href="url"`。 - `v-model`:实现表单输入与数据的双向绑定,如 `<input v-model="message">`[^2]。 - `v-for`:循环渲染列表,例如课程表场景: ```html <div v-for="course in courses" :key="course.id"> {{ course.name }} - {{ course.time }} </div> ``` - `v-if` / `v-show`:条件渲染元素。 #### 4. **组件化开发** 组件是 Vue.js 的核心功能,允许复用代码块。 ```javascript Vue.component('course-item', { props: ['course'], // 接收父组件传递的数据 template: '<div>{{ course.name }}</div>' }) ``` 在父组件中使用: ```html <course-item v-for="item in courseList" :course="item"></course-item> ``` #### 5. **生命周期钩子** Vue 实例从创建到销毁会触发生命周期钩子,常用如: - `created()`:实例创建后调用,适合初始化数据。 - `mounted()`:DOM 挂载完成后触发,可操作 DOM 或加载第三方库。 --- ### 示例:书法课程表页面 参考动态课程表案例[^1],结合 Vue 语法实现: ```html <div id="app"> <h1>{{ title }}</h1> <ul> <li v-for="day in schedule" :key="day.id"> {{ day.date }}:{{ day.course }} </li> </ul> </div> <script> new Vue({ el: '#app', data: { title: '书法课程表', schedule: [ { id: 1, date: '周一', course: '楷书基础' }, { id: 2, date: '周三', course: '行书技法' } ] } }) </script> ``` --- §§ 相关问题 §§ 1. Vue.js 中 `v-if` 和 `v-show` 的区别是什么? 2. 如何通过 Vue 组件实现父子组件之间的通信? 3. Vue 的 `computed` 属性和 `methods` 有何不同? 4. 如何用 Vue Router 实现单页应用(SPA)的路由管理? --- ### 引用说明 : 课程表示例参考自「Vue.js 实战:创建一个动态课程表页面」。 : 核心特性描述来自「Vue.js 基础语法详解」。 : Vue 实例与生命周期相关语法引自「Vue.js 是一个流行的 JavaScript 框架...」。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值