一套用于构建用户界面
的渐进式
JS框架。
——尤雨溪。
组件化
模式,提高代码复用率、且让代码更好维护。声明式
编码,让编码人员无需直接操作DOM,提高开发效率。虚拟DOM
+优秀的Diff算法
,尽量复用DOM节点。Vue.config.productionTip = false;
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>初识vuetitle>
<script type="text/javascript" src="../js/vue.js">script>
head>
<body>
<div id="root">
<h1>Hello, {{name}},{{address}},{{Date.now()}}h1>
<button>Testbutton>
div>
<script>
// 设置为 false 以阻止 vue 在启动时生成生产提示。
Vue.config.productionTip = false;
// 创建Vue实例
new Vue({
// el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
el: '#root',
data: {
// data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
name: 'wang',
address: '武汉'
}
})
// new Vue({
// // el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
// el: '#root2',
// data: {
// // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
// address: '武汉',
// }
// })
script>
body>
html>
Vue实例
,且要传入一个配置对象
代码依然符合html规范
,只不过混入了一些特殊的语法【Vue模版】
一一对应
的Vue实例
,并且会配合着组件一起使用自动读取到data中的数据
自动更新
直接读取到data中的所有属性
v-bind:href="xxx"
或简写为 :href="xxx"
,xxx同样要写js表达式,且可以直接读取到data中的所有属性。v-bind
单向数据绑定:<input type="text" v-bind:value="name"/><br/>
v-model
双向数据绑定:<input type="text" v-model:value="name"/>
v-bind
):是关于只能从data流向页面v-model
):数据不仅能从data流向页面,还可以从页面流向data
简写方式:
单向数据绑定:<input type="text" :value="name"/><br/>
双向数据绑定:<input type="text" v-model="name"/>
// el的两种写法
const v = new Vue({
// 第一种写法
el: '#root',
data:{
name: 'jack',
}
})
console.log(v)
// 等待1秒再进行绑定
setTimeout(() => {
// 第二种写法,有挂载的意思mount
v.$mount('#root')
}, 1000);
// data的两种写法
new Vue({
el: '#root',
// data的第一种写法
// data:{
// name: 'jack'
// }
// data的第二种写法
data(){
return{
name: 'jack'
}
}
})
data中所有的属性,最后都出现在了vm身上。vm身上的所有属性,及vue原型上所有属性,在vue模版中都可以直接使用。
是否可以枚举
**需求:**给张三添加一个属性年龄age,值是18.
Object.defineProperty(person, 'age',{
value:18
})
仔细看到,age的颜色和name、sex颜色不同。说明age
是不可枚举的。
这里说明什么是不可枚举:
首先,我们直接给person,加上age属性,然后打印出person的key有哪些
<script type="text/javascript">
Vue.config.productionTip = false;
let person = {
name:'张三',
sex:'男',
age:18
}
//Object.defineProperty(person, 'age',{
//value:18
//})
console.log(Object.keys(person));
console.log(person);
</script>
去浏览器查看打印的结果,是可以看到age
属性的。
但是,当我们通过Object.defineProperty给person添加age
属性的时候,打印的时候,这里的age是无法取到的,这就是此时的age不可枚举。
但是,也可以通过设置另外一个属性,设置age可枚举,通过属性enumerable即可设置,代码如下:
Object.defineProperty(person, 'age',{
value:18,
enumerable: true, //控制属性是否可以枚举,默认值是false
})
是否可以修改
这里的writable控制属性是否可以被修改,默认值是false
Object.defineProperty(person, 'age',{
value:18,
enumerable: true,
writable: true,
})
是否可以删除
直接写在let person里面的属性是可以直接删除的,比如name
属性。
let person = {
name:'张三',
sex:'男',
// age:18
}
但是,写在defineProperty
里面的属性是不能删除的,比如age
属性
Object.defineProperty(person, 'age',{
value:18,
enumerable: true,
writable: true,
})
可以设置configurable: true
这个属性,来设置可以删除某个属,可以看到删除成功
Object.defineProperty(person, 'age',{
value:18,
enumerable: true,
writable: true,
configurable: true,
})
另一个需求 get()
当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
初始代码
let number = 18;
let person = {
name:'张三',
sex:'男',
age: number,
}
我修改number
的值,age
也要跟着变
修改代码
Object.defineProperty(person, 'age',{
// value:18,
// enumerable: true,
// writable: true,
// configurable: true,
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get(){
return number;
}
})
打印结果成功
set()函数
当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
Object.defineProperty(person, 'age',{
// value:18,
// enumerable: true,
// writable: true,
// configurable: true,
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get(){
return number;
},
// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
set(value){
console.log('有人修改了age属性,且值是', value);
}
})
查看结果
整体输出一下: