首页 > 其他分享 >零基础入门Vue之窥探大法——计算与侦听

零基础入门Vue之窥探大法——计算与侦听

时间:2024-01-20 20:22:26浏览次数:24  
标签:info el 大法 Vue bUrl input 侦听 newValue

前言

上一小节 我介绍了我学习vue入门 插值语法 的过程。

在本篇,我将记录我对vue的 计算属性和侦听器 的学习记录

注:本篇对于”侦听“和”监听“是一个意思


一、计算属性

在官网上,可以看到这样一个例子:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

Vue官方预判到了某些人学了Vue,会在{{}}写复杂的语句,而这些语句会大大降低可读性,但有时候又不得不去写这么复杂的逻辑来满足业务需求

因此Vue提供了新的配置项:computed

在面对每当我们读取变量时需要对变量进行处理后再现实的情况


1.1 计算属性的基本用法

看代码:

computedcomputed<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 500px;
            height: 50px;
        }
    </style>
</head>
<body>
    <div id="root">
        输入b站视频连接: <input v-model="bUrl"><br>
        该视频的id为: {{id}}
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:"#root", //绑定元素,el的属性值可以是dom节点也可以是css选择器
        data:{
            bUrl:"https://www.bilibili.com/video/BV1xC4y1C7Hz/?spm_id_from=333.1007.tianma.1-1-1.click", //这是可以存放用于展示的数据
        },
        computed:{
            id(){
                if(this.bUrl.includes("?")){
                    return this.bUrl.split("/").slice(-2,-1)[0];
                }

                return this.bUrl.split("/").slice(-1)[0];
            }
        }
    })
</script>
</html>

在这个例子中,在input框输入b站url链接,computed配置的方法会立刻计算,在dom节点可以当成属性来获取

为什么每次修改input的内容computed相关方法会重新执行一次呢?因为v-model对bUrl和input框的内容进行了双向绑定,一旦改变了其中一个另外一个也会跟着变化,变化的时候就会触发computed配置里面的相关方法


1.2 计算属性添加setter

除此之外,如果我要对计算属性的方法添加一个setter,那么就需要携程这样子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 500px;
            height: 50px;
        }
    </style>
</head>
<body>
    <div id="root">
        输入b站视频连接: <input v-model="bUrl"><br>
        该视频的id为: {{id}} <br>
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:"#root", //绑定元素,el的属性值可以是dom节点也可以是css选择器
        data:{
            bUrl:"https://www.bilibili.com/video/BV1xC4y1C7Hz/?spm_id_from=333.1007.tianma.1-1-1.click",
        },
        computed:{
            id:{
                get(){
                    if(this.bUrl.includes("?")){
                        return this.bUrl.split("/").slice(-2,-1)[0];
                    }

                    return this.bUrl.split("/").slice(-1)[0];
                },
                set(){
                    /* show your code. */
                }
            }
        }
    })
</script>
</html>

二、侦听器

在Vue中提供了单独的配置去监听变量的变化,这个配置项就是:watch


2.1 监听器的基本用法

对于watch来说,当被监听对象发生改变时会调用监听的回调函数(handler):

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 200px;
            height: 20px;
        }
    </style>
</head>
<body>
    <div id="root">
        输入b站视频连接: <input v-model="msg"><br>
        变化: {{info}}
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:"#root", 、
        data:{
            msg:"hello", 
            info:"没变化"
        },
        watch:{
            msg:{
                handler(oldValue,newValue){
                    this.info = `之前是${oldValue},现在是${newValue}。`;
                }
            }
        }
    })
</script>
</html>

除此之外,你还可以用vm去创建

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 200px;
            height: 20px;
        }
    </style>
</head>
<body>
    <div id="root">
        输入b站视频连接: <input v-model="msg"><br>
        变化: {{info}}
    </div>
</body>
<script type="text/javascript">
    let vm = new Vue({
        el:"#root", 
        data:{
            msg:"hello", 
            info:"没变化"
        },
    });

    vm.$watch('msg',function(oldValue,newValue){
        this.info = `之前是${oldValue},现在是${newValue}。`;
    });
</script>
</html>

2.2 监听器的各种配置

详见文档

  • deep
  • immediate

deepimmediate:true,<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 50px;
            height: 20px;
        }
    </style>
</head>
<body>
    <div id="root">
        <h1>{{mark.subject}}</h1>
        当前学习进度:{{mark.process}} % <br>
        输入要修改的值:<input type="text" v-model="newValue"> <button @click="changeProcess">确认</button>
    </div>
</body>
<script type="text/javascript">
    let vm = new Vue({
        el:"#root", 
        data:{
            newValue:0,
            mark:{
                subject:"Vue课程学习进度",
                process:30
            }
        },
        watch:{
            mark:{
                deep:true, //开启深度监听,即遇到对象时对象成员变化也会触发handler
                immediate:true, //开启立即执行,即刚一开始dom渲染也会被调用一次
                handler(oldV,newV){
                    if(!newV){
                        return; //把这个注释掉可以体会下有无immediate的区别
                    }
                    alert("老师修改进度为:"+ newV.process);
                }
            }
        },
        methods: {
            changeProcess(){
                this.mark.process = this.newValue;
            }
        },
    });
</script>
</html>

2.3 监听的两种简写方式

如果要使用监听的简写方式意味着你放弃了配置 immediate 和 deep 属性

就是将,原本配置对象的地方,改为一个函数,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://v2.cn.vuejs.org/js/vue.js"></script>
    <title>梦开始的地方</title>
    <style>
        input{
            width: 200px;
            height: 20px;
        }
    </style>
</head>
<body>
    <div id="root">
        输入b站视频连接: <input v-model="msg"><br>
        变化: {{info}}
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:"#root", 
        data:{
            msg:"hello", 
            info:"没变化"
        },
        watch:{
            msg(oldValue,newValue){
                this.info = `之前是${oldValue},现在是${newValue}。`;
            }
        }
    })
</script>
</html>

The More

计算属性缓存-vs-方法

计算属性-vs-侦听属性


本节完~~~~

标签:info,el,大法,Vue,bUrl,input,侦听,newValue
From: https://www.cnblogs.com/Star-Vik/p/17977092

相关文章

  • Vue3与Vue2的深度对比:你不可不知的差异!
    Vue3框架的优点特点首次渲染更快diff算法更快内存占用更少打包体积更小更好的Typescript支持CompositionAPI 组合API一、生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(CompositionAPI,下......
  • VUE框架MVVM架构思想解析与实现封装dom对象------VUE框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • vue3
    Vue31新建项目1.1vue-cli创建vue-V查看vue版本,必须高于4.5.0启动测试cdvue3_testnpmrunserve运行成功1.2vite创建命令1.3分析工程结构main.js//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数import{createApp}from'vue'......
  • 在vue2中使用leaflet.AnimatedMarker来移动某个目标
    需求是:点击某个按钮后让扫描仪沿着某条线移动进行扫描效果:  扫描仪是沿着河流移动的,河流的生成方式通过geojson数据生成,geojson里包含了河流的一些点位的经纬度,扫描仪根据经纬度来移动leaflet:1.9.4 leaflet.AnimatedMarker:1.0.0 1.引入 importLfrom'leaf......
  • 使用pnpm来管理vue项目的node_modules
    要使用pnpm,先确保nodejs版本在16以上(目前用的18.16.1)(确保本地已经全局安装了pnpm如果没有安装就使用npmi-gpnpm来全局安装)一.老项目从npm迁移到pnpm  先删掉项目中的node_modules文件夹和package-lock.json文件   在终端运行pnpmi 安装成功后根目录下会多一......
  • vue选择性显示表格列
    实现结果:打印的时候想要选择打印哪些列,可以添加一个选择列功能,选择的列就展示,不选择的不展示实现过程只需要在列上加个显示标识属性show,为true表示显示,为false表示不显示表格组件绑定列时过滤出show为true的同时循环表格列,绑定到多选框上,这样多选框不勾选列时,表格中该列就......
  • vue3 之 问题总结(一)
    Vue3官网:https://cn.vuejs.org/guide/introduction.html一、为什么要使用ref?使用ref来创建响应式数据,当你在模板中使用了一个ref,然后改变了这个ref的值时,Vue会自动检测到这个变化,并且相应地更新DOM。在标准的JavaScript中,检测普通变量的访问或修改是行......
  • Vue - 组件通信(父子单向传递、父子相互传递、祖孙隔代传递)
    父组件向子组件单向传递父组件:引入子组件后,通过属性绑定的形式,将值传入子组件;``子组件:子组件通过props接收父组件传入的值;`{{sonGetParam}}`子组件向父组件单向传递父组件:引入子组件后,自定义一个用来处理自定义事件的方法,接收子组件传递的值;``子......
  • vue validator 扩展
    ElementUIForm1.问题:有个表单里面是表格,可以提交多行数据,每一行都有计划数ItemCount需要校验,校验标准是与同一行的另一个输入框Inventory的值比较,如果ItemCount>Inventory就要有tip提示,不能用弹出框参考官网的例子密码的二次验证,但我这里又不同,我是有多行验证的,我需要传参......
  • 第32节: Vue3 方法处理程序
    在UniApp中使用Vue3框架时,你可以使用方法处理程序来定义在模板中调用的自定义函数。下面是一个示例,演示了如何在UniApp中使用Vue3框架使用方法处理程序:<template><view><button@click="handleClick">Clickme</button><p>{{message}}</p></view><......