【Vue的深入学习(重点:限流函数)】

一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值