目录
一、Vue实例的属性和方法
1、什么是Vue实例
Vue实例:又称为Vue组件
(1)Vue2.0创建Vue组件的方法:
new 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>Document</title>
<!-- vue2版本加速器 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
</head>
<body>
<div id="app">
{{ msg }}
</div>
<script>
new Vue({ //Vue2版本
el:'#app',//挂载元素
data:{
msg:'西安邮电大学'
},
method:{
}
})
</script>
</body>
</html>
(2)Vue3.0创建Vue组件的方法:
Vue.createApp({…})
有两种写法:
方式一(不太推荐):
<!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>Document</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">{{ count }}</div>
<script>
const obj = {}
Vue.createApp({
data(){
return{
count:120
}
}
}).mount('#app')
</script>
</body>
</html>
方式二(推荐,很清晰):
<!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>Document</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">{{ count }}</div>
<script>
const obj ={
data(){
return {
count:120
}
}
}
let instance = Vue.createApp(obj).mount('#app') //instance就是Vue组件
</script>
</body>
</html>
2、Vue组件的属性
(1)存储属性(data):是一个函数。在组件创建时会调用此函数来构建响应性的数据系统。是组件的存储属性。
获取该属性值的方式:
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>Document</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">{{ count }}</div>
<script>
const obj ={
data(){
return {
count:120
}
}
}
let instance = Vue.createApp(obj).mount('#app') //instance就是Vue组件
console.log(instance.count)
console.log(instance.$data.count)
</script>
</body>
</html>
(2)计算属性(computed):通常可以将存储属性的值直接渲染到html的元素上。在有些场景下存储属性的值不适合直接渲染,需要处理之后再进行渲染。在Vue中使用计算属性对数据进行再处理.
注意:
a、存储属性主要用于数据的存取,我们可以通过赋值运算来修改它的属性值。通常,计算属性只用来取值,不会用来存值,因此计算属性默认提供的是取值方法(get方法);计算属性也可以通过赋值进行存数据,但是存数据的方法需要手动实现(set方法)
b、当使用计算属性时,默认调用get方法(该方法不能显式调用), 当给计算属性赋值时,调用的是set方法(该方法不能显式调用)
☀️举个例子:
<!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>Document</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="app">
<div>{{ type }}</div>
<button @click="add">Add</button>
</div>
<script>
const obj={
data(){
return {
count:0
}
},
//定义计算属性
computed:{
// type(){ //默认只能计算属性type取值
// return this.count>10?"大":"小"
// }
type:{
get(){//实现计算属性type的set方法,用来取计算属性type的值
return this.count>10?"大":"小"
},
set(newVal){//实现计算属性type的set方法,用来设置计算属性type的值
if(newVal=='大'){
this.count = 11
}else{
this.count = 0
}
}
}
},
methods:{
add(){
this.count++
}
}
}
let instance =Vue.createApp(obj).mount('#app')
console.log('count='+instance.count)
console.log('type='+instance.type)
instance.type = '大'
console.log('count='+instance.count)
</script>
</body>
</html>
(3)侦听属性(属性侦听器):可以方便的监听某个属性的变化,以完成复杂的业务逻辑。在Vue中的属性侦听器是watch。
☀️举个例子:
<!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>Document</title>
</head>
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<input type="text" v-model="searchText">
</div>
<script>
const obj = {
data(){
return {
searchText:''
}
},
// 定义属性侦听器
watch:{
searchText(oldText,newText){
if(newText.length > 10){
alert('文本内容太长')
}
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
(4)定义方法的属性(methods):在该属性下定义Vue组件的函数
3、Vue组件的函数(限流)
(1)限流函数:
a、限流场景:
场景1:点击按钮向服务器发起数据请求,在请求的数据回来之前多次单击按钮是无效的且会消耗资源。
场景2:页面中某个按钮会导致页面的刷新,我们需要限制用户对该按钮进行频繁的操作。
b、限流函数
限流函数:在指定的时间间隔内不允许重复执行同一个函数
示例:页面中有一个按钮,单击按钮后在控制台输出当前的时间,要求这个按钮的两次事件触发间隔不能小于2秒
代码段如下(没有封装之前):
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<button @click="myClick">按钮</button>
</div>
<script>
const obj={
data(){
return{
throttle:false
}
},
methods:{
myClick(){
if(!this.throttle){
console.log(Date())
}else{
return
}
this.throttle = true
setTimeout(()=>{
this.throttle= false
},2000)
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
间隔2秒,响应一次,输出一次日期:
将限流的逻辑封装成单独的工具方法 ----- 一次编写多次使用
代码段如下:
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<button @click="myClick">按钮</button>
</div>
<script>
var throttle = false
function throttleTool(callback,timeout){限流的工具函数
if(!throttle){
callback()
}else{
return
}
throttle = true
setTimeout(()=>{
throttle = false
},timeout)
}
const obj = {
data(){
return{
}
},
methods:{
myClick(){
throttleTool(()=>{
console.log(Date())
},2000)
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
间隔2秒,响应一次,输出一次日期:
(2)使用Lodash库进行函数限流:是一款高性能的JavaScript实用工具库。提供了大量的数组、对象、字符串等边界的操作方法,使开发者更简单的使用JavaScript。在Lodash库中提供了debounce函数进行方法的限流。
<script src="https://unpkg.com/lodash@4.17.20/lodash.min.js"></script>
☀️还是上面的例子:
<script src="https://unpkg.com/vue@next"></script>
<script src="https://unpkg.com/lodash@4.17.20/lodash.min.js"></script>
<body>
<div id="app">
<button @click="myClick">按钮</button>
</div>
<script>
const obj = {
data(){
return{
}
},
methods:{
myClick:_.debounce(function(){
console.log(Date())
},2000)
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
间隔2秒,响应一次,输出一次日期:
二、表单数据的双向绑定:v-model
1、单行文本框的绑定:
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<input type="text" v-model="signleText">
<br><br>
<p>文本框输入的内容是:{{ signleText }}</p>
</div>
<script>
const obj = {
data(){
return{
signleText:''
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
单行文本框
2、多行文本区的绑定:
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<textarea rows="10" cols="30" v-model="textarea"></textarea>
<br><br>
<p>文本区输入的内容是:{{ textarea }}</p>
</div>
<script>
const obj = {
data(){
return{
textarea:''
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
文本区
3、复选框的绑定:
复选框的绑定:多个复选框绑定的变量名要相同,并且是数组类型的
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<input type="checkbox" v-model="checkbox" value="足球" name="hobby">足球
<input type="checkbox" v-model="checkbox" value="蓝球"name="hobby">蓝球
<input type="checkbox" v-model="checkbox" value="排球"name="hobby">排球
<br><br>
<p>你的选择是:{{ checkbox }}</p>
</div>
<script>
const obj = {
data(){
return{
checkbox:[],//因为复选框要选择多个,所以选择数组
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
4、单选按钮的绑定:
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<input type="radio" v-model="radio" value="男">男
<input type="radio" v-model="radio" value="女">女
<br><br>
<p>你的选择的性别是:{{ radio }}</p>
</div>
<script>
const obj = {
data(){
return{
radio:'',//因为单选框只能选择一个,所以选择字符串
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
5、下拉列表框的绑定:
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<select v-model="select" multiple>
<option value="A">AAAAA</option>
<option value="B">BBBBB</option>
<option value="C">CCCCC</option>
<option value="D">DDDDD</option>
</select>
<br><br>
<p>你的选择是:{{ select }}</p>
</div>
<script>
const obj = {
data(){
return{
select:[]
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
下拉列表
6、常用的两个修饰符
(1)lazy:懒加载。当输入框失去焦点时再将输入框和变量进行绑定。
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<input type="text" v-model.lazy="signleText">
<br><br>
<p>文本框输入的内容是:{{ signleText }}</p>
</div>
<script>
const obj = {
data(){
return{
signleText:''
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
lazy
(2)trim:去掉绑定的文本数据前后的空格
<script src="https://unpkg.com/vue@next"></script>
<body>
<div id="app">
<textarea rows="10" cols="30" v-model.trim="textarea"></textarea>
<br><br>
<p>文本区输入的内容是:{{ textarea }}</p>
</div>
<script>
const obj = {
data(){
return{
textarea:''
}
}
}
Vue.createApp(obj).mount('#app')
</script>
</body>
</html>
trim