一、初识Vue
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>初识Vue</title>
6 <script type="text/javascript" src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 <h1>hello,{{name}}</h1>
11 </div>
12 </body>
13 <script>
14 // const x = new Vue({
15 // el:'#root',
16 // data:{
17 // name:"张三1"
18 // }
19 // })
20
21 // 1、el的两种写法
22 // const v = new Vue({
23 // // el:'',
24 // data:{
25 // name:"张三2"
26 // }
27 // })
28 // console.log(v)
29 //
30 // setTimeout(() => {
31 // v.$mount('#root')
32 // },1000);
33
34 // v.$mount('#root')
35
36 // 2、data的两种写法
37 // new Vue({
38 // el:'#root',
39 // data:{
40 // name:"张三3"
41 // }
42 // })
43
44 new Vue({
45 el: '#root',
46 data: function () {
47 console.log('@@@', this) //this是Vue实例对象
48 return {
49 name: "张三4"
50 }
51 }
52 })
53
54 </script>
55 </html>
二、模板语法
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>初识Vue</title>
6 <script type="text/javascript" src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 <h1>插值(标签体)</h1>
11 <h1>hello,{{name}}</h1>
12 <hr/>
13 <h1>指令(标签属性、标签体内容、绑定事件)</h1>
14 <a v-bind:href="school.url.toUpperCase()">学习{{school.name}}1</a>
15 <a :href="school.url">学习{{school.name}}2</a>
16 </div>
17 </body>
18 <script>
19 new Vue({
20 el: '#root',
21 data: {
22 name: "张三",
23 school: {
24 name: "李四",
25 url: "http://www.baidu.com/"
26 }
27 }
28 })
29
30 </script>
31 </html>
三、数据绑定
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>数据绑定</title>
6 <script type="text/javascript" src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 <h1>普通写法</h1>
11 <!-- 单向数据绑定:<input type="text" v-bind:value="name"><br/>-->
12 <!-- 双向数据绑定:<input type="text" v-model:value="name"><br/>-->
13 <h2>简写</h2>
14 单向数据绑定:<input type="text" :value="name"><br/>
15 双向数据绑定:<input type="text" v-model="name"><br/>
16 <!--v-model仅使用在表单数据中-->
17
18 </div>
19 </body>
20 <script>
21 new Vue({
22 el: '#root',
23 data: {
24 name: "张三",
25 }
26 })
27
28 </script>
29 </html>
四、数据代理
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>数据代理</title>
6 // vm(_data{name,address})
7 // 不用数据代理->{{_data.name}}}
8 // 用数据代理->{{name}}} 本质是getter和setter方法
9 // 通过vm对象代理data对象中属性的操作!!!!!!!!!!!
10 </head>
11 <body>
12
13 </body>
14 <script>
15 let number = 18
16
17 let person = {
18 name: "张三",
19 sex: "男"
20 }
21
22 Object.defineProperty(person, "age", {
23 // value:18,
24 // enumerable:true, // 是否枚举
25 // writable:true, // 是否修改
26 // configurable:true, //是否删除
27
28 get() {
29 console.log("读取age属性")
30 return number
31 },
32
33 set(value) {
34 console.log("修改age属性", value)
35 number = value
36 }
37
38 })
39 // for (let key in person) {
40 // console.log(person[key])
41 // }
42 console.log(person)
43 </script>
44
45 </html>
五、事件处理
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>事件处理</title>
6 <script src="js/vue.js"></script>
7 <style>
8 *{
9 margin-top: 20px;
10 }
11
12 .demo1{
13 height: 50px;
14 background-color: skyblue;
15 }
16
17 .box1{
18 padding: 5px;
19 background-color: skyblue;
20 }
21
22 .box2{
23 padding: 5px;
24 background-color: orange;
25 }
26 .list{
27 width: 200px;
28 height: 200px;
29 background-color: peru;
30 overflow: auto;
31 }
32 li{
33 height: 100px;
34 }
35
36 </style>
37
38
39 </head>
40 <body>
41 <div id="root">
42 <h1>你好,{{name}}</h1>
43 <button v-on:click="show1()">提示信息1(不传参)</button>
44 <button @click="show2($event,66)">提示信息2(传参)</button>
45
46 <!-- ################################################################ -->
47 <!-- 阻止默认时间 -->
48 <a href="http://www.baidu.com" @click.prevent="show3()">提示信息3</a>
49 <!-- 阻止事件冒泡 -->
50 <div class="demo1" @click="show3()">
51 <button @click.stop="show3()">提示信息3-1</button>
52 </div>
53 <!-- 事件只触发一次 -->
54 <button @click.once="show3()">提示信息3-2</button>
55 <!-- 使用事件的捕获模式 -->
56 <div class="box1" @click.capture="showMsg(1)">
57 div1
58 <div class="box2" @click="showMsg(2)">
59 div2
60 </div>
61 </div>
62 <!-- 只有event.target是当前操作的元素时才触发事件 -->
63 <div class="demo1" @click.self="show4()">
64 <button @click="show4()">提示信息4</button>
65 </div>
66 <!-- 事件的默认行为立即执行,无需等待事件回溯执行完毕 -->
67 <ul @wheel.passive="demo()" class="list"> // @scroll="demo()"
68 <li>1</li>
69 <li>2</li>
70 <li>3</li>
71 <li>4</li>
72 </ul>
73
74 </div>
75 </body>
76 <script>
77 const vm = new Vue({
78 el:'#root',
79 data:{
80 name:"张三",
81 },
82 methods:{
83 show1(){
84 // console.log(event.target)
85 // console.log(event.target.innerText)
86 alert("提示信息1(不传参)")
87 },
88 show2(event,number){
89 console.log(event,number)
90 alert("提示信息2(传参)")
91 },
92 show3(){
93 alert("提示信息3")
94 },
95 showMsg(msg){
96 console.log(msg)
97 },
98 show4(){
99 // console.log(event.target)
100 alert("提示信息4")
101 },
102 demo(){
103 for (let i = 0; i < 10000; i++) {
104 console.log("@")
105 }
106 console.log("累")
107 },
108
109 }
110 })
111 </script>
112 </html>
六、计算属性
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>计算属性</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 姓:<input type="text" v-model="firstName"> <br><br>
11 名:<input type="text" v-model="lastName"> <br><br>
12 全名:<span>{{fullName}}</span><br><br>
13 全名:<span>{{fullName2}}</span><br><br> // 简写,不需要括号,不是函数!!!!!!!
14 </div>
15 </body>
16 <script>
17 const vm = new Vue({
18 el:'#root',
19 data:{
20 firstName:"张",
21 lastName:"三"
22 },
23 computed:{
24 //与methods相比,computed存在缓存机制
25 fullName:{
26 // get什么时候调用?
27 // 1、初次读取fullName时 2、所依赖的数据发生变化时
28 get(){
29 return this.firstName+"-"+this.lastName;
30 },
31 // set什么时候调用? 当fullName被修改时
32 set(value){
33 // console.log(value)
34 const arr = value.split("-")
35 this.firstName = arr[0]
36 this.lastName = arr[1]
37 }
38 },
39 fullName2(){ //简写
40 return this.firstName+"-"+this.lastName;
41 }
42 }
43 })
44
45 </script>
46
47 </html>
七、监视属性
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>监视属性</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 <h2>今天天气很{{info}}</h2>
11 <!-- <button @click="flag = !flag">点击切换</button>-->
12 <button @click="changeWeather">点击切换</button>
13 <br>
14 <h3>a的值是{{number.a}}</h3>
15 <button @click="number.a++">点击一下a++</button>
16 <h3>b的值是{{number.b}}</h3>
17 <button @click="number.b++">点击一下b++</button>
18 </div>
19 </body>
20 <script>
21 const vm = new Vue({
22 el:'#root',
23 data:{
24 flag:true,
25 number:{
26 a:1,
27 b:1,
28 }
29 },
30 computed:{
31 info(){
32 return this.flag ? "炎热":"凉爽"
33 }
34 },
35 methods:{
36 changeWeather(){
37 return this.flag = !this.flag;
38 }
39 },
40 watch:{
41 flag:{ //正常写法
42 // immediate:true, //初始化时让handler调用一下
43 handler(newValue,oldValue){ // flag发生改变时调用
44 console.log("flag被修改了",newValue,oldValue)
45 }
46 },
47
48 // flag(newValue,oldValue){ //简写(不能配置其他)
49 // console.log("flag被修改了",newValue,oldValue)
50 // },
51
52 "number.a":{ // 多级结构
53 handler(newValue,oldValue){ // flag发生改变时调用
54 console.log("a被修改了",newValue,oldValue)
55 }
56 },
57
58 number: { //所有属性变化
59 deep:true,
60 handler(newValue,oldValue){
61 console.log("number被修改了",newValue,oldValue)
62 }
63 }
64
65 }
66 })
67
68 // vm.$watch("flag",{ //正常写法
69 // immediate:true, //初始化时让handler调用一下
70 // handler(newValue,oldValue) { // flag发生改变时调用
71 // console.log("flag被修改了",newValue,oldValue)
72 // }
73 // })
74
75 // vm.$watch("flag",function (newValue, oldValue) { //简写(不能配置其他)
76 // console.log("flag被修改了",newValue,oldValue)
77 // })
78
79 </script>
80 </html>
八、计算属性与监视
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>计算属性与监视</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9 <div id="root">
10 姓:<input type="text" v-model="firstName"> <br><br>
11 名:<input type="text" v-model="lastName"> <br><br>
12 全名:<span>{{fullName}}</span><br><br>
13 </div>
14 </body>
15 <script>
16 // computed能完成的功能,watch都可以完成;watch能完成的功能,computed不一定能完成
17 // Vue管理的函数最好写成普通函数;不被Vue管理的函数(定时器)最好写成箭头函数!!!!!!!!!
18 const vm = new Vue({
19 el:'#root',
20 data:{
21 firstName:"张",
22 lastName:"三",
23 fullName:"张-三"
24 },
25 watch:{
26 firstName(val){
27 setTimeout(()=>{
28 this.fullName = val + "-" + this.lastName
29 },1000)
30 },
31 lastName(val){
32 this.fullName = this.firstName + "-" + val
33 }
34 }
35 })
36
37 </script>
38 </html>
九、绑定样式
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>绑定样式</title>
6 <script src="js/vue.js"></script>
7 <style>
8 .basic{
9 width: 400px;
10 height: 100px;
11 border: 1px solid black;
12 }
13 .happy{
14 border: 4px solid red;;
15 background-color: rgba(255, 255, 0, 0.644);
16 background: linear-gradient(30deg,yellow,pink,orange,yellow);
17 }
18 .sad{
19 border: 4px dashed rgb(2, 197, 2);
20 background-color: gray;
21 }
22 .normal{
23 background-color: skyblue;
24 }
25
26 .at1{
27 background-color: yellowgreen;
28 }
29 .at2{
30 font-size: 30px;
31 text-shadow:2px 2px 10px red;
32 }
33 .at3{
34 border-radius: 20px;
35 }
36 </style>
37 </head>
38 <body>
39
40 <div id="root">
41 <!--绑定class样式-->
42 <!-- 字符串写法,适用于样式类名不确定,需动态获取-->
43 <div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br> <br>
44 <!-- 数组写法,适用于绑定样式个数不确定,名字不确定-->
45 <div class="basic" :class="classArr">{{name}}</div> <br> <br>
46 <!-- 对象写法,适用于绑定样式个数确定,名字确定,但要动态决定-->
47 <div class="basic" :class="classObj">{{name}}</div> <br> <br>
48
49 <!--绑定style样式-->
50 <!-- 对象写法 -->
51 <div class="basic" :style="styleObj">{{name}}</div> <br> <br>
52 <!-- 数组写法 -->
53 <div class="basic" :style="[styleObj,styleObj2]">{{name}}</div> <br> <br>
54 </div>
55 </body>
56
57 <script>
58 new Vue({
59 el:'#root',
60 data:{
61 name:'哈哈',
62 mood:'normal',
63 classArr:['at1','at2','at3'],
64 classObj:{
65 at1:false,
66 at2:false
67 },
68 styleObj:{
69 fontSize:'40px', //font-size
70 color:"red"
71 },
72 styleObj2:{
73 backgroundColor:"orange"
74 }
75 },
76 methods:{
77 changeMood(){
78 const arr = ['happy','sad','normal']
79 this.mood = arr[Math.floor(Math.random()*3)]
80 }
81 }
82 })
83 </script>
84 </html>
十、条件渲染
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>条件渲染</title>
6 <script src="js/vue.js"></script>
7 </head>
8 <body>
9
10 <div id="root">
11 <h2>当前的n值为{{n}}</h2>
12 <button @click="n++">点击我n+1</button>
13 <!-- v-show会使页面代码存在-->
14 <!-- <div v-show="false">欢迎来到{{name}}</div>-->
15 <!-- <div v-show="1===1">欢迎来到{{name}}</div>-->
16
17 <!-- v-if会使页面代码消失-->
18 <!-- <div v-if="false">欢迎来到{{name}}</div>-->
19 <!-- <div v-if="1===1">欢迎来到{{name}}</div>-->
20
21 <!-- <div v-if="n===1">Angular</div>-->
22 <!-- <div v-if="n===2">React</div>-->
23 <!-- <div v-if="n===3">Vue</div>-->
24
25 <!-- <div v-if="n===1">Angular</div>-->
26 <!-- <div v-else-if="n===1">React</div>-->
27 <!-- <div v-else-if="n===3">Vue</div>-->
28 <!-- <div v-else>哈哈</div>-->
29
30 <template v-if="n===1">
31 <div>Angular</div>
32 <div>React</div>
33 <div>Vue</div>
34 </template>
35 </div>
36 </body>
37 <script>
38 new Vue({
39 el:'#root',
40 data:{
41 n:0,
42 name:'中国',
43 }
44 })
45 </script>
46 </html>