注意:本笔记大体顺序是按照 vue.js官方文档 来的,配合食用更加!javascript
采用组件化模式,提升代码复用率,且让代码更好维护css
声明式编码,让编码人员无需直接操做DOM,提升开发效率html
使用虚拟DOM+优秀的Diff算法,尽可能复用DOM节点vue
能够打开官网连接去查看安装步骤:Vue官网地址java
完整版(包含完整的警告和调试模式):
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>
压缩版(删除了警告):
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
复制代码
想让Vue工做,就必须建立一个Vue实例,且要传入一个配置对象git
root容器里的代码依然符合HTML规范,只不过混入了一些特殊的Vue语法github
root容器里的代码被称为Vue模板ajax
真实开发中只有一个Vue实例,而且会配合着组件一块儿使用;算法
{xxx}}中的xxx能够自动读取到data中的相应属性,且xxx写js表达式时会自动执行;markdown
例如:{{name.toUpperCase()}} 大写,{{1+1}}输出值为二,{{Date.now()}}获取时间戳
一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新;
注意区分:js表达式 和 js代码(语句)
1.表达式:一个表达式会产生一个值,能够放在任何一个须要值的地方:
(1). a
(2). a+b
(3). demo(1)
(4). x === y ? 'a' : 'b'
2.js代码(语句)
(1). if(){}
(2). for(){}
复制代码
<div class="root">
<h1>hello,{{name}}</h1>
</div>
<div class="root">
<h1>hello,{{name}}</h1>
</div>
<script>
new Vue({
el: '.root',
data: {
name:'cez'
},
methods: {}
});
</script>
复制代码
<div id="root">
<h1>hello,{{name}},{{address}}</h1>
</div>
<script>
new Vue({
el: '#root',
data: {
name:'cez'
},
methods: {}
})
new Vue({
el: '#root',
data: {
address:'山东'
},
methods: {}
});
</script>
复制代码
彻底版代码:
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>初识Vue</title> <!-- 引入Vue --> <script type="text/javascript" src="../js/vue.js"></script> </head> <body> <!-- 准备好一个容器 --> <div id="demo"> <h1>Hello,{{name.toUpperCase()}},{{address}},{{1+1}},{{Date.now()}}</h1> </div> <script type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 //建立Vue实例 new Vue({ el: '#demo', //el用于指定当前Vue实例为哪一个容器服务,值一般为css选择器字符串。\ // el:document.getElementById('root'),也能够这么写,但不推荐 data: { //data中用于存储数据,数据供el所指定的容器去使用,值咱们暂时先写成一个对象。 name: 'zgc', address: '北京' } }) </script> </body> </html>
复制代码
Vue模板语法有两大类:
插值语法:
指令语法:
功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)
举例:v-bind:href="xxx"或省略v-bind,xxx一样要写js表达式,且能够直接读取data中的全部属性,Vue中有不少的指令,且形式都是:v-????,此处只是拿v-bind举例子
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <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> <a v-bind:href="school.url.toUpperCase()" x="hello">点我去{{school.name}}学习1</a> <a :href="school.url" v-bind:x="hello">点我去{{school.name}}学习2</a> </div> </body> <script type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 new Vue({ el: '#root', data: { name: 'zgc', school: { name: '清华', url: 'http://www.atguigu.com', }, hello: '你好' } }) </script> </html>
复制代码
Vue有两种数据绑定的方式:
备注:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>数据绑定</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="root">
<!-- 普通写法 -->
<!--
单向数据绑定:<input type="text" v-bind:value="name"><br/>
双向数据绑定:<input type="text" v-model:value="name"><br/>
-->
<!-- 简写 -->
单向数据绑定:<input type="text" :value="name"><br />
双向数据绑定:<input type="text" v-model="name"><br />
<!-- 以下代码是错误的,由于v-model只能应用在表单类元素(输入类元素)上 -->
<!-- <h2 v-model:x="name">你好啊</h2> -->
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue({
el: '#root',
data: {
name: '尚硅谷'
}
})
</script>
</html>
复制代码
data与el的2种写法
1.el有2种写法
(1).new Vue时候配置el属性。
(2).先建立Vue实例,随后再经过vm.$mount('#root')指定el的值。
2.data有2种写法
(1).对象式
(2).函数式
如何选择:目前哪一种写法均可以,之后学习到组件时,data必须使用函数式,不然会报错。
3.一个重要的原则:
由Vue管理的函数,必定不要写箭头函数,一旦写了箭头函数,this就再也不是Vue实例了。
Vue管理的函数举例:data(),method方法中定义的函数等,this会变成Window
复制代码
el 属性又称挂载点,可认为是 element 的简写,建立一个 vue实例 得知道是在哪一块元素上建立 Vue实例 ,对哪一块视图进行操做。
1. 设置 el 属性
<div id="app"></div>
new Vue({
el: "#app",
render: h => h(App)
})
2. 使用 $mount 接口
new Vue({
render: h => h(App)
}).$mount("#app");
复制代码
data 属性又称内部数据,该属性值能够是对象,也能够是函数,但优先推荐使用函数,对象里的函数又称方法。而且如果组件中的 data 则必须使用函数。
优先推荐使用函数的缘由是在使用同一个 options 对象做为参数建立多个 Vue实例 时,若 data 属性值为对象,在使用 new Vue(options) 建立 Vue实例 时会将 options.data 属性值直接赋值给 Vue实例.data的属性 ,因为对象的赋值是复制的地址,所以多个实例的 data 属性值都是指向同一个对象的地址,则多个实例会共用一个 data对象,当一个实例改变 data对象 时,另外一个实例的 data对象 也会被改变。
而当 data 属性值为函数时,Vue 建立实例时是会执行该 data() 函数,并将函数执行的结果返回的对象赋值给 Vue实例.data 属性,每次函数执行返回的对象都是不一样的对象,所以多个实例的 data 属性值对应的是不一样的对象,一个改变不会影响另一个,各自独立不影响。
1. 使用对象
data:{ n: 0 }
2. 使用函数
data(){ return{ n: 0 } }
复制代码
MVVM:Model-View-ViewModel 是一种软件架构模式
data中全部的属性,最后都出如今了vm身上
vm身上全部的属性,及Vue原型上全部属性,在Vue模板中均可以直接使用 如{{$options}} {{$emit}}
均有结果出现。
Vue数据劫持与数据代理,计算属性等都用到了这个方法,必须理解它。若是你看到这个方法瞬间能反应过来他的用法,看一下我下面的代码回忆回忆就能够继续向下学习,若是不会,则看个人另外一篇博客学习。
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>回顾Object.defineproperty方法</title> </head> <body> <script type="text/javascript"> let number = 18 let person = { name: '张三', sex: '男', } //Object.defineProperty给对象添加属性 Object.defineProperty(person, 'age', { //里面三个参数(对象,属性名,options配置对象{}) // 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)就会被调用,且会收到修改的具体值 set(value) { console.log('有人修改了age属性,且值是', value) number = value } }) // console.log(Object.keys(person)) console.log(person) </script> </body> </html>
复制代码
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>何为数据代理</title> </head> <body> <!-- 数据代理:经过一个对象代理对另外一个对象中属性的操做(读/写)--> <script type="text/javascript" > let obj = {x:100} let obj2 = {y:200} Object.defineProperty(obj2,'x',{ get(){ return obj.x }, set(value){ obj.x = value } }) </script> </body> </html>
复制代码
能够经过obj2对象操做obj对象中的属性
1.Vue中的数据代理: 经过vm对象来代理data对象中属性的操做(读/写)
2.Vue中数据代理的好处: 更加方便的操做data中的数据
3.基本原理:
经过Object.defineProperty()把data对象中全部属性添加到vm上。
为每个添加到vm上的属性,都指定一个getter/setter。
在getter/setter内部去操做(读/写)data中对应的属性。
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>Vue中的数据代理</title> <!-- 引入Vue --> <script type="text/javascript" src="../js/vue.js"></script> </head> <body> <!-- 准备好一个容器--> <div id="root"> <h2>学校名称:{{name}}</h2> <h2>学校地址:{{address}}</h2> <!-- 若是没有数据代理,代码要这么写,寻找_data中的name属性与address属性,太过繁琐, 由于vm上没有这两个属性,经过数据代理将这两个属性放在vm身上一份 <h2>学校名称:{{_data.name}}</h2> <h2>学校地址:{{_data.address}}</h2> --> </div> </body> <script type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 const vm = new Vue({ el: '#root', data: { name: '尚硅谷', address: '宏福科技园' } }) </script> </html>
复制代码
页面中学校名称本来为尚硅谷,data数据改变后页面内容也就跟着变了
事件的基本使用:
1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
2.事件的回调须要配置在methods对象中,最终会在vm上;
3.methods中配置的函数,不要用箭头函数!不然this就不是vm了;
4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象;
5.@click="demo" 和 @click="demo($event)" 效果一致,但后者能够传参;
exact 修饰符
.exact 修饰符容许你控制由精确的系统修饰符组合触发的事件。
<!-- 即便 Alt 或 Shift 被一同按下时也会触发 -->
<button @click.ctrl="onClick">A</button>
<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>
复制代码
鼠标按钮修饰符
这些修饰符会限制处理函数仅响应特定的鼠标按钮。
.left
.right
.middle
复制代码
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>事件的基本使用</title> <!-- 引入Vue --> <script type="text/javascript" src="../js/vue.js"></script> </head> <body> <!-- 准备好一个容器--> <div id="root"> <h2>欢迎来到{{name}}学习</h2> <!-- <button v-on:click="showInfo">点我提示信息</button> --> <button @click="showInfo1">点我提示信息1(不传参)</button> <button @click.right="showInfo1">右键点我提示信息1(不传参)</button> <button @click="showInfo2($event,66)">点我提示信息2(传参)</button> <!-- 有且只有 ctrl 被按下的时候才触发 --> <button v-on:click.ctrl.exact="showInfo1">A</button> <!-- shift 即便 与(Alt 或 ctrl) 被一同按下时也会触发 --> <button v-on:click.shift="showInfo1">A</button> <!-- 没有任何系统修饰符被按下的时候才触发 --> <button v-on:click.exact="showInfo1">A</button> </div> </body> <script type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 const vm = new Vue({ el:'#root', data:{ name:'尚硅谷', }, methods:{ showInfo1(event){ // console.log(event.target.innerText) // console.log(this) //此处的this是vm alert('同窗你好!') }, showInfo2(event,number){ console.log(event,number) // console.log(event.target.innerText) // console.log(this) //此处的this是vm alert('同窗你好!!') } } }) </script> </html>
复制代码
Vue中的事件修饰符:
1.prevent:阻止默认事件(经常使用);
2.stop:阻止事件冒泡(经常使用);
3.once:事件只触发一次(经常使用);
4.capture:使用事件的捕获模式;
5.self:只有event.target是当前操做的元素时才触发事件;
6.passive:事件的默认行为当即执行,无需等待事件回调执行完毕;
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8" /> <title>事件修饰符</title> <!-- 引入Vue --> <script type="text/javascript" src="../js/vue.js"></script> <style> * { margin-top: 20px; } .demo1 { height: 50px; background-color: skyblue; } .box1 { padding: 5px; background-color: skyblue; } .box2 { padding: 5px; background-color: orange; } .list { width: 200px; height: 200px; background-color: peru; overflow: auto; } li { height: 100px; } </style> </head> <body> <!-- 准备好一个容器--> <div id="root"> <h2>欢迎来到{{name}}学习</h2> <!-- 阻止默认事件(经常使用) --> <a href="http://www.atguigu.com" @click.prevent="showInfo">点我提示信息</a> <!-- 阻止事件冒泡(经常使用) --> <div class="demo1" @click="showInfo"> <button @click.stop="showInfo">点我提示信息</button> <!-- 在哪一层加了阻止事件冒泡,哪一层外面的全部祖先冒泡都会被阻止 --> <!-- 修饰符能够连续写 --> <!-- <a href="http://www.atguigu.com" @click.prevent.stop="showInfo">点我提示信息</a> --> </div> <!-- 事件只触发一次(经常使用) --> <button @click.once="showInfo">点我提示信息</button> <!-- 使用事件的捕获模式 --> <div class="box1" @click.capture="showMsg(1)"> div1 <div class="box2" @click="showMsg(2)"> div2 </div> </div> <!-- 只有event.target是当前操做的元素时才触发事件; --> <div class="demo1" @click.self="showInfo"> <button @click="showInfo">点我提示信息</button> </div> <!-- 事件的默认行为当即执行,无需等待事件回调执行完毕; --> <ul @wheel.passive="demo" class="list"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <!-- @wheel滚轮滚动事件 @scroll滚动条滚动事件 --> </div> </body> <script type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 new Vue({ el: '#root', data: { name: '尚硅谷' }, methods: { showInfo(e) { // e.stopPropagation()//阻止冒泡 // e.preventDefault()//阻止默认事件 //能够不用上面两种方法而改用事件修饰符 alert('同窗你好!') console.log(e.target) }, showMsg(msg) { console.log(msg) }, demo() { for (let i = 0; i < 100000; i++) { console.log('#') } console.log('累坏了') } } }) </script> </html>
复制代码
1.Vue中经常使用的按键别名:
回车 => enter
删除 => delete (捕获“删除”和“退格”键)
退出 => esc
空格 => space
换行 => tab (特殊,必须配合keydown去使用)
上 => up
下 => down
左 => left
右 => right
2.Vue未提供别名的按键,可使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
3.系统修饰键(用法特殊):tab、ctrl、alt、shift、meta
(1).配合keyup使用:按下修饰键的同时,再按下其余键,随后释放其余键,事件才被触发。
(2).配合keydown使用:正常触发事件。
4.也可使用keyCode去指定具体的按键(不推荐)
<input type="text" placeholder="按下回车提示输入" @keydown.13="showInfo">
复制代码
5.Vue.config.keyCodes.自定义键名 = 键码,能够去定制按键别名
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>键盘事件</title>
<!-- 引入Vue -->
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="root">
<h2>欢迎来到{{name}}学习</h2>
<input type="text" placeholder="按下回车提示输入" @keydown.huiche="showInfo">
<!-- <input type="text" placeholder="按下回车提示输入" @keydown.enter="showInfo"> -->
<!--当有需求要同时按下两个键才能生效时
<input type="text" placeholder="按下回车提示输入" @keyup.ctrl.y="showInfo"> -->
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
Vue.config.keyCodes.huiche = 13 //定义了一个别名按键
new Vue({
el: '#root',
data: {
name: '尚硅谷'
},
methods: {
showInfo(e) {
// console.log(e.key,e.keyCode)
// if (e.keyCode !== 13) return 若是不是回车键,则弹出函数
console.log(e.target.value)
}
},
})
</script>
</html>
复制代码