Vue2-简介、模板语法、数据绑定、MVVM、数据代理、事件处理

🥔:成功之后就能光明正大地回望所有苦难

VUE-Day1

    • Vue简介
      • 1、Vue是什么?
      • 2、谁开发的? 发展历程?
      • 3、Vue的特点
      • 4、容器和实例、实例中的el和data
      • 总结
    • Vue模板语法
      • 插值语法
      • 指令语法
    • 数据绑定
      • 1.单向数据绑定(v-bind)
      • 2.双向数据绑定(v-model)
    • el和data的两种写法
      • 1、el的两种写法
      • 2、data的两种写法
    • MVVM
    • 数据代理
      • Object.defineProperty方法
      • 数据代理
      • Vue中的数据代理
    • 事件处理
      • 事件处理
      • 事件修饰符
      • 键盘事件
      • 补充两个小技巧
      • 补充两个小技巧

Vue简介

1、Vue是什么?

官网说法:Vue是一套用于构建用户界面渐进式JavaScript框架。

  • 构建用户界面:数据—>界面
  • 渐进式:Vue可以自底向上逐层的应用

Vue官网:

英文官网: https://vuejs.org/

中文官网: https://cn.vuejs.org/

2、谁开发的? 发展历程?

Vue是尤雨溪开发的。

请添加图片描述

3、Vue的特点

  1. 采用组件化模式,提高代码复用率,且让代码更好维护。

    一个.vue就是一个组件

  2. 声明式编码,让编码人员无需直接操作DOM,提高开发效率。

请添加图片描述

  1. 使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点。

请添加图片描述

4、容器和实例、实例中的el和data

  • el: 用来指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
  • data: 用来存储数据,数据给el指定的容器所使用,注意,一旦data中的数据发生更改,Vue模板就会重新解析,这样页面中用到data的地方都会自动更新。data的值可以写成对象,也可以写成函数(后面组件会讲)。

请添加图片描述

请添加图片描述

总结

  1. 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象。

  2. root容器里代码依然符合HTML规范,只不过混入了一些特殊的Vue语法。

  3. root容器里的代码被称为【Vue模板】。

  4. Vue容器与与Vue实例是一对一关系,一个容器只能被一个Vue实例接管,一个Vue实例只能接管一个容器。

  5. 真实开发中只有Vue实例,并且会配合着组件一起使用。

  6. {{xxx}}中的xxx要写js表达式(不能写if,for这样的js代码),且xxx可以自动读取到data中的所有属性。

  7. 一旦data中的数据发生改变,那么模板中用到该数据的地方也会自动更新。

Vue模板语法

插值语法

功能:用于解析标签体内容。也就是插值语法都是写在html标签体内容里的。
写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。

指令语法

功能:用于解析标签(包括:标签属性、标签体内容、绑定事件等等)。
举例:v-bind:href="xxx"或简写为:href=“xxx”,xxx同样要写js表达式,且可以直接读取到data中的所有属性。
备注:Vue中有很多指令,且形式都为:v-???,此时仅用v-bind举例。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>模板语法</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备一个容器 -->
    <div id="root">
      <h1>插值语法</h1>
      <h3>你好,{{name}}</h3>
      <hr />
      <h1>指令语法</h1>
      <!-- 如果不加"v-bind"":"的话,url就只是一个普通的字符串,不会跳转 -->
      <a href="two.url">{{two.name}}一下</a>
      <a v-bind:href="two.url">{{two.name}}一下1</a>
      <!-- v-bind可以直接简写成冒号: -->
      <a :href="two.url.toUpperCase()">{{two.name}}一下2</a>
      <!-- 这个url直接就当成表达式来执行了 -->
    </div>

    <script type="text/javascript">
      new Vue({
        el: "#root",
        data: {
          //此处有两个name,但是有层级结构所以他们不会冲突,但是在前面容器使用时要注意指定好是哪个name
          name: "www",
          two: {
            name: "百度",
            url: "https://www.baidu.com/",
          },
        },
      });
    </script>
  </body>
</html>

数据绑定

1.单向数据绑定(v-bind)

数据只能从data流向页面

单向数据绑定:<input type="text" v-bind:value="name">

单向数据绑定简写:<input type="text" :value="name">

2.双向数据绑定(v-model)

页面↔data

双向绑定一般都应用在表单类元素上(如:input、select等输入类元素

v-model:value可以简写为v-model,因此v-model默认收集的就是value值

双向数据绑定:<input type="text" v-model:value="name">

双向数据绑定简写:<input type="text" v-model="name">

el和data的两种写法

1、el的两种写法

1.new Vue时配置el属性。el:‘#demo’

const vm = new Vue({
            el: '#demo',   //第一种写法,新建Vue实例的时候就指定关联的容器
            data: {
                name: 'www'
            }
        })

2.先创建Vue实例,随后再通过vm.$mount(‘#demo’)指定el属性。

const vm = new Vue({
    data: {
        name: 'www'
    }
})
vm.$mount('#demo');  //第二种写法
  • mount:挂载

2、data的两种写法

1.对象式

data: {
         name: 'www'
      }

2.函数式

data: function () {
     return {
               name: 'www'
            }
            	}

函数式简写:

data() {
     return {
               name: 'www'
            }
            	}
  • 目前哪种写法都可以,当学到组件时,data必须使用函数式,否则会报错。
  • 由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了,而是window。

MVVM

这个模型在Vue之前就有了,尤雨溪只是参考了MVVM,其中:

M:模型(Model):对应data中的数据
V:视图(View):模板
VM:视图模型(View Model):Vue实例对象

请添加图片描述

  • VM就像一个纽带。M(数据)经过VM放到页面(V)上,页面(V)需要映射回M(数据)的数据也经过VM。
  • 我们经常会使用vm(ViewModel)这个变量名来表示Vue实例,因此我们使用变量接收Vue实例时一般变量名都叫vm。

请添加图片描述

总结:
1、data中所有的属性,最后都出现在了vm身上。(这里其实是数据代理,后面会提到)
2、vm身上所有的属性以及Vue原型上所有的属性,在Vue模板上都可以直接使用。

数据代理

Object.defineProperty方法

Object.defineProperty方法会直接在对象上定义一个新的属性,或者修改一个对象的现有属性,然后返回该对象。
比如下面这个案例,我们可以借助这个方法让变量number和person对象中的age产生关联

//回顾Object.defineproperty方法
let number = 18;
let person = {
    name: 'www',
    sex: '男',
    // age: number
}

Object.defineProperty(person, 'age', {
    //     value: 18,
    //     enumerable: true,  //控制属性是否可以被遍历,默认值是false
    //     writable: true,  //控制属性是否可以被修改,默认值是false
    //     configurable: true  //控制属性是否可以被删除,默认值是false

    //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    get() {
        console.log('有人读取age了');
        return number;
    },

    //当有人修改person的age属性时,set函数(setter)就会被调用,且返回值就是age的值
    set(val) {
        console.log('有人修改age的值,' + val);
        number = val;
    }
})
console.log(person);
console.log(Object.keys(person));

数据代理

数据代理:通过一个对象代理另一个对象中属性的操作(读/写)
比如下面这个案例,我们可以通过obj2来管理obj1里面的x(读/写)
记住这个案例,后面的理解起来可能会容易些

//数据代理:通过一个对象代理另一个对象中属性的操作(读/写)
let obj1 = { x: 1 };
let obj2 = { y: 2 };

//通过obj2来读取或修改obj1里的x
Object.defineProperty(obj2, 'x', {
    get() {
        console.log('有人要通过obj2读取obj1里的x');
        return obj1.x
    },

    set(val) {
        console.log('有人要通过obj2修改obj1里的x');
        obj1.x = val;
    }
})

console.log(obj1);
console.log(obj2);

Vue中的数据代理

1、Vue中的数据代理:
通过vm对象来代理data(或者说是_data)对象中属性的操作(读/写)
2、Vue中数据代理的好处:
更加方便的操作data中的数据
3、基本原理:
通过Object.defineProperty()把data对象中所有属性添加到vm上。
为每一个添加到vm上的属性,都指定一个getter/setter。
在getter/setter内部去操作(读/写)data中对应的数据。

请添加图片描述

其实_datadata就是一个东西,这里先理解为_data是收集了data中的数据,然后vm对_data进行数据代理,也就是对data中的数据进行数据代理,目的只有一个,就是为了编码方便,要不然插值语法每次还得写{{_data.name}}什么的,有了这个数据代理,直接{{name}}就搞定了。

事件处理

事件处理

1、使用v-on:xxx@xxx绑定事件,其中xxx是事件名。
2、事件的回调需要配置在methods对象中,最终会在vm上。
3、methods中配置的函数,不要用箭头函数!否则this就不是vm了。
4、methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象
5、@click="demo"@click="demo($event)" 效果一致,但后者可以传参。
6、如果不传参,默认第一个形参是事件对象;如果传参,按照参数顺序来接,如果想接事件对象,要传入$event关键字

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>事件的基本使用</title>
    <!-- 引入vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <h1>欢迎,{{name}}</h1>
      <!-- <button v-on:click="showInfo">提示信息</button> -->
      <button @click="showInfo1">点我提示信息</button>
      <button @click="showInfo2(666,$event)">点我提示信息</button>
    </div>
    <script type="text/javascript">
      new Vue({
        el: "#root",
        data: {
          name: "www",
        },
        methods: {
          //这里是可以传多个参数的,如果不传参,默认第一个是事件对象
          //如果传参,按照参数顺序来接,如果想接事件对象,要传入$event关键字
          showInfo1(event) {
            console.log(event.target); //获得当前点击的元素信息
            console.log(this); //此处的this是vm
            // alert("同学你好!");
          },
          showInfo2(number, e) {
            console.log(number, e);
          },
        },
      });
    </script>
  </body>
</html>

事件修饰符

1、prevent:阻止默认事件(常用)
2、stop:阻止事件冒泡(常用)
3、once:事件只触发一次(常用)
4、capture:使用事件的捕获模式
5、self:只有event.target是当前操作的元素时才触发事件
6、passive:事件的默认行为立即执行,无需等待事件的回调执行完毕

<!-- 准备好一个容器 -->
<div id="root">
    <h2>我的名字叫{{name}}</h2>

    <!-- 1.prevent阻止默认事件 -->
    <a href="http://www.baidu.com" @click.prevent='hello'>点击提示信息1</a><br>

    <!-- 2.stop阻止事件冒泡 -->
    <div @click="hello">
        <button @click.stop="hello">点击提示信息2</button>
    </div>

    <!-- 3.once件只触发一次,触发完了就失效 -->
    <button @click.once="hello">点击提示信息3</button>

    <!-- 4.capture捕获阶段处理事件(默认的是冒泡阶段处理事件) 这个意思就是说外边的div在捕获阶段就处理事件了-->
    <div @click.capture="showInfo(1)">111111
        <div @click="showInfo(2)">22222</div>
    </div>

    <!-- 5.self只有event.target是当前操作的元素时才触发事件,也就是冒泡不管用了(类似阻止冒泡?)-->
    <div @click.self="hello">111111
        <div @click="hello">22222</div>
    </div>

    <!-- 6.passive事件的默认行为立即执行,无需等待事件的回调执行完毕-->
    <!-- 加上这个的话,不用等待creazyShow函数执行完毕,滚动条就可以流畅滚动-->
    <ul @wheel.passive="creazyShow">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>

<script>
    const vm = new Vue({
        el: '#root',
        data: {
            name: 'www',
            age: 18
        },
        methods: {
            hello(e) {
                // e.preventDefault(); //阻止默认事件的js写法
                // e.stopPropagation();  //阻止事件冒泡的js写法
                alert('DJ drop the beat');
            },
            showInfo(val) {
                console.log(val);
            },
            creazyShow() {
                for (let i = 0; i < 100000; i++) {
                    console.log('我输出完了你再滚动');
                }
            }
        }
    })
</script>

键盘事件

按键代码
回车enter
删除delete(捕获删除和退格键)
退出esc
空格space
换行tab(特殊,必须配合keydown使用)
up
down
left
right
<!-- 准备好一个容器 -->
<div id="root">
    <h2>我的名字叫{{name}}</h2>
    <input type="text" placeholder="按下回车输出" @keyup.enter="showInfo">
    <input type="text" placeholder="按下回车输出" @keyup.13="showInfo">
    <input type="text" placeholder="按下回车输出" @keyup.huiche="showInfo">
    <input type="text" placeholder="按下删除或退格输出" @keyup.delete="showInfo">
    <input type="text" placeholder="按下切换大小写输出" @keyup.caps-lock="showInfo">
</div>

<script>
    Vue.config.keyCodes.huiche = 13; //定义一个别名为huiche的enter按键

    const vm = new Vue({
        el: '#root',
        data: {
            name: 'www',
            age: 18
        },
        methods: {
            showInfo(e) {
                // if (e.keyCode !== 13) return  //原生js实现按下回车输出值
                console.log(e.target.value);
            }
        }
    })
</script>

1、Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
比如我想按下切换大小写的按键就触发showInfo:

<input type="text" placeholder="按下切换大小写输出" @keyup.caps-lock="showInfo">

2、系统修饰键(用法特殊):ctrl、alt、shift、meta

  • 配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。
  • 配合keydown使用:正常触发事件。

3、也可以使用keyCode去指定具体的按键(不推荐)

<input type="text" placeholder="按下回车输出" @keyup.13="showInfo">

4、Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名

Vue.config.keyCodes.huiche = 13; //定义一个别名为huiche的enter按键

补充两个小技巧

1、修饰符可以连续写

比如先停止冒泡,再阻止默认行为:

<button @click.stop.prevent="showInfo">你好</button>

2、如果先让两个键同时按下才触发,键名也可以连续绑定

比如按下ctrl+y触发showInfo方法:

<input type="text" @keyup.ctrl.y="showInfo">

被触发。

  • 配合keydown使用:正常触发事件。

3、也可以使用keyCode去指定具体的按键(不推荐)

<input type="text" placeholder="按下回车输出" @keyup.13="showInfo">

4、Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名

Vue.config.keyCodes.huiche = 13; //定义一个别名为huiche的enter按键

补充两个小技巧

1、修饰符可以连续写

比如先停止冒泡,再阻止默认行为:

<button @click.stop.prevent="showInfo">你好</button>

2、如果先让两个键同时按下才触发,键名也可以连续绑定

比如按下ctrl+y触发showInfo方法:

<input type="text" @keyup.ctrl.y="showInfo">

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务Ribbon-负载均衡原理

目录 一、LoadBalancerIntercepor 二、LoadBalancerClient 三、负载均衡策略IRule 四、总结 上一篇中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; SpringCloud底层其实是利用了一个名为Ribbon的组件&…

企业邮箱安全对比:哪家公司的产品更可靠?

邮箱仍然是企业沟通的关键组成部分&#xff0c;但往往容易受到安全威胁。为了保护敏感信息&#xff0c;企业需要采取措施使企业邮箱更加安全。这可以通过投资先进的安全解决方案&#xff0c;创建限制或控制访问的策略&#xff0c;并定期对员工进行最佳实践培训来实现。 1、投资…

世界算力简史(下)

世界算力简史&#xff08;上&#xff09; 世界算力简史&#xff08;中&#xff09; 今天终于要完结了…… █ 1980-1990&#xff1a;PC时代 IBM-PC和“兼容机” 上一篇&#xff0c;我们说到&#xff0c;70年代微处理器崛起&#xff0c;使得个人电脑开始大量出现。 这种情况&…

AI Deep Reinforcement Learning Autonomous Driving(深度强化学习自动驾驶)

AI Deep Reinforcement Learning Autonomous Driving&#xff08;深度强化学习自动驾驶&#xff09; 背景介绍研究背景研究目的及意义项目设计内容算法介绍马尔可夫链及马尔可夫决策过程强化学习神经网络 仿真平台OpenAI gymTorcs配置GTA5 参数选择行动空间奖励函数 环境及软件…

Unity3d C#利用本地网页快速打开萤石云监控视频流(ezopen)实现云台,声音等控制,支持WebGL平台,替代UMP播放(含源码)

前言 之前我介绍了替代Universal?Media?PlayerUMP播放石云监控视频流(ezopen)的功能&#xff0c;效果还是很明显的&#xff0c;笔者的测试是差不多3-5秒就能打开监控画面&#xff0c;不过稍微遗憾的是&#xff0c;之前的功能是iframe打开石云提供的播放网页的形式&#xff0…

AI量化模型预测挑战赛 第二次学习笔记

有关竞赛信息以及基础baseline代码解读请看我的上一篇文章 AI量化模型预测——baseline学习笔记_寂ღ᭄秋࿐的博客-CSDN博客 在经过baseline进行详细的分析之后&#xff0c;接下来的方向肯定是奔着提分去的&#xff0c;下面我就从五个方面进行一一列出提分思路 提取更多的特征…

Linux下安装nginx (tar解压版安装)

Linux下安装nginx (tar安装) 1、下载nginx 官方下载地址https://nginx.org/en/download.html 在这里插入图片描述 2.解压 解压‘nginx-1.16.1.tar.gz’到指定目录&#xff08;/usr/local/myWorkSpace&#xff09;并且重命名 命令&#xff1a; tar -xvf nginx-1.16.1.tar.gz …

共享式以太网的争用期

在以太网中&#xff0c;必然会发生碰撞。   站点从发送帧开始&#xff0c;最多经过 2 τ 2\tau 2τ就会检测到碰撞&#xff0c;此时 2 τ 2\tau 2τ被称为争用期或碰撞窗口。   站点从发送帧开始&#xff0c;经过争用期 2 τ 2\tau 2τ这段时间还没有检测到碰撞&#xff0c…

ModaHub魔搭社区——GPTCache是如何工作的?

在线服务通常表现出数据局部性,用户经常访问流行或趋势内容。缓存系统通过存储通常访问的数据来利用这种行为,这反过来减少了数据检索时间,提高了响应时间,并减轻了后端服务器的负担。传统缓存系统通常利用新查询和缓存查询之间的精确匹配来确定请求的内容在获取数据之前是…

LeetCode 31题:下一个排列

目录 题目 思路 代码 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序…

网络安全(黑客)工作篇

一、网络安全行业的就业前景如何&#xff1f; 网络安全行业的就业前景非常广阔和有吸引力。随着数字化、云计算、物联网和人工智能等技术的迅速发展&#xff0c;网络安全的需求持续增长。以下是网络安全行业就业前景的一些关键因素&#xff1a; 高需求&#xff1a;随着互联网的…

MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

文章目录 通过动态链表实现游戏角色动态增加CMemoryDC.hCFlashDlg.hCFlashDlg.cpp WM_ERASEBKGND背景刷新的原理RegisterClass注册窗口与框架程序开发CFrameRegister 通过动态链表实现游戏角色动态增加 CMemoryDC.h #pragma once#include "resource.h"/*内存DC类简介…

即将发布的 Kibana 版本可运行 Node.js 18

作者&#xff1a;Thomas Watson Kibana 构建在 Node.js 框架之上。 为了确保每个 Kibana 版本的稳定性和使用寿命&#xff0c;我们始终将捆绑的 Node.js 二进制文件保持为最新的最新长期支持 (LTS) 版本。 当 Node.js 版本 18 升级到 LTS 时&#xff0c;我们开始将 Kibana 升级…

图的遍历之 深度优先搜索和广度优先搜索

深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历比较类似。 它的思想&#xff1a;假设初始状态是图中所有顶点均未被访问&#xff0c;则从某个顶点v出发&#xff0c;首先访问该顶点&#xff0c;然后依次从它的各…

java中try-with-resources自动关闭io流

文章目录 java中try-with-resources自动关闭io流0 简要说明try-with-resources java中try-with-resources自动关闭io流 0 简要说明 在传统的输入输出流处理中&#xff0c;我们一般使用的结构如下所示&#xff0c;使用try - catch - finally结构捕获相关异常&#xff0c;最后不…

【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry

文章目录 前言Spring Retry的基本使用第一步&#xff0c;引入Spring Retry的jar包第二步&#xff0c;构建一个RetryTemplate类第三步&#xff0c;使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略&#xff1a;时间策略重试策略&#xff1a;指定异常策略 前言 Spring Retr…

吉利科技携手企企通,打造集团化数智供应链系统

近日&#xff0c;吉利科技集团有限公司&#xff08;以下简称“吉利科技”&#xff09;联合企企通成功召开SRM采购供应链管理项目启动会。企企通与吉利科技高层、项目负责人与团队成员出席此次启动会。 双方将携手在企业供应商全生命周期管理、采购全流程、电子招投标、采购分析…

opencv动态目标检测

文章目录 前言一、效果展示二、实现方法构造形态学操作所需的核:创建背景减除模型:形态学操作:轮廓检测: 三、代码python代码C代码 总结参考文档 前言 很久没更新文章了&#xff0c;这次因为工作场景需要检测动态目标&#xff0c;特此记录一下。 一、效果展示 二、实现方法 基…

华为运动健康,十年创新天地宽

我听一位朋友讲过这样一个故事。某天早上&#xff0c;急诊科的医生迎来了一位患者&#xff0c;患者进来后直接说&#xff1a;“大夫&#xff0c;我房颤了。” 这位医生非常诧异&#xff0c;因为心脏房颤确实非常危急&#xff0c;但很多时候并没有明显的生理体征&#xff0c;患者…

Flutter:屏幕适配

flutter_screenutil flutter_screenutil是一个用于在Flutter应用程序中进行屏幕适配的工具包。它旨在帮助开发者在不同屏幕尺寸和密度的设备上创建响应式的UI布局。 flutter_screenutil提供了一些用于处理尺寸和间距的方法&#xff0c;使得开发者可以根据设备的屏幕尺寸和密度…