第2集丨Vue 江湖 —— Vue中的一些必备概念

news2024/10/6 10:39:46

目录

  • 一、Object.defineProperty()
    • 1.1 属性描述符
    • 1.2 共享属性
      • 1.2.1 configurable
      • 1.2.2 enumerable
    • 1.3 数据描述符属性
      • 1.3.1 value
      • 1.3.2 writable
    • 1.4 访问器描述符属性
      • 1.4.1 get
      • 1.4.2 set
      • 1.4.3 注意点
    • 1.5 案例
      • 1.5.1 数据描述符
      • 1.5.2 访问器描述符
  • 二、Vue 模板语法
    • 2.1 插值语法
    • 2.2 指令语法
  • 三、数据绑定
    • 3.1 案例分析
  • 四、data与el的2种写法
    • 4.1 el的2种写法
    • 4.2 data的2种写法
  • 五、MVVM模型
  • 六、数据代理
    • 6.1 基本概念
    • 6.2 Vue中的数据代理

一、Object.defineProperty()

Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,或修改其现有属性。允许精确地添加或修改对象上的属性。默认情况下,使用 Object.defineProperty()添加的属性是不可写、不可枚举和不可配置的。

语法:Object.defineProperty(obj, prop, descriptor)
参数:
obj:要定义属性的对象。
prop:一个字符串或 Symbol,指定了要定义或修改的属性键。
descriptor:要定义或修改的属性描述符

const obj = {};
// 1. 使用 null 原型:没有继承的属性
const descriptor = Object.create(null);
descriptor.value = "static";

// 默认情况下,它们不可枚举、不可配置、不可写
Object.defineProperty(obj, "key", descriptor);

// 2. 使用一个包含所有属性的临时对象字面量来明确其属性
Object.defineProperty(obj, "key2", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: "static",
});

1.1 属性描述符

对象中存在的属性描述符有两种主要类型:数据描述符访问器描述符。描述符只能是这两种类型之一,不能同时为两者。

  • 数据描述符是一个具有可写或不可写值的属性。
  • 访问器描述符是由 getter/setter 函数对描述的属性。

1.2 共享属性

数据描述符访问器描述符 都是对象。它们共享以下可选属性。

1.2.1 configurable

控制属性是否可以被删除,默认值为 false

1.2.2 enumerable

控制属性是否可以枚举。默认值为false


1.3 数据描述符属性

1.3.1 value

与属性相关联的值。可以是任何有效的 JavaScript 值(数字、对象、函数等)。默认值为undefined

1.3.2 writable

控制属性是否可以被修改,默认值为 false


1.4 访问器描述符属性

1.4.1 get

用作属性 getter 的函数,如果没有 getter 则为 undefined。当访问该属性时,将不带参地调用此函数,并将 this 设置为通过该属性访问的对象(因为可能存在继承关系,这可能不是定义该属性的对象)。返回值将被用作该属性的值。默认值为 undefined

1.4.2 set

用作属性 setter 的函数,如果没有 setter 则为 undefined。当该属性被赋值时,将调用此函数,并带有一个参数(要赋给该属性的值),并将 this 设置为通过该属性分配的对象。默认值为 undefined

1.4.3 注意点

如果描述符没有 valuewritablegetset 键中的任何一个,它将被视为数据描述符。如果描述符同时具有 [valuewritable] 和 [getset] 键,则会抛出异常。

这些属性不一定是描述符本身的属性。继承的属性也会被考虑在内。为了确保这些默认值得到保留,你可以预先冻结描述符对象原型链中的现有对象,明确指定所有选项,或使用 Object.create(null) 指向 null

1.5 案例

1.5.1 数据描述符

let person = {
    name:'Vue',
    sex:'男',
    // age:18
}
// 1. 数据描述符
Object.defineProperty(person,'age',{
    value:20,
    enumerable:true,
    writable:true,
    configurable:true
})
// ['name', 'sex', 'age']
console.log(Object.keys(person));

1.5.2 访问器描述符

let person = {
    name:'Vue',
    sex:'男',
    // age:18
}
// 1. 数据描述符
Object.defineProperty(person,'age',{
    value:20,
    enumerable:true,
    writable:true,
    configurable:true
})
// ['name', 'sex', 'age']
console.log(Object.keys(person));

// 2. 访问器描述符
let address = "默认地址"
Object.defineProperty(person,'address',{
    get() {
        return address;
    },
    set(value) {
        address = value
    }
})
console.log(person)
console.log(person.address)
person.address = "新地址"
console.log(address);

在这里插入图片描述

二、Vue 模板语法

Vue模板语法分为2类:插值语法、指令语法

2.1 插值语法

插值语法功能:用于解析标签体内容

语法格式:{{xxx}} 双大括号形式,其中 xxxJavaScript 表达式 ,可以直接读取到data 中的属性。

<div id="app">
  <p>{{ message }}</p>
</div>

2.2 指令语法

指令是带有 v- 前缀的特殊属性。用于解析标签(包括:标签属性、标签内容、绑定事件)。

  • Vue 中的大部分指令,形式都是:v-xxx 形式。例如:v-bind
  • 例子:v-bind:href="xxx" 或 简写为 :href="xxx"xxx同样要写js表达式,且可以直接读取到Vue实例中的data中的所有属性。
<div id="root">
    <h1>{{name}}模板语法</h1>
    <a v-bind:href="vueobj.url">{{vueobj.name}}的博客</a>
    <a v-bind:href="vueobj.url.toUpperCase()" :code="name">{{vueobj.name}}的博客</a>
</div>
<script>
    Vue.config.productionTip = false;
    new Vue({
        el: '#root',
        data: {
            name:'Vue',
            vueobj :{
                name:'秋堂主',
                url:'https://blog.csdn.net/DUQGQG'
            }
            
        }
    })
</script>

三、数据绑定

Vue 中有2种数据绑定方式:

  • 单向绑定(v-bind ):数据只能从data 流向页面
  • 双向绑定(v-model):数据不仅能从data 流向页面,还可以从页面流向data

注意点

  • 双向绑定一般都应用在表单元素上,即有value值。(如:inputselect等)
  • v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。

3.1 案例分析

<div id="root">
  <h1>数据绑定</h1>
  <h2>1. 普通写法</h2>
  单向数据绑定(v-bind)<input type="text" v-bind:value="name">
  双向数据绑定(v-model:value)<input type="text" v-model:value="name">
  
  <h2>2. 简写</h2>
  单向数据绑定(:)<input type="text" :value="name">
  双向数据绑定(v-model)<input type="text" v-model="name">
</div>
<script>
Vue.config.productionTip = false;
new Vue({
    el: '#root',
    data: {
        name:'Vue'
    }
})
</script>

数据绑定

四、data与el的2种写法

4.1 el的2种写法

  • new Vue的时候配置el属性
  • 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值
// 一、el的2种写法
const vm = new Vue({
    // el: '#root',
    data: {
        name:'Vue'
    }
})
// 通过$mount指定挂载的容器
vm.$mount("#root")

4.2 data的2种写法

  • 对象式
  • 函数式:该函数必须返回一个对象,不能写成箭头函数

注意:

  • Vue管理的函数,不要写箭头函数,因为箭头函数没有this值,所以一旦写了箭头函数,this就不再是Vue实例了。
  • 在对象里的属性,如果其值是一个函数,可以使用简写形式。
new Vue({
    el: '#root2',
    /* data: {
        name:'Vue'
    } */
    // 函数式:该函数必须返回一个对象,不能写成箭头函数
    data: function () {
        // 此处的this是Vue实例对象
        console.log(this);
        return {
            name:'Vue2'
        }
    },
    // 在对象里写函数,可以简写为
    data() {
        return {
            name:'Vue2'
        }
    }
})

五、MVVM模型

每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的。虽然没有完全遵循 MVVM模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。

在这里插入图片描述

MVVM模型

  1. M:模型(Model):data中的数据
  2. V:视图(View):模板代码
  3. VM:视图模型(ViewModel):Vue实例

在这里插入图片描述

注意

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

六、数据代理

6.1 基本概念

数据代理:通过一个对象代理另一个对象中属性的操作(读/写)

let obj = {x:10},
    obj2 = {y:20};

Object.defineProperty(obj2,'x',{
    get() {
        return obj.x;
    },
    set(value) {
        obj.x = value;
    }
})

obj2.x = 30;
// 30
console.log(obj.x)

6.2 Vue中的数据代理

Vue 中的数据代理:通过vm 实例对象来代理data对象中属性的操作(读/写),这样可以更方便的操作data中的数据。其基本原理大概如下:

  • 通过Object.defineProperty()data对象中所有属性添加到vm._datavm上。
  • 为每一个添加到vm上的属性,都指定一个getter/setter
  • getter/setter内部去操作(读/写)data中对应的属性

在这里插入图片描述

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

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

相关文章

作为面试官,有些事想吐槽一下

作者&#xff1a;拭心 前段时间组里有岗位招人&#xff0c;花了些时间面试&#xff0c;趁着周末把过程中的感悟和槽点总结成文和大家讲讲。 简历书写和自我介绍 1.今年的竞争很激烈&#xff1a;找工作的人数量比去年多、平均质量比去年高。裸辞的慎重&#xff0c;要做好和好学…

npm发布包

1.npm 登录 在控制台输入命令 npm login 按提示输入用户名&#xff0c;密码&#xff0c;邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源&#xff0c;删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下&#xff0c;输入命令 npm publish 3.删除已发…

《TCP IP 网络编程》第十五章

第 15 章 套接字和标准I/O 15.1 标准 I/O 的优点 标准 I/O 函数的两个优点&#xff1a; 除了使用 read 和 write 函数收发数据外&#xff0c;还能使用标准 I/O 函数收发数据。下面是标准 I/O 函数的两个优点&#xff1a; 标准 I/O 函数具有良好的移植性标准 I/O 函数可以利用…

Python入门二

目录&#xff1a; python封装与property装饰器python继承与类型检查python多态与superpython 模块与包错误与异常Debug 调试与分析python类型注解python数据类dataclasspython内置装饰器python装饰器学生信息管理系统 1.python封装与property装饰器 封装的概念 封装&#x…

深度学习各层负责什么内容?

1、深度学习——神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【Deep Machine Learning】)是一类算法集合&#xff0c;是机器学习的一个分支。 深度学习方法近年来&#xff0c…

Expectation (Easy Version) 2023“钉耙编程”中国大学生算法设计超级联赛(5)hdu7330

Problem - 7330 题目大意&#xff1a;有n次游戏&#xff0c;每次游戏有a/b的概率获胜&#xff0c;且相互独立&#xff0c;如果当前赢了cnt次游戏&#xff0c;那么这次游戏会赢得的分数&#xff0c;问最后得分的期望 1<n<1e6;1<m,a<b<998244353 思路&#xff…

windows10 设置代理

场景&#xff1a;同一个办公室&#xff0c;只有A的电脑有权限访问网站 http://10.129.129.129:5601&#xff0c; 那办公室其他B,C同学想访问 http://10.129.129.129:5601&#xff0c;需要怎么处理&#xff1f; A 同学电脑安装代理软件&#xff1a; 1. 下载wproxy IMFirewall, …

d3dx9_30.dll如何修复,分享几种一键修复方法

d3dx9_30.dll是DirectX 的一个动态链接库文件&#xff0c;它包含了一些用于图形和游戏的函数和资源。在了解d3dx9_30.dll的解决方法和丢失原因之前&#xff0c;我们先来了解一下DirectX。DirectX是一套由微软开发的多媒体和游戏编程接口&#xff08;API&#xff09;集合。它提供…

0802|IO进程线程 day5 进程概念

一、进程的基础 1.1 什么是进程 1&#xff09;进程是程序的一次执行过程 程序&#xff1a;是静态的&#xff0c;它是存储在外存上的可执行二进制文件&#xff1b;进程&#xff1a;动态的概念&#xff0c;它是程序的一次执行过程&#xff0c;包括了进程的创建&#xff0c;调度、…

c语言——计算两个正整数的最大公倍数

//计算两个正整数的最大公倍数 //例如40和60的最大公约数为20. //计算两个正整数的最大公倍数 //例如40和60的最大公约数为20. #include<stdio.h> int main() {int a,b,temp,i;printf("Input a & b:");scanf("%d%d",&a,&b);if(a<b){…

Cat.1如何成为物联网业务加速器?

随着Cat.1芯片及模组在功耗和成本上的不断优化&#xff0c;在窄带物联网领域&#xff0c;越来越多的终端客户把Cat.1当做与NB-IoT相比较的第二选择。越来越多的表计、烟感、市政等行业终端将Cat.1模组应用于非集中化部署的上报类终端业务中&#xff0c;Cat.1这只“网红猫”仍保…

UIKit相关

CALayer和UIView 区别 UIView继承自UIResponder&#xff0c;主要负责事件传递、事件响应&#xff0c;属于基于UIKit框架 CALayer继承自NSObject&#xff0c;负责图像渲染&#xff0c;动画和视图的显示&#xff0c;属于QuartzCore框架 而且这两大内容都符合单一职责原则&#…

【开发心得】黑客是如何攻击你的web应用的?

本文记录一次黑客利用sql注入漏洞攻击应用系统的全过程。 由于涉及到隐私&#xff0c;所以就不能上图了&#xff0c;尽量把过程描述的详细一下&#xff0c;希望能够给开发人员提个醒&#xff0c;有些漏洞&#xff0c;其实修补很简单。好在现在有了chatGPT&#xff0c;把你的代…

调度:setTimeout 和 setInterval

有时一个函数并不需要立刻执行&#xff0c;而是等待特定一段时间之后再执行。这就是所谓的“计划调用&#xff08;scheduling a call&#xff09; setTimeout() 是延时器&#xff0c;setInterval() 是定时器 setTimeout 允许我们将函数推迟到一段时间间隔之后再执行。setInte…

mongodb docker 及常用命令

MongoDB属于非关系型数据库&#xff0c;它是由C编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。 中文手册 https://www.w3cschool.cn/mongodb/ 安装 https://www.mongodb.com/try/download/community 二进制安装可见另一篇&#xff1a; centos7 mongodb 4.0.28…

el-tooltip设置文字溢出时展示否则不展示

改写el-tooltip使其支持文字溢出时展示否则不展示&#xff0c;而不是需要使用js设置单独控制 新建 src/utils/rewriteElTooltip.js &#xff08;一模一样 cv就行&#xff09; export default function rewriteElTooltip(el) {el.props {...el.props,overflow: Boolea…

docker: Error response from daemon: No command specified.

执行 docker run -it -d -v /home/dell/workspace/workspace/test_192.168.1.202_pipeline:/home/workspace1 --name test_192.168.1.202_pipeline_10 qnx:7.1报错 问题定位&#xff1a;export导入的镜像需要带上command&#xff0c;以下命令查看command信息 docker ps --no…

计算机二级Python基本操作题-序号44

1. # 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长为100的三角形 import turtle for i in range(3): #绘制三条边turtle.seth(i * 120) #底边行进角度为0&#xff1b;右斜边行进角度为120(按逆时针);左斜边行进角度为240(按逆时针)turtle.fd(100) #边长为100…

甜椒叶病害数据集

1.数据集分为训练集和测试集 2.训练集如下所示 第一个文件夹是细菌斑叶&#xff08;449张&#xff09; 第二个是健康叶子&#xff08;4014张&#xff09; 测试集 细菌斑叶 11张 健康叶子10张 import numpy as np import os import matplotlib.pyplot as plt import cv2impor…

创建个人博客(在文章的列表页,根据文章标题和文章内容实现搜索)

1. 在视图文件增加搜索表单&#xff1a; 在文章列表页的视图文件中&#xff0c;增加一个搜索表单&#xff0c;包含一个文本搜索框和一个提交按钮 <% form_tag articles_path, method: :get do %><% text_field_tag :title, params[:title], placeholder: "搜索…