el和data的两种写法
el的两种写法:
<html>
<head>
<meta charset="UTF-8">
<title>你好啊!</title>
<script type="text/javascript" src="../JS/vue.js"></script>
</head>
<body>
<div>
<h1 id="root">你好,{{name}}</h1>
</div>
<script type="text/javascript">
const x = new Vue({
el:"#root",
data:{
name:"柠"
}
})
console.log(x)
</script>
</body>
</html>使用Vue构造函数方法,直接定义
第二种写法:实例化之后使用具体的方法进行构造
查看方法请使用console.log(x),其中x是已经实例化后的Vue实例
具体代码如下:
<script type="text/javascript">
const x = new Vue({
data(){
name:"柠"
}
})
x.$mount('#root')
console.log(x)
</script>简而言之:一种是通过构造函数进行创建,一种依赖实例本身具有的函数进行后期实现(说白了就是setter和构造函数的使用了)
data的两种写法
第一种写法和之前常用的写法一样,称之为对象式写法,在构造函数中进行使用
<script type="text/javascript">
const x = new Vue({
data(){
name:"柠"
}
})
</script>第二种写法:函数式写法
const x = new Vue({
el:"#root",
data:function(){
return {
name:"柠"
}
}
})总结:
el的两种写法:
1)构造函数的时候就配置el属性
2)创建完vue实例之后再通过函数指定el的值
data的两种写法:
1)对象式
2)函数式
学习到组件时,data必须使用函数式写法,否则报错
重要原则:
一个由Vue管理的函数一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了
例如:data的函数式写法
MVVM模型
M:模型,对应data中的数据
V:视图,模板
VM:视图模型,Vue实例对象
在Vue中,通过指令v-bind和v-model实现数据绑定,Vue实例充当VM,负责管理数据和逻辑,开发者只需专注于业务逻辑,无需手动更新视图

知识点补充:
DOM:简单来说,就是将HTML,XML,SVG等文档解析为一棵树(树状结构),以对象形式存储,让JS等语言对其进行访问和修改
Document根节点,Element HTML标签节点,Text 标签内文本节点,Attr元素的属性节点
<!DOCTYPE html>
<html lang="zh-CN">
<body>
<div id="container">原始内容</div>
<script>
// 获取元素
const div = document.getElementById("container");
// 修改内容
div.textContent = "新内容";
// 创建新元素并添加
const p = document.createElement("p");
p.textContent = "这是新段落";
div.appendChild(p);
// 删除元素
// div.removeChild(p);
</script>
</body>
</html>document获取Element元素,然后对div当中的内容进行修改,
createElement,创建一个新元素
data里面所拥有的,都能通过双花括号展示在页面上
data中所有的属性,最后都出现在vm身上
vm身上的所有属性,以及Vue原型上的所有属性,都能在Vue模板上都可以直接使用
数据代理
先学习一些方法的使用:Object.defineProperty()方法
Object.defineproperty 就是给一个对象添加属性而用
let person ={
name:"张三",
age:18,
sex:"男"
}
Object.defineProperty(person,"tel",{
value:"123456789",
})let在JS中用于定义变量,也可以定义对象,其中对象的定义方式为键值对格式
传参:要添加属性的对象名person,要添加属性的属性名"tel"(代表新加入的属性名为tel),配置项
配置项使用花括号进行括起来
1,value,用于定义这个属性的初始值
let person ={
name:"张三",
age:18,
sex:"男",
value:"123456789"
}这种方法和上面得到的结果看上去是一致的,但是本质却有着很大差别
区别1:如果是因为Object.defineProperty而定义属性,那么该属性无法被枚举,简单来说,就是无法被遍历
Object.keys() 内部传参为一个对象,这个方法可以把传入对象其属性的属性名提取出来组成一个数组
下面就使用这个方法来进行遍历
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>你好啊!</title>
<!-- 引入vue.js文件 -->
<script type="text/javascript" src="../JS/vue.js"></script>
</head>
<body>
<div>
<h1 id="root">你好,{{name}}</h1>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;//阻止vue在启动时生成生产提示
new Vue({
el: "#root",
data: {
name: "柠"
}
})
let tel = "123456789"
let person ={
name:"张三",
age:18,
sex:"男",
}
Object.defineProperty(person,"tel",{
value:"123456"
})
//遍历方式一
console.log(Object.keys(person))
//遍历方式二
for(let index in person){
console.log('@',index,person[index])
}
console.log(person)
</script>
</body>
</html>

2,配置项enumerable 设置为true就可以遍历,简言之:控制属性是否可以枚举,默认值为false
3,配置项 writeable 设置是否可以被修改,默认为false
4,配置项 configurable是否可被删除,默认值为false
问题:
当number修改之后,貌似并不会将person对象当中的age同时进行修改,那么如何将其自动修改?
let number=18
let person={
name:"柠",
sex:"男",
age:number
}解决方法:
Object.defineProperty(person,'age',{
//当有人读取person的age属性时,get方法就会被调用,且返回值就是age的值
get:function(){
return number
}//这三行被统称为getter
})数据代理流程:
首先在Vue实例里面定义
到了页面上data数据存于vm._data中
Vue设计getter,读取_data里面的name和address,再通过setter,将name和address存入_data中
使用数据代理,将_data当中的值进行代理之后,于是可以直接使用name和address直接进行修改
具体看图:

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