Vue(一) 插值与指令语法、数据代理、MVVM模式、事件处理

news2024/11/13 9:43:45

文章目录

  • 1. 初始Vue
  • 2. 模板语法
    • 2.1 插值语法
    • 2.2 指令语法
  • 3. el与data的两种写法
    • 3.1 el的两种写法
    • 3.2 data的两种写法
  • 4. MVVM模式
  • 5. 数据代理
    • 5.1 Object.defineProperty()
    • 5.2 何为数据代理
    • 5.4 vue中的数据代理
  • 6. 事件处理
    • 6.1 v-on
    • 6.2 事件修饰符
    • 6.3 键盘按键事件

1. 初始Vue

  <!-- 引入vue -->
<script type="text/javascript" src="./js/vue.js"></script>
  <!-- 容器 -->
<div id="root">
    hello {{name}}
</div>

<script>
    // 创建Vue实例
    new Vue({
        el: '#root',  //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
        data: {       //data中用于存储数据,数据供el所指定的容器去使用,data暂时先写成一个对象。
            name: 'tom'
        }
    })
</script>

总结:
1、想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;
​2、root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;
3、root容器里的代码被称为【Vue模板】;
4、Vue实例和容器是一一对应的;一个容器只能由一个Vue实例接管,
5、真实开发中只有一个Vue实例,并且会配合着组件一起使用;

2. 模板语法

2.1 插值语法

  • 功能:用于解析标签体内容。
  • 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。

2.2 指令语法

  • 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。
  • 写法:v-xxx
  • 比如:v-bind语法,v-bind:href=“xxx” xxx同样要写js表达式,且可以直接读取到data中的所有属性。(注:Vue中有很多的指令,且形式都是:v-???,只是拿v-bind举个例子。)
<div id="root">
    hello, {{stu.name.toUpperCase()}}
    <br>
    <a v-bind:href="url">百度</a>
    <a v-bind:href="url.toUpperCase()">百度</a>
</div>
<script>
    new Vue({
        el: '#root',
        data: {
            stu: {
                name: 'tom',
                age: 18
            },
            url: 'https://www.baidu.com/',
        }
    })
</script>

最终页面被解析为:
在这里插入图片描述
注意区分:js表达式 和 js代码(语句)

  1. 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方:
    (1). a
    (2). a+b
    (3). demo(1)
    (4). x === y ? ‘a’ : ‘b’
  2. js代码(语句)
    (1). if(){}
    (2). for(){}

3. el与data的两种写法

3.1 el的两种写法

写法一:new Vue的时候配置el属性。

<script>
    const v = new Vue({
        el: '#root',   //第一种写法
        data: {
            name: 'tom',
        }
    })
</script>

写法二:先创建Vue实例,随后再通过 Vue实例.$mount(‘#root’)指定el的值

<script>
    const v = new Vue({
        data: {
            name: 'tom',
        }
    })
    // 第二种写法
    v.$mount('#root')
</script>

3.2 data的两种写法

写法一:对象式

<script>
    // data的两种写法
    new Vue({
        el: '#root',
        // 对象式
        data: {
            name: 'tom',
        }
    })
</script>

写法二:函数式

<script>
    new Vue({
        el: '#root',
        // 函数式
        data: function () {
            console.log(this);  
            return {
                name: '山西'
            }
        }
    })
// 或者简写为:
    new Vue({
        el: '#root',
        // 函数式
       data () { //不可写为箭头函数,否则this返回的不是Vue实例
            console.log(this);  // this返回的是vue实例
            return {
                name: '山西'
            }
        }
    })
</script>

data的2种写法:对象式、函数式。
如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。
一个重要的原则:由Vue管理的函数 (data函数就是一个Vue管理的函数),一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了

4. MVVM模式

  1. M—模型(Model) :data中的数据
  2. V—视图(View) :模板代码,页面
  3. VM—视图模型(ViewModel):Vue实例
    在这里插入图片描述
    Data Bindings: model的数据挂在ViewModel上,然后数据绑定到页面中
    DOM Listeners: 监听View页面里数据的变化,修改Model里对应的数据(有点儿像双向数据绑定)
    View Model则在页面和数据之间起连接作用,所以一般命名Vue实例为vm

拓展
(1) data中所有的属性,最后都出现在了vm身上。
(2) vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。

   <div id="root">
        姓名:{{name}}
        <br>
        地址:{{address}
        <br>
        <!-- vm身上的属性及Vue原型上的属性,在vue模板里都可以用 -->
        vm属性$options{{$options}}
        <br>
        Vue原型{{$emit}}
    </div>
    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                name: '小白',
                address: '北京'
            }
        })
        console.log(vm);
    </script>

在这里插入图片描述
在这里插入图片描述

5. 数据代理

5.1 Object.defineProperty()

语法:Object.defineProperty(对象,属性名,配置项) :给对象添加属性

需求1: 给person添加age属性

let obj = {
    name: 'jerry',
    gender: '男',
    age: 10
}
let person ={
    name: 'jerry',
    gender: '男',
}
Object.defineProperty(person, 'age', {
    value: 10,
    enumerable: true, // 控制属性是否可以被枚举,默认false Object.keys(对象)
     writable: true,   // 控制属性是否可以被修改,默认false
     configurable: true, // 控制属性是否可以被删除,默认false
});

在这里插入图片描述
相较于objperson这种添加属性的方式可以对属性进行设置,obj则不能设置


需求2:现有一个number数据,如何使age的值始终为number的值

let number = 10;
const person = {
    name: 'tom',
    gender: '男',
}
Object.defineProperty(person, 'age', {
    // 当有人读取person的age属性时,get函数(一般说getter方法)就会被调用,且返回值就是age的值
    get () {
        console.log('读取age值');
        return number
    },
    // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
    set (value) {
        console.log('修改age值');
        number = value
    }
})

在这里插入图片描述
此外,打印person也可以发现
在这里插入图片描述
点击(…)时,也会调用getter方法

5.2 何为数据代理

数据代理:通过一个对象来对另一个对象的属性进行读或写的操作。

// obj有个x,希望通过obj2对obj的x进行读取和修改
let obj = { x: 100 }
let obj2 = { y: 200 }
Object.defineProperties(obj2, 'x', {
    get () {
        return obj.x
    },
    set (value) {
        obj.x = value
    }
})

在这里插入图片描述

5.4 vue中的数据代理

<div class="root">
	<h2>学校名称:{{name}}</h2>
	<h2>学校地址:{{address}}</h2>
</div>
<script>
	const vm = new Vue({
		el: 'root',
		data: {
			name: '尚硅谷',
			address: '北京'
		}
	})
</script>

打印vm得知,vm身上的nameaddress都是Object.definePropterty()加上去的
在这里插入图片描述
vm将data数据存在了自身的_data中,当读取vm.address时,通过getter方法获取Vm._data.address的值
在这里插入图片描述
image-20240818000804493.png
总结:
1、Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读、写)
2、Vue中数据代理的好处:更方便操作data中的数据,不用写_data.name,直接写name就行。
3、基本原理:通过Object.defineProperty()把data对象中的所有属性加到vm上,为每一个添加到vm上的属性指定getter/setter。在getter/setter内部操作(读、写)data中对应的属性

6. 事件处理

6.1 v-on

语法:v-on:xxx 或简写方式 @xxx绑定事件,xxx是事件名

<div id="root">
    <button v-on:click="showInfo1">(v-on)不传参函数</button>
    <button @click="showInfo2($event,66)">(@)不传参函数</button>
</div>

不传参的函数默认接收事件对象event

const vm = new Vue({
    el: '#root',
    data: {
        name: 'tom'
    },
    methods: {
        showInfo1 (event) {
            console.log('showInfo1');
            console.log(event);
        },
        showInfo2 (event, number) {
            console.log(event);
            console.log(number);
        },
        // showInfo1: (event) => {
        // 	console.log(this); // window;指向的不是vue实例了
        // }
    }
})
  • 事件的回调需配置在methods对象中,最终会挂在vm上
  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;如果是箭头函数,则指向的不是vm了
  • @click=“demo” 和 @click=“demo($event)” 效果一致,但后者可以传参;

6.2 事件修饰符

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

1、阻止默认事件
Vue: prevent ----> 对应原生jsevent.preventDefault()

<div id="root">
    <a href="https://www.baidu.cn" @click.prevent="moveToBaidu">点击链接跳转百度</a></div>
<script>
    const vm = new Vue({
        ...
        methods: {
            moveToBaidu (event) {
                // event.preventDefault()
                console.log('点击链接');
            }
        }
    })
</script>

2、阻止事件冒泡
Vue: stop ----> 对应原生js event.stopPropagation()

<div @click="stopBubble('div')" class="bubbleBox">
    <button @click="stopBubble('btn')">点击冒泡</button>
</div>
<script>
    const vm = new Vue({
        ...
        methods: {
            stopBubble (str) {
                // event.stopPropagation();
                console.log(str + '冒泡');
            }
        }
        ...
    })
</script>

未添加stop修饰符时,点击button,分别打印:btn冒泡 div冒泡。
添加stop修饰符后,点击button,打印:btn冒泡

<button @click.stop="stopBubble('btn')">点击冒泡</button>

注:修饰符可以连写

<div @click="stopBubble('div')" class="bubbleBox">
    <!-- 既阻止冒泡又阻止跳转 -->
    <a href="https://www.baidu.cn" @click.stop.prevent="stopBubble('a链接')">点击链接跳转百度</button>
</div>

3、事件只发生一次
点击button,打印once;再点击,则不会再触发事件

<button @click.once="showOnce">点击事件只触发一次</button>
<script>
    const vm = new Vue({
        ...
        methods: {
            showOnce () {
                console.log('once');
            }
        }
        ...
    })
</script>

4、事件捕获
事件流是先捕获,后冒泡。而在上述冒泡事件点击中,点击button,依次打印:btn冒泡 div冒泡。这是因为默认对冒泡事件进行响应。
若给div添加捕获模式,则依次打印:div冒泡,btn冒泡

<div @click.capture="stopBubble('div')" class="bubbleBox">
    <button @click="stopBubble('btn')">点击冒泡</button>
</div>

6.3 键盘按键事件

keyup和keydown都是键盘按键事件。
键盘每个键都有键名和值,通过key和keycode可以获取

key <input type="text" @keydown="showKey">
<script>
    const vm = new Vue({
        ...
        methods: {
            showKey (e) {
                console.log(e.key,e.keycode);  //打印按键
            }
        }
    })
</script>

在这里插入图片描述每按一个键,都会触发一次事件。若想在按某个键(比如回车)之后再触发事件,可以在keydown/keyup后指定按键。
Vue里常用的按键别名:

  • 回车 => enter ; 删除 => delete ; 退出 => esc ; 空格 => space
  • 换行 => tab ; 上 => up ; 下 => down ; 左 => left ; 右 => right
enter<input type="text" @keydown.enter="showInfo"><br>
<!-- Vue未定义别名的键,直接用key值进行指定(不建议keycode,每个键盘同一个键的keycode可能不一样) -->
Tab<input type="text" @keydown.Tab="showInfo"><br>
<script>
    const vm = new Vue({
        ...
        methods: {
           	showInfo (e) {
				console.log(e.target.value);
			}
        }
    })
</script>

若两个键配合使用,则:

Ctrl+y <input type="text" @keydown.ctrl.y="showInfo">

系统修饰键:ctrl、alt、shift、meta

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

总结: 系统修饰键配合keyup触发事件很麻烦,tab键配合keyup不起作用,因此键盘按键事件一般都用keydown,不用keyup

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

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

相关文章

【C语言】预处理的使用

预处理 一、预处理-宏定义1、程序编译过程(1) 编写源程序(2) 程序编译过程说明 2、预处理3、宏的概念4、无参宏5、带参宏6、带参宏的副作用7、宏定义中的符号粘贴 二、预处理.条件编译1、无值宏定义2、条件编译3、条件编译的使用场景 三、预处理.头文件1、头文件的作用2. 头文件…

RTSP/Onvif安防视频监控平台EasyNVR在欧拉系统中启动失败的原因排查

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种视频流格式。平台支持轻量化部署&#xff0c;可兼容各类操作系统&#xff0c;包括Windows、Linux…

Admin.NET源码学习(4:基于Furion的后台服务启动方式浅析)

Admin.NET为前后端分离架构&#xff0c;后台服务的入口项目为Admin.NET.Web.Entry&#xff0c;其与其它项目的依赖关系如下图所示。   由于项目采用Furion框架&#xff0c;后台服务启动方式、注册方式、配置方式等方面与常规的asp.net core项目差异明显&#xff0c;初步接触…

计算机的错误计算(七十)

摘要 讨论大数的正割函数 sec(x)的错误计算。 例1. 已知 在 Maple 中计算 在 Maple中输入&#xff1a; restart; sec(30^54.8); 则输出&#xff1a; -5.214386310 若输入&#xff1a; Digits : 16;evalf[16](sec(30^54.8)); 则输出&#xff1a; 1.324455078865824…

中年人开发语言学习之路,反其道而行之

大家都更愿意学习新技术、新架构&#xff0c;代表着新方向新趋势&#xff0c;当大家都这么想的时候&#xff0c;注定了竞争就会激烈。有一部分中年程序员&#xff0c;反其道而行之&#xff0c;学习一些老掉牙的开发语言&#xff0c;向哪些近乎被遗忘的老旧系统进军。 市面上依…

一文了解Ansible原理以及常见使用模块

ansible使用手册 1. 简述 Ansible 是一种开源的自动化工具&#xff0c;主要用于配置管理、应用程序部署和任务自动化。 它使用简单的 YAML 语言来定义自动化的任务【playbook】&#xff0c;使得配置和部署变得更加直观和易于管理。 基于SSH协议连接到远程主机来执行指令。 2…

图像数据处理21

五、边缘检测 5.2基于二阶导数的边缘检测 一阶导数&#xff08;如Sobel、Prewitt算子&#xff09;能够捕捉到灰度值的快速变化&#xff0c;但有时会因检测到过多的边缘点而导致边缘线过粗。为了更加精确地定位边缘位置&#xff0c;可以利用二阶导数的零交叉点。零交叉点是是函…

触想工业一体机辅助DR系统提升医学影像诊断效率

一、行业发展背景 早期X线摄影依赖胶片成像&#xff0c;不便于图像存储管理&#xff0c;且显影过程长&#xff0c;无法进行后期处理&#xff0c;诊断质量和效率受到局限。 随着数字化技术的发展&#xff0c;DR系统问世&#xff0c;利用平板探测器将X射线图像转化为数字信号&…

推荐一款功能全面的层次化笔记应用,支持自由拖拽、缩放、旋转,可视化非常牛逼(附源码)

背景 不知道各位大佬日常生活中笔记软件用的多不&#xff0c;小编在工作中常常用笔记来记录每天的收获和安排。笔记软件的好坏直接影响了工作的心情和效率。今天给大家介绍的这款笔记软件&#xff0c;以其强大的笔记功能为基础&#xff0c;创造性地融入了画布式的自由编辑特性…

关于武汉芯景科技有限公司的RS232通信接口芯片XJ3243EEUI开发指南(兼容MAX3243EEUI)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、典型应用电路 三、功能描述 1.Transmitter 通过T1&#xff0c;T2可以将TTL电平转换为RS232电平 2.Receiver 通过R1&#xff0c;R2可以将RS232电平转换为TTL电平 3.工作模式控制 4.INVALID引脚

EDKII之安全启动详细介绍

文章目录 安全启动简介安全启动流程介绍签名过程BIOS实现小结 安全启动简介 安全启动&#xff08;Secure Boot&#xff09;是一种计算机系统的安全功能&#xff0c;旨在确保系统启动过程中只能加载经过数字签名的受信任的操作系统和启动加载程序。通过使用安全启动&#xff0c…

数据结构之串与KMP算法详解

串 一. 定义&#xff08;了解&#xff09; 串&#xff0c;即字符串&#xff0c;是计算机系统和网络传输中最常用的数据类型&#xff0c;任何非数值型的处理都会以字符串的形式存储和使用。 串&#xff08;String&#xff09;是由零个或多个字符组成的有限序列&#xff0c;一…

多选类型项,点击亮或不亮

用于菜单下拉 多选项 。 <div style"display: flex; flex-wrap: wrap;margin: 0 auto;"><div v-for"(item, index) in prpductnames" :key"item.id"><span :class"{ selected: selectArr.includes(item.id) }" click&q…

《计算机操作系统》(第4版)第7章 文件管理 复习笔记

第7章 文件管理 一、文件和文件系统 1. 数据项、记录和文件 数据组成可分为数据项、记录和文件三级&#xff0c;它们之间的层次关系如图7-1所示。 图7-1 文件、记录和数据项之间的层次关系 (1)数据项 在文件系统中&#xff0c;数据项是最低级的数据组织形式&#xff0c;可以分为…

Grove Vision AI V2之GPIO

一、说明 实现一个LED闪烁的Demo&#xff0c;Grove Vision AI V2开发板上有一个USER_LED&#xff0c;由GPIO SEN_D2驱动&#xff0c;SEN_D2为高电平是USER_LED亮&#xff0c;SEN_D2为低电平时USER_LED灭。 USER_LED部分电路如下&#xff1a; 二、创建例程 1、创建文件 在See…

MySQL的源码安装及基本部署(基于RHEL7.9)

这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…

上线eleme项目

&#xff08;一&#xff09;搭建主从从数据库 主服务器master 首先下载mysql57安装包&#xff0c;然后解压 复制改目录到/usr/local底下并且改个名字 cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql 删掉/etc/my.cnf 这个会影响mysql57的启动 rm -rf /etc…

浪潮服务器主板集成RAID常见问题

★主板集成RAID出现Initialize初始化&#xff0c;如下图 判断及解决方案&#xff1a; 1.机器是否有过插拔硬盘等操作。 2.系统初始化-系统启动会非常的慢。一般为非法关机或者断电导致。 3.出现此情况耐心等待磁盘初始化完成即可。系统初始化时间以具体的数据大小来决定&#…

CLion IDE用MSVC和cmake编译darknet(带GPU)

这个配置教程给用过pytorch&#xff0c;懂得深度学习代码的基本流程&#xff0c;但又不熟悉windows c开发环境的宝子们使用。 安装CUDA&#xff0c;CUDNN 一般都有&#xff0c;不说了。注意上nvidia官网看一下显卡架构&#xff0c;后面要用&#xff0c;比如我的丽台M2000架构…

从零开始Dify本地部署|Windows

参考官方文档部署 Dify本地源码启动 windows最好结合WSL使用&#xff0c;懒得配置WSL&#xff0c;就是硬肝&#xff01; 1.Clone Dify 代码 先找到项目GitHub 开源链接clone 下来&#xff0c;使用docker部署运行&#xff08;Windows配置docker环境这里不赘述&#xff09; gi…