超详细:Vue入门

news2024/11/26 16:54:30

Vue(发音为 /vjuː/,类似 view)是近些年比较流行的前端框架之一,和 React、Angular 并称为前端三大框架。其中 Vue 简单易学的特点成为国内主流,很多公司已经把它列为一 个前端开发人员必须要掌握的技术点了。

Vue 简介

Vue2.x官网

Vue3.x 官网

什么是 Vue

        目前 Vue 主要有 2.x 和 3.x 两个主流的大版本,由于 Vue3 的普及问题,本书并没有直接使用 3.x 版本,主要教学 2.x 版本。

        官网(2.x 版)对 Vue 的定义是:Vue 是一套用于构建用户界面的渐进式框架。与其它 大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层, 不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及 各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

MVVM 思想

Vue 在设计上使用的 MVVM(Model-View-ViewModel)模式,其中

  • Model:模型,负责存储和提供数据

  • View:视图,负责页面展示

  • ViewModel:视图模型,是 View 和 Model 之间的桥梁。它负责处理 View 和 Model 之
    间的交互,比如将 Model 的数据转换为 View 可以展示的格式,或者将用户在 View 上
    的操作转换为 Model 的数据更新。

MVVM 将 View 的状态和行为抽象,把视图层和业务逻辑层分离,ViewModel 就是完成这些工作的。

MVVM 模式的优势

  • 低耦合:View 可独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的 View上,当 View 变化时 Model 可以不变,当 Model 变化时 View 也可以不变。

  • 可重用性:由于三个部分相对独立,所以可重用性高,一个 Model 可以用于多个 View,
    一个 ViewModel 的业务逻辑也可以作用于多个 View。
  • 独立开发:同样由于独立性,设计人员可以专注于 View 视图的开发,擅长业务逻辑的开发人员可以专注开发 ViewModel,更易于团队合作。

Vue 入门

Vue 体验

尝试 Vue.js 最简单的方法是使用 Hello World 例子。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app1" style="border: 1px solid black;">
        <h3>这是 app1 的作用域</h3>
        <my-component></my-component>
    </div>
    <div id="app2" style="border: 1px solid black;">
        <h3>这是 app2 的作用域</h3>
        <my-component></my-component>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        // 注册全局组件
        Vue.component('MyComponent', {
            // 注意:template 使用的是模板字符串,可以换行
            template: `<button @click='addCount'>
        全局组件,被点击次数是{{count}}
        </button>`,
            // 注意:组件的 data 必须是函数,数据是独立的,不会相互影响
            data() {
                return {
                    count: 0
                }
            },
            methods: {
                addCount() {
                    this.count++;
                }
            }
        });
        // 创建 Vue 实例 app1
        const app1 = new Vue({
            el: '#app1'
        })
        // 创建 Vue 实例 app2
        const app2 = new Vue({
            el: '#app2'
        })
    </script>
</body>

</html>

这是一段非常简单的 Vue 入门代码,却展示了 Vue 最核心的功能:数据双向绑定。当 我们修改输入框中的姓名时,对应绑定的变量 youName 也会实时显示在 H1 标签中,做到 同步修改,运行结果如图所示。这极大简化了传统 JS 需要先绑定 blur 事件,读取输入框的 值,再选中 H1 标签修改内容的一系列繁琐操作。

 Vue 开发步骤梳理

下载或通过 CDN 引用 Vue.js 库

使用一个 JS 的框架或库,通常我们可以下载到本地通过 script 标签引用,或者通过CDN 的方式引入。

(1) Vue 下载地址:

Vue下载地址

 点击对应版本进行下载即可。

(2) CDN 引入

内容分发网络(Content Delivery Network,CDN)是一种网络架构,旨在提高用户对互

联网上内容的访问速度和性能。CDN 通过在全球各地部署大量的服务器节点,将内容缓存

到离用户更近的服务器上,从而减少内容传输的距离,提高访问速度和响应时间。当用户

请求访问某个网站或应用程序时,CDN 会自动选择距离用户最近的服务器节点,从该节点

提供内容,而不是直接从原始服务器获取内容。

对于生产环境,推荐链接到一个明确的版本号和构建文件,以避免新版本造成的不可

预期的破坏。

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

注意:CDN 加速的优点是成本低、速度快、适合访问量比较大的网站。

创建 View 视图

在 html 代码中,我需要确定一个被 Vue 所管理的范围,表示此范围内的 HTML 内容都交给 Vue 进行解析和变化。下面代码中的 div 就是即将被 Vue 管理的范围。

<div id="app">
    <input type="text" v-model="youName" placeholder="请输入你的姓名">
    <h1>Hello, {{ youName }}!</h1>
</div>
实例化一个 Vue 对象
<script>
    let app = new Vue({
        el: '#app',
        data: {
            youName: ''
        }
    })
</script>

代码中 new 了一个 Vue 对象,其中的 el 属性指定了 ID 选择器选中<div id=”app”>作为 Vue的模板代码,data 为绑定的数据。

绑定和使用数据

在 input 标签使用 v-model 绑定了 data 中的属性 youName, 而在 H1 标签内容中 youName属性用一对双花括号包裹,一旦修改了输入框的内容,youName 的值就同时修改了,H1 的内容也同时修改了。

Vue.js 的核心是一个响应的数据绑定系统,它让数据与 DOM 保持同步非常简单。在使用 jQuery 手工操作 DOM 时,代码常常是命令式的、重复的与易错的。Vue.js 拥抱数据驱动的视图概念。通俗地讲,它意味着我们在普通 HTML 模板中使用特殊的语法将DOM “绑定”到底层数据。一旦创建了绑定,DOM 将与数据保持同步。每当修改了数据,DOM 便相应地更新。这样我们应用中的逻辑就几乎都是直接修改数据了,不必与 DOM更新搅在一起。这让我们的代码更容易撰写、理解与维护。

表达式
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- JSON 变量 -->
        <p>{{ msg }}</p>
        <!-- 数字类型 -->
        <p>{{ 98 }}</p>
        <!-- 字符串类型 -->
        <p>{{ "Hello Vue!" }}</p>
        <!-- JavaScript 表达式 -->
        <p>{{ "Hello " + name }}</p>
        <p>{{ 10 / 5 }}</p>
        <!-- 三元表达式 -->
        <p>{{ ok ? 'YES' : 'NO' }}</p>
        <p>{{ msg.split('').reverse().join('') }}</p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                msg: "Mustache 语法",
                name: "菲菲",
                ok: true
            }
        });
    </script>
</body>

</html>

Vue 指令

指令的概念

        指令 (Directives) 是特殊的带有前缀 v- 的特性。指令的值限定为绑定表达式,因此上节提到的插值表达式这里也是可以适用,只是不需要编写双花括号了。指令的职责就是当其表达式的值改变时把某些特殊的行为应用到 DOM 上。

常用指令

        内容输出指令 v-text、v-html,条件渲染指令 v-if、 v-else、v-show,列表渲染指令 v-for,数据绑定指令 v-model、v-bind,事件绑定指令 v-on等。

内容输出指令
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- 使用插值表达式 -->
        <p>{{ msg }}</p>
        <!-- 使用 v-text 指令 -->
        <p v-text="msg"></p>
        <!-- 使用 v-html 指令 -->
        <p v-html="msg"></p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                msg: '<h1>Hello Vue!</h1>',
            }
        });
    </script>
</body>

</html>
条件渲染指令

作为模板语言,条件判断也是必不可少的,其中 v-if 和 v-else 指令是控制元素是否需要出现在 DOM 树结构中,注意 v-else 指令必须紧跟着 v-if 指令的后面,中间不能添加其他元素。而 v-show 是控制元素是否需要显示在界面中,此元素会一直存在于 DOM 树结构中。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div v-if="ok">我是 v-if 指令控制的 DIV</div>
        <div v-else>我是 v-else 指令控制的 DIV</div>
        <div v-show="show">我是 v-show 指令控制的 DIV</div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                ok: true,
                show: true
            }
        });
    </script>
</body>

</html>

我们设置数据 ok 为 true,show 也为 true,查看浏览器运行效果,并键入 F12 打开“开发者工具”中的 Elements 选项卡,查看对应的 DOM 结构,可以发现我们写了 3 个 DIV 元素,但是在 DOM 结构中只有 v-if 和 v-show 的 DIV 存在,v-else 对应的 DIV 因为不满足条件,被删除了。

 接下来我们把 ok show 都设置为 false,再查看结果。

data : {
    ok : false,
    show : false
}

运行结果如图所示,页面只显示了 v-else 指令内容,而 v-show 是通过将 CSS 样式中 display设置为 none 的方式隐藏的,依然存在于 DOM 结构中。

        下面我们总结一下 v-if 和 v-show 的区别,v-if 控制的是元素是否需要出现在 DOM 结构中,作用是添加和删除元素,v-show 控制的是元素的隐藏和显示,无论是否显示都一直在 DOM 结构中。

        从结果来看 v-if 和 v-show 都是元素是否渲染在界面上,那么使用时就可以随便选么?当然不是,它们各自的使用场景如下:

  •  v-if 指令有更高的切换消耗,因为条件成立时是需要通过添加元素改变 DOM 树结构的,不成立时又要删除元素且内部指令不执行,如果频繁的显示和隐藏性能消耗大,适合首次加载时判断是否需要渲染,后续不再更改条件。
  • v-show 无论条件是否成立,元素都必须添加到 DOM 树中,所以有更高的初始渲染消耗,通过 CSS 样式来控制是否显示,性能消耗小,适合频繁切换显示隐藏的元素。

列表渲染指令
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <ul>
            <!-- 使用 v-for 修饰的 li 标签会重复生成 -->
            <!-- course 是循环元素(课程),index 是下标 -->
            <li v-for="(course,index) in courses" :key="index">
                {{index}} 、课程:{{course.name}}
                <ul>
                    <!-- 嵌套循环,显示课程的章节信息 -->
                    <li v-for="(chapter,idx) in course.chapters" :key="idx">
                        {{idx}} 、章节:{{chapter.name}} 课时:{{chapter.lesson}}
                    </li>
                </ul>
            </li>
        </ul>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                courses: [
                    {
                        name: "前端框架入门", chapters: [
                            { name: "Vue.js", lesson: 4 },
                            { name: "React.js", lesson: 8 },
                            { name: "Angular.js", lesson: 16 }
                        ]
                    },
                    {
                        name: "后端框架入门", chapters: [
                            { name: "MyBatis", lesson: 8 },
                            { name: "Spring", lesson: 8 },
                            { name: "SpringMVC", lesson: 16 }
                        ]
                    }
                ]
            }
        });
    </script>
</body>

</html>
数据绑定指令
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- 写死 src,不能动态改变 -->
        <img src="images/vue.png" />
        <!-- 使用 v-bind 指令,可动态改变 src -->
        <img v-bind:src="imageSrc" />
        <!-- 简写写法 -->
        <img :src="imageSrc" />
        <!-- 绑定对象,则属性值为 true 的添加,false 的不添加 -->
        <p v-bind:class="{ classA: hasA, classB: hasB }">段落 1</p>
        <!-- 绑定数组,则数组中的样式都会添加 -->
        <p v-bind:class="classArray">段落 2</p>
    </div>
    <script src=" https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                imageSrc: 'images/vue.png',
                hasA: false,
                hasB: true,
                classArray: ['classA', 'classC']
            }
        });
        setTimeout(function () {
            // 3 秒后修改图片属性值,查看图片是不是变化了
            app.imageSrc = 'images/react.png';
        }, 3000);
    </script>
</body>

</html>

我们需要等待 3 秒后,可以看到后面两张图片的变化,因为我们通过 Vue 实例对象修改了 imageSrc 这个属性,导致用 v-bind:src 绑定此属性的两张图片的 src 跟着变化。再看”开发者工具”中的 Elements 选项卡,会发现段落 1 中只用到了类样式 classB,因为 hasB 为 true值。段落 2 则使用了数组,所以类样式 ClassA 和 ClassC 都存在。

事件绑定指令
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <style>
        .container {
            width: 400px;
            margin: 0 auto;
            text-align: center;
        }

        .square {
            width: 200px;
            height: 200px;
            background-color: red;
            margin: 0 auto;
        }
    </style>
    <div id="app" class="container">
        <div class="square" v-show="show"></div>
        <br />
        <button @click="toggle()">点击切换</button>
        <!-- <button v-on:click="toggle()">点击切换</button> -->
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                show: true
            },
            // 事件函数需定义在 methods 中
            methods: {
                // ES6 对象函数的简写方式
                toggle() {
                    this.show = !this.show;
                }
            }
        });
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙next打包流程

目录 下载团结引擎 添加开源鸿蒙打包支持 打包报错 路径问题 安装DevEcoStudio 可以在DevEcoStudio进行打包hap和app 包结构 没法直接用previewer运行 真机运行和测试需要配置签名,DevEcoStudio可以自动配置, 模拟器安装hap提示报错 安装成功,但无法打开 团结1.3版本新增工具…

你是我的映射,我是你的值:C++ map 中的心灵共鸣

文章目录 map的概念一、map的使用1. 插入删除相关1&#xff09;插入(1) 插入语法(1) 插入语法 2&#xff09;删除 二. map的遍历三、map重载operator[]四、小试&#x1f402;&#x1f52a;1. 前K个高频单词2. 单词识别 总结 map的概念 map是key_value的模型&#xff1a; 一棵树…

RabbitMQ客户端应用开发实战

这一章节我们将快速完成RabbitMQ客户端基础功能的开发实战。 一、回顾RabbitMQ基础概念 这个RabbitMQ的核心组件&#xff0c;是进行应用开发的基础。 二、RabbitMQ基础编程模型 RabbitMQ提供了很多种主流编程语言的客户端支持。这里我们只分析Java语言的客户端。 上一章节提…

RNA-seq 差异分析的点点滴滴(1)

引言 本系列[1])将开展全新的转录组分析专栏&#xff0c;主要针对使用DESeq2时可能出现的问题和方法进行展开。 为何使用未经标准化的计数数据&#xff1f; DESeq2 工具包在接收输入时&#xff0c;期望得到的是未经处理的原始计数数据&#xff0c;比如从 RNA-seq 或其他高通量测…

RTC精度及校准

RTC精度偏差&#xff1a; RTC的基准时间和精度与石英晶体的频率相关&#xff0c;晶体的谐振频率取决于温度&#xff0c;因此RTC性能与温度相关&#xff0c;晶体的频率偏差是晶体正常频率的温度反转函数。 一、硬件方面&#xff1a; 1.使用高精度振荡器的RTC模块&#xff1b; …

智慧城市路面垃圾识别系统产品介绍方案

方案介绍 智慧城市中的路面垃圾识别算法通常基于深度学习框架&#xff0c;这些算法因其在速度和精度上的优势而被广泛采用。这些模型能够通过训练识别多种类型的垃圾&#xff0c;包括塑料袋、纸屑、玻璃瓶等。系统通过训练深度学习模型&#xff0c;使其能够识别并定位多种类型…

【安当产品应用案例100集】029-使用安全芯片保护设备核心业务逻辑

我国工业企业普遍缺乏数据安全意识&#xff0c;对数据安全保护缺乏基本认识。这导致企业在数据安全方面的投入不足&#xff0c;保护能力基本不具备&#xff0c;难以有效应对数据安全风险。不过随着安全事件越来越多&#xff0c;很多工业企业的安全意识也越来越高&#xff0c;在…

遥控器工作核心技术以及传输信号算法详解!

一、遥控器传输信号算法 无线通信技术&#xff1a;无人机遥控器信号传输算法主要基于无线通信技术&#xff0c;通过特定的调制、编码和信号处理技术&#xff0c;将遥控器的操作指令转化为无线电信号&#xff0c;并传输给被控制设备。被控制设备接收到信号后&#xff0c;再将其…

性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台

前言 在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系…

电力调度控制台安全性有没有保障

电力调度控制台作为电力系统的核心组成部分&#xff0c;承担着监控、控制和调度电网运行的重要任务。随着电力系统的不断发展和智能化水平的提升&#xff0c;电力调度控制台的安全性问题也日益受到关注。那么&#xff0c;电力调度控制台的安全性究竟有没有保障呢? 从技术层面来…

练习LabVIEW第四十四题

学习目标&#xff1a; 计算学生三门课(语文&#xff0c;数学&#xff0c;英语)的平均分&#xff0c;并根据平均分划分成绩等级。要求输出等级A,B,C,D,E。90分以上为A&#xff0c;80&#xff5e;89为B&#xff0c;70&#xff5e;79为C&#xff0c;60&#xff5e;69为D&#xff…

录音怎么转换成文字?这5款视频语音转文字工具轻松搞定!

在各类会议、讲座、采访及日常学习活动中&#xff0c;录音已成为我们记录关键信息的常用手段。然而&#xff0c;面对那些可能长达数小时甚至更久的录音文件&#xff0c;如何快速有效地将它们转换成可编辑、可搜索的文字资料&#xff0c;确实是一个令人困扰的问题。为此&#xf…

蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片&#xff1a; 【问题描述】 …

面试题:Spring(一)

1. Spring框架中bean是单例么&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例。 2. Spring框架中的…

InnoDB 存储引擎<七>通用表空间+临时表空间

目录 通⽤表空间 - General Tablespace 临时表空间 - Temporary Tablespaces 通⽤表空间 - General Tablespace 对应磁盘上的文件需要用户手动创建 1.通⽤表空间的作⽤和特性&#xff1f; 解答问题&#xff1a; 1.作用&#xff1a;可以把数据量比较小且强相关的表&#xff…

linux 通过apt安装软件包时出现依赖包版本不对的问题解决

通过网上查找解决办法时&#xff0c;发现的解决办法无法完美解决问题: 比如通过安装对应版本解决 如: sudo apt-get install xxx2.7.0ubuntu 这样会先卸载原先包&#xff0c;在安装对应版本的包 或者直接删除依赖的包 sudo apt-get purge xxxx 如果碰到底层包的话&#xf…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例,以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b)

提升电机控制的关键:东芝TB6605FTG深度解析

在电机控制领域&#xff0c;对高效、精确且可靠的组件的需求是不可忽视的。东芝的TB6605FTG正是一款具备这些特性的电机驱动IC&#xff0c;是工程师们在设计电机控制系统时的理想选择。 主要特性与规格 TB6605FTG的核心是一个三相全波电机驱动IC&#xff0c;专为无刷直流电机控…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【K8S系列】K8S 集群 CPU 爆满导致 Pod Pending 状态的分析与解决方案

在 Kubernetes 集群中&#xff0c;CPU 突然爆满可能导致 Pod 状态变为 Pending&#xff0c;影响应用的可用性。本文将深入分析其原因&#xff0c;并附上相关命令及其执行结果&#xff0c;帮助你更好地理解和解决此问题。 1. 问题描述 在 Kubernetes 集群中&#xff0c;当 CPU …