Vue Basic
01.初识vue
vue:动态构建用户界面的渐进式 JavaScript 框架。
vue特点:
组件化:在vue中,一个vue文件就是一个组件,包含:样式,布局,交互
声明式:
虚拟DOM:
vue写法指南:风格指南,示例,Cookbook,awesome vue
引入JS,可以本地引入,也可以CDN引入
1 2 3 4 5 6 7 8 9 10
| <head> <meta charset="UTF-8"/> <title>初识Vue</title>
<script type="text/javascript" src="../js/vue.js"></script> </head>
|
创建vue对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <script type="text/javascript"> Vue.config.productionTip = false new Vue({ el: '#demo', data: { name: 'vue', address: '北京' } }) </script>
|
表达式要求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<div id="demo"> <h1>Hello,{{name.toUpperCase()}},{{address}}</h1> </div>
|
02.模板语法
v-bind:可以给任何标签属性绑定值,可以简写为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <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
new Vue({ el: '#root', data: { hello: "xx", name: 'jack', school: { name: '666', url: 'http://www.baidu.com', } } }) </script>
|
03.数据绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <body>
<div id="root">
单向数据绑定:<input type="text" :value="name"><br/> 双向数据绑定:<input type="text" v-model="name"><br/>
</div> </body>
|
04.el与data的两种写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <body>
<div id="root"> <h1>你好,{{name}}</h1> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
new Vue({ el:'#root',
data(){ console.log('@@@',this) return{ name:'666' } } }) </script>
|
05.MVVM
1 2 3
| 1.data中所有的属性,最后都出现在了vm身上。 2.vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。 {{$options}} {{$emit}}
|
06.数据代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <script type="text/javascript" > let number = 18 let person = { name:'张三', sex:'男', }
Object.defineProperty(person,'age',{
get(){ console.log('有人读取age属性了') return number },
set(value){ console.log('有人修改了age属性,且值是',value) number = value }
})
console.log(Object.keys(person))
console.log(person) </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <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>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <body>
<div id="root"> <h2>公司名称:{{name}}</h2> <h2>公司地址:{{address}}</h2> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el:'#root', data:{ name:'上浮科技', address:'科技园' } }) </script>
|
07.事件代理
事件的基本使用:
1 2 3 4 5
| 1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名; 2.事件的回调需要配置在methods对象中,最终会在vm上; 3.methods中配置的函数,不要用箭头函数!否则this就不是vm了; 4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象; 5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参;
|
Vue中的事件修饰符:
1 2 3 4 5 6 7 8
| 1.prevent:阻止默认事件(常用); 如果这里没有.prevent,则会在弹窗结束后跳转至baidu网页 <a href="http://www.baidu.com" @click.prevent="showInfo">点我提示信息</a> 2.stop:阻止事件冒泡(常用); 父子组件之间的事件传递 3.once:事件只触发一次(常用); 4.capture:使用事件的捕获模式;使用事件的捕获模式 冒泡是内到外,捕获是外到内 ;默认是冒泡模式 5.self:只有event.target是当前操作的元素时才触发事件; 6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;
|
Vue中的键盘事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 1.Vue中常用的按键别名: 回车 => enter 删除 => delete (捕获“删除”和“退格”键) 退出 => esc 空格 => space 换行 => tab (特殊,必须配合keydown去使用) 上 => up 下 => down 左 => left 右 => right
2.Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)
3.系统修饰键(用法特殊):ctrl、alt、shift、meta (1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。 (2).配合keydown使用:正常触发事件。
4.也可以使用keyCode去指定具体的按键(不推荐)
5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
|
08.计算属性
- 要显示的数据不存在,要通过计算得来。
- 在 computed 对象中定义计算属性。
- 在页面中使用来显示计算的结果
method实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <div id="root"> 姓:<input type="text" v-model="firstName"> <br/><br/> 名:<input type="text" v-model="lastName"> <br/><br/> 全名:<span>{{fullName()}}</span> <br/><br/>
全名2:<span>{{fullName}}</span> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
new Vue({ el: '#root', data: { firstName: '张', lastName: '三' }, methods: { fullName() { console.log('@---fullName') return this.firstName + '-' + this.lastName } }, }) </script>
|
计算属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| <body>
<div id="root"> 姓:<input type="text" v-model="firstName"> <br/><br/> 名:<input type="text" v-model="lastName"> <br/><br/> 测试:<input type="text" v-model="x"> <br/><br/> 全名:<span>{{fullName}}</span> <br/><br/>
</div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el: '#root', data: { firstName: '张', lastName: '三', x: '你好' }, methods: { demo() {
} }, computed: { fullName: { get() { console.log('get被调用了') return this.firstName + '-' + this.lastName }, set(value) { console.log('set', value) const arr = value.split('-') this.firstName = arr[0] this.lastName = arr[1] } } } }) </script>
|
计算属性简写:
表面上是函数,实质上是通过这个函数往vm上放了一个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <body>
<div id="root"> 姓:<input type="text" v-model="firstName"> <br/><br/> 名:<input type="text" v-model="lastName"> <br/><br/> 全名:<span>{{fullName}}</span> <br/><br/> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el: '#root', data: { firstName: '张', lastName: '三', }, computed: {
fullName() { console.log('get被调用了') return this.firstName + '-' + this.lastName } } }) </script>
|
09.监视属性
通过通过 vm 对象的$watch()或 watch 配置来监视指定的属性
当属性变化时, 回调函数自动调用, 在函数内部进行计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <body>
<div id="root"> <h2>今天天气很{{info}}</h2> <button @click="changeWeather">切换天气</button> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el:'#root', data:{ isHot:true, }, computed:{ info(){ return this.isHot ? '炎热' : '凉爽' } }, methods: { changeWeather(){ this.isHot = !this.isHot } },
})
vm.$watch('isHot',{ immediate:true, handler(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } }) </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| watch: {
//监视多级结构中某个属性的变化 /* 'numbers.a':{ handler(){ console.log('a被改变了') } } */ //监视多级结构中所有属性的变化 numbers: { deep: true, handler() { console.log('numbers改变了') } } }
watch: { //正常写法 /* isHot:{ // immediate:true, //初始化时让handler调用一下 // deep:true,//深度监视 handler(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue) } }, */ //简写 : 不需要 immediate deep 就可以简写 /* isHot(newValue,oldValue){ console.log('isHot被修改了',newValue,oldValue,this) } */ }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <body>
<div id="root"> 姓:<input type="text" v-model="firstName"> <br/><br/> 名:<input type="text" v-model="lastName"> <br/><br/> 全名:<span>{{fullName}}</span> <br/><br/> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el:'#root', data:{ firstName:'张', lastName:'三', fullName:'张-三' }, watch:{ firstName(val){ setTimeout(()=>{ console.log(this) this.fullName = val + '-' + this.lastName },1000); }, lastName(val){ this.fullName = this.firstName + '-' + val } } }) </script>
|
10.绑定样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>绑定样式</title> <style> .basic { width: 400px; height: 100px; border: 1px solid black; }
.happy { border: 4px solid red;; background-color: rgba(255, 255, 0, 0.644); background: linear-gradient(30deg, yellow, pink, orange, yellow); }
.sad { border: 4px dashed rgb(2, 197, 2); background-color: gray; }
.normal { background-color: skyblue; }
.atguigu1 { background-color: yellowgreen; }
.atguigu2 { font-size: 30px; text-shadow: 2px 2px 10px red; }
.atguigu3 { border-radius: 20px; } </style> <script type="text/javascript" src="../js/vue.js"></script> </head> <body>
<div id="root"> <div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/>
<div class="basic" :class="classArr">{{name}}</div> <br/><br/>
<div class="basic" :class="classObj">{{name}}</div> <br/><br/>
<div class="basic" :style="styleObj2">{{name}}</div> <br/><br/> <div class="basic" :style="styleArr">{{name}}</div> </div> </body>
<script type="text/javascript"> Vue.config.productionTip = false
const vm = new Vue({ el: '#root', data: { name: '西数', mood: 'normal', classArr: ['atguigu1', 'atguigu2', 'atguigu3'], classObj: { atguigu1: false, atguigu2: false, }, styleObj: { fontSize: '40px', color: 'red', }, styleObj2: { backgroundColor: 'orange', fontSize: '40px', color: 'blue', }, styleArr: [ { fontSize: '40px', color: 'blue', }, { backgroundColor: 'gray' } ] }, methods: { changeMood() { const arr = ['happy', 'sad', 'normal'] const index = Math.floor(Math.random() * 3) this.mood = arr[index] } }, }) </script>
</html>
|
11.条件渲染
1 2 3 4
| 1.v-if (1).v-if="表达式" (2).v-else-if="表达式" (3).v-else="表达式" 适用于:切换频率较低的场景。 特点:不展示的DOM元素直接被移除。 注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。 2.v-show 写法:v-show="表达式" 适用于:切换频率较高的场景。 特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉 3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。
|
参考链接:
https://www.jianshu.com/p/4348e6c60da4
https://v2.cn.vuejs.org/v2/guide/components-custom-events.html