VUE 概述
本文意在快速上手vue,内部细节一概不管,主打能用会用,能出活。
引入 VUE
可以把vue理解成一个别人写的一串代码,可以直接下载引入,也可以通过工程化,npm引入。
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16"></script>
具体参考“如何创建一个vue项目”
快速入门
直接引入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初识Vue</title>
<!-- 引入开发版Vue 提前下载好的 -->
<script src="./js/vue.js"></script>
</head>
<body>
<!-- Step0: 创建容器 -->
<div id="root">
<h1>Hello,{{name}}!</h1>
</div>
<script>
//Step1: 设置Vue全局配置,并创建Vue对象
new Vue({
//vStep1: 让容器和Vue建立联系。
// 使用el指定当前Vue示例为哪个容器服务,值通常是CSS选择器字符串
el: '#root',
// Step2: 进行数据绑定。
data: {
name: 'Vue'
}
});
</script>
</body>
</html>
总结:
- 想让 Vue 工作,就必须创建一个 Vue 实例,且要传入一个配置对象;
- root 容器里的代码依然符合 html 规范,只不过混入了一些特殊的 Vue 语法;
- root 容器里的代码被称为【Vue模板】;
- Vue 实例和容器是一一对应的;
- 真实开发中只有一个Vue实例,并且会配合着组件一起使用;
- {{ xxx }} 中的 xxx 要写 js 表达式,且 xxx 可以自动读取到 data 中的所有属性;
- 一旦 data 中的数据发生改变,那么页面中用到该数据的地方也会自动更新;
注意区分:js 表达式 和 js 代码(语句)
js 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方:
- a
- a+b
- f()
- x === y ? ‘a’ : ‘b’
js 代码(语句)
- if(){}
- for(){}
js表达式是js代码的子集,它属于特殊的js代码
模板语法
Vue 的模板语法分为插值语法和指令语法,就是把 DOM 数据和实例数据联系起来
插值语法:{{JS表达式}}
作用:用于解析标签体内容
<div id="root">
<h1>hello,{{name}}</h1>
</div>
<!-- 引入开发板版Vue.js -->
<script src="./js/vue.js"></script>
<script>
new Vue({
el: '#root',
data: {
name: 'Vue'
}
});
</script>
指令语法:v-xxx:
作用:用于解析标签(解析标签属性、解析标签体内容、绑定事件……)
<div id="root">
<a v-bind:href="url">点击跳转至百度1</a>
<!-- 简写方式(不是所有的指令都能简写) -->
<a :href="url">点击跳转至百度2</a>
</div>
<!-- 引入开发板版Vue.js -->
<script src="./js/vue.js"></script>
<script>
new Vue({
el: '#root',
data: {
url: 'http://www.baidu.com'
}
});
</script>
总结:
Vue模板语法有2大类: 1.插值语法: 功能:用于解析标签体内容。 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。 2.指令语法: 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。 举例:v-bind:href=“xxx” 或 简写为 :href=“xxx”,xxx同样要写js表达式, 且可以直接读取到data中的所有属性。 备注:Vue中有很多的指令,且形式都是:v-???,此处我们只是拿v-bind举个例子。
⭐重点⭐
其实我一直在想,有没有什么办法可以就是说,三言两语解决基础的内容,让人快速上手,我想了想这样不OK,就拿这个模板语法来说,如果不知道getelementbyid,你就不知道VUE的数据DOM分离,你也就不理解它是什么,为什么,怎么样。所以我以后文章方向还是要把基础打扎实。
数据绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数据绑定</title>
<!-- 引入Vue.js -->
<script src="./xxxxxx/vue.js"></script>
</head>
<body>
<div id="root">
单向绑定数据: <input type="text" v-bind:value="value1"> <br>
双向绑定数据: <input type="text" v-model:value="value2">
<!--
v:model的简写形式:
<input type="text" v-model="value2">
-->
</div>
<script>
new Vue({
el: '#root',
data: {
value1: '单向数据绑定',
value2: '双向数据绑定'
}
});
</script>
</body>
</html>
总结:
Vue中有2种数据绑定的方式: 1.单向绑定(v-bind):数据只能从data流向页面。 2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。 备注: 1.双向绑定一般都应用在表单类元素上(如:input、select等) 2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。
数据劫持
一般用不到
事件处理
事件处理需要用到v-on指令,同时还需要搭配methos一起使用
1.通过点击事件修改h1中的值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>事件处理1</title>
<!-- 引入Vue -->
<script src="./js/vue.js"></script>
</head>
<div id="root">
<h1>{{name}}</h1>
<button v-on:click="changeName()">点我更换名字</button>
</div>
<body>
<script>
const vm = new Vue({
el: '#root',
data: {
name: '张三'
},
methods: {
changeName(e) {
console.log(this); //此处的this代表vm
console.log(e.target); //<button>点我更换名字</button>
vm.name = "李四";
}
}
});
</script>
</body>
</html>
2.事件修饰
prevent:阻止事件的默认行为,相当于event.preventDefault()(常用)stop:阻止事件冒泡 ,相当于event.stopPropagation()(常用)once:事件只触发一次 (常用)capture:开启事件的捕获模式self:只有event.target是当前操作元素时,才触发事件(可用来阻止事件冒泡)passive:事件的默认行为立即执行,无需等待事件回调再执行native:vue中如果你想在某个组件的根元素上绑定事件,需要使用native修饰符示例:
计算属性
计算属性是什么?
计算属性是Vue对插值表达式的一种优化,通过
computed关键字将一个属性进行计算,然后再赋值给Vue对象,让Vue对象直接使用{{}}进行引用为什么要使用计算属性?
在使用插值表达式进行取值时,有时候我们想要对表达式进行各种各样的操作(使用链式编程),可能会导致
{{}}中的值十分复杂,虽然不会报错,但是会严重影响代码的可读性!这就需要使用计算属性来解决这种问题了。
方式一:直接使用插件表达式实现
备注:这里的例子过于简单,其实直接使用插件表达式也是没毛病的,但如果在实际开发中遇到需要在插件表达式中进行大量函数调用时,建议使用计算属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>计算属性1</title>
<!-- 引入开发版Vue -->
<script src="./js/vue.js"></script>
</head>
<body>
<div id="root">
姓: <input type="text" v-model="firstName"> <br>
名: <input type="text" v-model="secondName"> <br>
<!-- slice函数截取firstName前三个字符 -->
全名:<span>{{firstName.slice(0,3)}}-{{secondName}}</span>
</div>
</body>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName:'张',
secondName:'三'
}
})
</script>
</html>
方式二:使用methods进行实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>计算属性2</title>
<!-- 引入开发版Vue -->
<script src="./js/vue.js"></script>
</head>
<body>
<div id="root">
姓: <input type="text" v-model="firstName"> <br>
名: <input type="text" v-model="secondName"> <br>
<!-- 注意函数的调用一定不能省略小括号 -->
全名:<span>{{fullName()}}</span>
</div>
</body>
<script>
const vm = new Vue({
el: '#root',
data: {
firstName: '张',
secondName: '三'
},
methods: {
//当firstName或secondName发生改变时,fullName函数就会被调用
fullName() {
return this.firstName.slice(0, 3) + '-' + this.secondName;
}
}
})
</script>
</html>
方式三:使用计算属性实现
备注:计算属性底层也是使用数据劫持实现的,需要注意的是计算属性属于Vue对象(可以直接通过Vue调用),但不属于_data
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>计算属性3</title>
<!-- 引入开发版Vue -->
<script src="./js/vue.js"></script>
</head>
<body>
<div id="root">
姓: <input type="text" v-model="firstName"> <br>
名: <input type="text" v-model="secondName"> <br>
全名:<span>{{fullName}}</span>
</div>
</body>
<script>
Vue.config.productionTip = false;
const vm = new Vue({
el: '#root',
data: {
firstName: '张',
secondName: '三'
},
computed: {
fullName: {
//get的调用时机:1)初次调用,get被调用 2)所依赖的data数据发生改变时get被调用(不改变就直接使用缓存)
get() {
// console.log(this);//此处的this是Vue
return this.firstName + '-' + this.secondName;
},
//set方法,用于对fullName这个计算属性进行修改
set(value) {
console.log("set方法被调用了");
const arr = value.split("-");
this.firstName = arr[0];
this.secondName = arr[1];
}
}
}
});
</script>
</html>
知识拓展
- methods实现和计算属性实现的比较:使用计算属性实现性能更高,因为计算属性使用了缓存技术,当同一时间内调用同一个计算属性,且这段时间内该计算不发生该改变,不需要执行get方法,而是直接去缓存中取数据,避免了重复计算;而methods就需要重复调用方法
总结
计算属性: 1.定义:要用的属性不存在,要通过已有属性计算得来。 2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。 3.get函数什么时候执行? (1).初次读取时会执行一次。 (2).当依赖的数据发生改变时会被再次调用。 4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。 5.备注: 1.计算属性最终会出现在vm上,直接读取使用即可。 2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
侦听器watch
什么是监视属性?
也称侦听属性,是指使用
watch对于属性进行监控,类似于Java中的监听器监视属性的作用?
通过检测属性的改变,触发相应的事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>监视属性2</title>
<!-- 引入开发版Vue -->
<script src="./js/vue.js"></script>
</head>
<body>
<div id="root">
<h2>天气很{{info}}</h2>
<button @click="changeWeather()">切换天气</button>
</div>
<script>
Vue.config.productionTip = false;
const vm = new Vue({
el: '#root',
data: {
isHot: true
},
computed: {
info() {
return this.isHot ? '热' : '冷';
}
},
methods: {
changeWeather() {
this.isHot = !this.isHot;
}
},
//方式一:
watch: {
isHot: {
// 程序初识时就执行handler
//(换句话说,就是当我们加上这个属性,保存后就执行handler函数)
immediate: true,
//当isHot属性发生改变时,handler函数就被调用
handler(newValue, oldValue) {
console.log(
'isHot未修改前:' + oldValue + ';' + 'isHot修改后:' + newValue
);
}
}
}
});
//方式二:(方式一中的isHot其实也是需要加引号的,只是简写了)
vm.$watch('isHot', {
immediate: true,
handler(newValue, oldValue) {
console.log('isHot未修改前:' + oldValue + ';' + 'isHot修改后:' + newValue);
}
});
</script>
</body>
</html>
动态绑定样式
意义一般
条件渲染
常用
<div v-if="n==1">1</div>
<div v-else-if="m==2">2</div>
<!-- 后面无法生效,当n变成3时还会报错 -->
<div>@</div>
<div v-else="n==3">3</div>
循环
<div id="app">
<ul>
<!-- 遍历数组(这里的in可以用of代替) -->
<li v-for="p in persons" :key="p.id">
{{p.name}}-{{p.age}}
</li>
<!-- 遍历数组 -->
<li v-for="(p,index) in persons" :key="index">
{{p}}-{{index}}
</li>
<!-- 遍历JSON对象 -->
<li v-for="(val,key) in student" :key="key">
{{val}}-{{key}}
</li>
<!-- 遍历指定次数 -->
<li v-for="(number,index) in 3" :key="index">
{{number}}-{{index}}
</li>
<!-- 遍历字符串 -->
<li v-for="(str,index) in strs" :key="index">
{{str}}-{{index}}
</li>
</ul>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
persons: [{
id: '1',
name: '张三',
age: 18
}, {
id: '2',
name: '李四',
age: 19
}, {
id: '3',
name: '王五',
age: 20
}],
student: {
name: '张三',
age: 18,
gender: '男'
},
strs: 'abc'
}
});
</script>
后记
还有很多,但是要写一个基础的,这就够了,后面我会更新具体的文章