class 1: vue初识

news2024/11/26 13:21:29

目录

  • 特点
  • Vue.js 2和Vue.js 3优缺点对比
    • Vue.js 2缺点
    • Vue.js 3优点
  • 架构
  • createApp的对象参数
    • template属性
    • data属性
    • methods属性

vue是由Evan You开源的轻量级前端框架,诞生于2014年,Vue.js 3采用MVVM架构,支持声明式编程、组件化开发、前端路由、单向数据流和数据双向绑定,同时提供了非常多的内置指令来简化对页面的操作。得益于这些特性,Vue.js很快就在前端圈火起来了。2016年10月,Evan You发布了Vue.js 3版本,新增了setup语法、CompositionAPI、TypeScript等特性

  • Vue.js是一套用于构建用户页面的渐进式框架,也就是可以在项目中一点点引入和使用Vue.js,而不需要用Vue.js来开发整个项目

特点

  1. 数据双向绑定:采用声明式编程,可以通过更改数据自动触发视图更新,与React类似
  2. 指令:Vue.js提供了许多内置指令,方便快速操作页面
  3. 组件化:支持组件化开发和封装可复用的代码,与ReactAngular类似
  4. 前端路由:支持前端路由、构建单页面应用(SPA)、服务器端渲染(SSR)应用,与ReactAngular类似
  5. 单向数据流:组件状态管理采用了单向数据流、与React类似

Vue.js 2和Vue.js 3优缺点对比

Vue.js 2缺点

  1. 对TypeScript支持不友好,对大型项目构建不利
  2. Mixin混入缺陷,Vue.js 2使用Mixin混入来抽取相同代码逻辑,但当一个组件有多个Mixin时,代码会变得难以阅读,因为不知道某个属性来自哪个Mixin,并且多个Mixin中的属性容易发生冲突
  3. 响应式系统缺陷,Vue.js 2采用Object.definedProperty来进行数据劫持,这种方式存在一些缺陷,比如无法劫持和监听对象添加或删除属性时的变化,无法遍历对象的每个属性,包括对于对象属性的对象需要进行深度遍历,导致性能低下
  4. 逻辑零散,Vue.js 2使用Options API编写组件,当实现某个功能时,对应的代码逻辑会被拆分到各个属性中,一旦组件变得复杂,逻辑就会变得零散

为了克服上述Vue.js 2存在的缺点,2020年9月Evan You发布了Vue.js 3,改版本带来了非常多新的变化

Vue.js 3优点

  1. monorepo源码管理。mono → \rightarrow 单个,repository → \rightarrow 仓库。monorepo的意思就是将许多项目的代码存储在同一个repository中。具体做法是将不同的模块拆分到packages目录下的子目录中,每个模块都可以看作一个独立的项目,具有自己的类型定义、API、测试用例等
  2. 采用TypeScript进行重构。Vue.js 2整个项目使用Flow进行类型检测,Flow在很多复杂场景中对类型的支持不是非常友好。从Vue.js 3开始,项目全面采用TypeScript进行重构。在TypeScript的加持下,Vue.js 3可以编写更加健壮的代码,同时更容易开发大型项目
  3. 采用Proxy进行数据劫持,这种方式会存在一些缺陷,比如当给对象添加或者删除属性时,是无法进行劫持和监听的;而Vue.js 3采用Proxy实现数据劫持。当给对象添加或者删除属性时,Proxy可以劫持和监听到,因为Proxy劫持的是整个对象,而且Proxy能劫持的类型比Object.definedProperty更丰富,不仅可以劫持set、get方法,还支持劫持in、delete操作等
  4. 编译阶段的优化,使得Vue.js 3在性能和效率方面有较大的提升。包括生成Block Tree、slot编译优化、diff算法优化等。具体可参考相关资料
  5. Composition API。Vue.js 2使用Options API来编写组件,其中包含data、props、methods、computed和生命周期等选项。在实现某个功能时,对应的代码逻辑会被拆分到各个属性中,一旦组件变得更大或更复杂,逻辑就会变的非常分散,需要在多个选项之间寻找,这不利于后期的维护和扩展;相比之下,Vue.js 3主要采用Composition API来编写组件,同时兼容Options API。Composition API包含ref、reactive、computed、watchEffect、watch等函数,Composition API可以将相关的代码放在同一处进行处理,封装成一个Hook函数来支持数据的响应式,并避免Mixins混入带来的缺陷。这样可以更加方便的实现在多个组件之间共享逻辑,也能够提高代码的可读性和可维护性
  6. 移除了一些非必要API,Vue.js 3移除了Vue实例中的$on$off$once API,还移除了一些特性,比如filter和内联模版等

架构

根据官方说法,Vue的整个设计受到MVVM架构的启发

  • MVVVM架构模式是一种软件体系结构,代表Model、View和ViewModel,如下图所示
    在这里插入图片描述
  • View代表视图层,用于编写页面布局
  • ViewModel负责把Model层的数据绑定到View层,将View层产生的DOM事件绑定到Model层
  • Model是模型层,用于提供模型和数据

createApp的对象参数

  • Vue实例是通过Vue.createApp函数创建的,该函数需要接收一个对象作为参数,该对象可以添加template、data、methods等属性

template属性

  • Vue.js 3中的template属性用于定义需要渲染的模板内容,其中包括HTML标签或组件,并最终将其挂载到<div id="app"></div>元素上,相当于为innerHTML赋值。在模板中,也会使用一些语法,例如{{}}@click
  • 在template属性中,使用字符串的方式来编写HTML页面,vs code并没有提供智能提示,这会降低编码效率和体验。为了解决这个问题,Vue.js 3提供了两种方式来优化模板的编写。
  1. 使用<script>标签,将其类型标记为x-template,并为其添加id属性。
  2. 使用任意标签(通常是<template>标签,因为它不会被浏览器渲染),并为其添加id属性

<template>标签或元素是一种用于保存客户端内容的机制。当页面加载时,该内容不会呈现,但可以在运行时使用javascript进行实例化
innerText:获取或设置元素的文本内容,不包含 HTML 标签。
textContent:获取或设置元素的文本内容,包括所有子节点。
outerHTML:获取或设置元素及其所有子元素的 HTML 内容。
innerHTML:获取或设置元素的 HTML 内容,但不包括元素本身。

  • 接下来让我们尝试使用不同方法,实现一个简单计数器。如果用原生javascript方式实现,代码可能是下面这样的
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2 class="counter"></h2>
    <button class="increment">+1</button>
    <button class="decrement">-1</button>
    <script>
        const counterE1 = document.querySelector(".counter")
        const increment = document.querySelector(".increment")
        const decrement = document.querySelector(".decrement")
        let counter = 100;
        counterE1.innerHTML = counter;
        // 监听按钮点击事件
        increment.addEventListener("click", () => {
            counter += 1;
            // 点击按钮后进行变量赋值
            counterE1.innerHTML = counter;
        })
        decrement.addEventListener("click", () => {
            counter -= 1;
            counterE1.innerHTML = counter;
        })
    </script>
</body>
</html>
  • 如果用vue.js 3实现,代码可能是下面这样的。(这需要引入Vue.js 3源码。可以通过CDN或者本地引入,链接为https://unpkg.com/vue@3.4.38/dist/vue.global.js)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app">
        <h2> {{ counter }}</h2>
        <button @click="increment"> +1 </button>
        <button @click="decrement"> -1 </button>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    counter: 100
                }
            },
            methods: {
                increment() {
                    this.counter += 1;
                },
                decrement() {
                    this.counter -= 1;
                }
            }
        })
        app.mount("#app")
    </script>
</body>
</html>
  • <script>标签的写法如下
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    // 添加type="x-template"和id="here"两个属性
    <script type="x-template" id="here">
        <div>
            <h2> {{ message }}</h2>
            <h2> {{ counter }}</h2>
            <button @click="increment"> +1 </button>
            <button @click="decrement"> -1 </button>
        </div>
    </script>
    <script src="./js/vue.js"></script>
    <script>
        const app = Vue.createApp({
            template: '#here', // 通过id选择器选中页面上的模板,底层执行document.querySelector("#here")查找
            data() {
                return {
                    message: 'script',
                    counter: 100
                }
            },
            methods: {
                increment() {
                    this.counter += 1;
                },
                decrement() {
                    this.counter -= 1;
                }
            }
        })
        app.mount("#app")
    </script>
</body>
</html>
  • 使用<template>标签的写法可能是这样的
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <template id="here">
        <div>
            <h2> {{ message }}</h2>
            <h2> {{ counter }}</h2>
            <button @click="increment"> +1 </button>
            <button @click="decrement"> -1 </button>
        </div>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        Vue.createApp({
            template: "#here",
            data() {
                return {
                    message: 'template',
                    counter: 100,
                }
            },
            methods: {
                increment() {
                    this.counter += 1
                },
                decrement() {
                    this.counter -= 1
                }
            }
        }).mount('#app')
    </script>
</body>
</html>

data属性

  • 可以看到,上面的Vue.createApp的参数里面有一个data属性,它会用于为Vue.js组件定义响应式数据,该属性需要传入一个函数,该函数需要返回一个对象。该对象会被Vue.js响应式系统劫持,之后对该对象的修改或访问都会在劫持中被处理,所以该对象中定义的数据都是响应式的。比如在template中通过使用{{counter}},可访问到该对象中、定义的counter;当修改counter时,template中的{{counter}}也会发生改变

methods属性

  • methods属性需要传入一个对象,通常在这个对象中会定义很多方法。这些方法会绑定到模板中,例如上面反复定义的incrementdecremnet方法。在方法中,可以使用this关键字直接访问data返回对象的属性
  • methods属性中定义的方法不能使用箭头函数。否则无法使用this直接访问data中的数据,因为this在箭头函数中会在自己的上层作用域中查找this

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

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

相关文章

【IEEE独立出版】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

防火墙iptalbes和firewalld

一、IPtables介绍 Iptables是unix/linux自带的一款开源的基于包过滤(对OSI模型的四层或者是四层以下进行过滤)的防火墙工具&#xff0c;它的功能十分强大&#xff0c;可以对流入和流出服务器的数据包进行很精细的控制。 iptables其实并不是真正的防火墙&#xff0c;我们可以把…

软信天成:国内企业需要什么样的国产主数据管理平台?(三)

在前两期的内容里&#xff0c;我们探讨了当前国内企业使用国产主数据管理平台的紧迫需求&#xff0c;概述了软信自主研发的智能主数据管理平台如何通过“数据建模”、“个性化配置”、“PIM管理”以及“权限管理”四大功能推动企业高效运作。 本期&#xff0c;我们将为您介绍平…

瑞吉外卖--登录退出功能的实现

登录功能 需求分析 1. Controller 定义&#xff1a;Controller是MVC&#xff08;Model-View-Controller&#xff09;设计模式中的一部分&#xff0c;负责处理HTTP请求并返回HTTP响应。在Spring MVC中&#xff0c;Controller通常是一个处理特定HTTP请求的类。作用&#xff1a; …

可调电阻是否有正负极?

可调电阻没有固定的正负极&#xff0c;但是有一根箭头表示旋转的方向。 可调电阻在形状上类似于一个圆柱形或方形的小盒子&#xff0c;通常带有三个引脚或更多&#xff0c;其中一个是中心引脚&#xff0c;其余的是两个端部引脚。不像电解电容或二极管那样有固定的正负极&#…

PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码

&#x1f680;轻创推客&#xff0c;营销新纪元 —— 集淘客与地推任务于一体的全能平台&#x1f310; &#x1f308;【开篇&#xff1a;营销新潮流&#xff0c;轻创推客引领未来】 在瞬息万变的营销世界里&#xff0c;你还在为寻找高效、全面的营销渠道而烦恼吗&#xff1f;&…

Android经典实战之跳转到系统设置页面或其他系统应用页面大全

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 在Android开发中&#xff0c;经常需要跳转到系统设置页面或其他系统应用页面。以下是一些常见的跳转方式及对应的Intent动作&#xff1a; 1. 跳…

全渠道分销零售行业免费开源ERP解决方案

引言 协助分销及零售连锁企业快速搭建新零售格局&#xff0c;充分整合移动社交流量、门店流量&#xff0c;实现企业线上线下 全渠道管理运营。 业务挑战 传统的经营模式&#xff0c;客户流失严重 分销及零售企业还处于传统经营模式&#xff0c;单一的商品、收银方式、会员维护…

绝对能让你效率起飞的10个AI工具及ChatGPT国内镜像集合【2024必备】

随着GPT的兴起&#xff0c;一大批AI工具随之诞生&#xff0c;其中有很多堪称神器 分享10个国内可以使用使用的网站和AI搬砖工具&#xff0c;摸鱼起飞就靠他们了。 1&#xff1a; AI Plus【AI对话】 推荐指数&#xff1a;⭐️⭐️⭐️⭐️⭐️ 适合人群&#xff1a;学生党、打…

前端面试题每日一学_2

今日一题&#xff1a; 下面JS代码执行后&#xff0c;最终的三个console.log的输出结果是什么&#xff1f; var obj { num: 1 }; var arr1 [1, 2, obj]; var arr2 arr1.slice(1); arr2[0]; arr2[1].num; obj.num; arr1[2].num; console.log(arr1[1] arr2[0]); console.log…

家政预约小程序源码+快速搭建全攻略

前言&#xff1a; 家政预约小程序是一种便捷的家政服务预约平台&#xff0c;它通过互联网技术将家政服务资源与用户连接起来&#xff0c;为用户提供高效、便捷的家政服务预约体验。 一、家政服务小程序开发架构 前端&#xff1a;小程序前端开发主要使用的技术包括HTML、CSS、…

向量嵌入是什么?理解LLM数据表示的基础

向量嵌入将数据转换为数学方程&#xff0c;赋予了人工智能的认知能力&#xff0c;但它们是如何使机器能够“学习”和“成长”的呢&#xff1f; 向量嵌入是什么&#xff1f; 向量嵌入这玩意儿&#xff0c;其实就是给数据穿上一件数学的外衣&#xff0c;让它们之间的关系和相似…

【SQL】三角形判断

目录 题目 分析 代码 题目 表: Triangle ------------------- | Column Name | Type | ------------------- | x | int | | y | int | | z | int | ------------------- 在 SQL 中&#xff0c;(x, y, z)是该表的主键列。 该表的每一行包…

生信圆桌x生信豆芽菜:生物信息学新手的学习与成长平台

生信豆芽菜是一个专门为生物信息学初学者创建的学习与交流平台&#xff0c;致力于帮助新手们快速入门并掌握生信分析的基础知识与技能。随着生物信息学在科研中的重要性日益提升&#xff0c;越来越多的学生和研究人员开始接触这一领域。生信豆芽菜正是为了满足这些新手的需求&a…

土壤墒情固定监测站的工作原理

TH-GTS03土壤墒情固定监测站是一种专门用于监测土壤墒情信息的设备&#xff0c;它通过一系列精密的传感器和数据处理系统&#xff0c;实时、准确地获取土壤的水分含量、温度以及其他相关参数&#xff0c;为农业生产、生态保护和水资源管理等提供重要依据。 土壤墒情固定监测站通…

实用库/函数之链表的使用

目录 1.1结点的建立 1.2为链表结点分配内存空间 1.stdlib:malloc函数与free函数 2.new运算符与delete运算符 1.3链表的基本操作 1.链表的创建 (1)头插法 (2)尾插法 2.查找 3.插入 4.删除 5.总结(小tip) 1.4静态链表(类似于数组) 1.1结点的建立 typedef str…

基于Java语言实现Creo二次开发的环境搭建

# 安装JAVA JDK 通常我们下载JDK在Oracle(甲骨文公司)官网下载即可&#xff1a;Java Downloads | Oracle 双击下载的软件后进行安装。安装过程可以选择自己想安装的位置&#xff08;安装的路径中最好不要存在中文和空格&#xff09; 这里由于我们是先安装Java编译及运行环境默…

上传PDF、DOC文件到SAP HCM系统中案例

背景:公司最近在上电子签系统&#xff0c;以实现劳动合同、保密协议等文件的去纸质化&#xff0c;保存为电子档文件&#xff0c;而企业的信息化的中心是SAP ERP&#xff0c;于是领导要求将签好的电子文件存储到HCM中。 题主写了如下代码实现需求&#xff1a; FUNCTION ZHR_SA…

数据恢复技巧:Windows降级后如何恢复数据

将 Windows 11 回滚到 Windows 10 或将 Windows 10 回滚到 Windows 7 后文件消失了&#xff1f;Windows降级后如何恢复数据&#xff1f;在这里&#xff0c;这篇关于MiniTool的帖子将向您展示最好的数据恢复软件&#xff0c;以帮助您执行Windows文件恢复。 Windows 降级后&#…

短视频SDK解决方案,Flutter赋能,跨平台无缝体验

如何快速、高效地创作出既吸引人眼球又富有个性的短视频&#xff0c;成为了众多内容创作者、APP开发者及企业营销团队共同关注的焦点。美摄科技作为视频技术领域的佼佼者&#xff0c;凭借其强大的技术实力与创新精神&#xff0c;推出了基于Flutter框架的短视频SDK解决方案&…