2.3Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue进阶

Vue方法、计算属性及监听器

在vue中处理复杂的逻辑的时候,我们经常使用计算属性、方法及监听器。

  1. methods:方法:它们是挂载在Vue对象上的函数,通常用于做事件处理函数,或自己封装的自定义函数。

  2. computed:计算属性:在Vue中,我们可以定义一个计算属性,这个计算属性的值,可以依赖于某个data中

的数据。或者说:计算属性是对数据的再加工处理。

  1. watch:监听器:如果我们想要在数据发生改变时做一些业务处理,或者响应某个特定的变化,我们就可以通

过监听器,监听数据的变化,从而做出相应的反应。

computed 计算属性

计算属性是根据依赖关系进行缓存的计算,并且只在需要的时候进行更新。

<div id="app">
    原数据:{{msg}} <br>
    新数据:{{reversedMsg}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                msg: 'hello world!'
            }
        },
        computed:{
            reversedMsg(){
            // 反转操作
                return this.msg.split('').reverse().join('');
            }
        }
    }).mount('#app');
</script>

一个案例:根据商品数量修改总价

<div id="app">
    商品名称:小米手机; 数量:
    <button @click="sub">-</button>{{quantity}}<button @click="add">+</button>
    <br>
    总价:{{total}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                quantity: 1
            }
        },
        computed:{
            total(){
                return this.quantity*100;
            }
        },
        methods:{
            add(){
                this.quantity++;
            },
            sub(){
                this.quantity--;
            }
        }
    }).mount('#app');
</script>

另一个案例:对数据进行过滤处理。

<div id="app">
    {{newMoney}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                money: 1000
            }
        },
        computed:{
            newMoney(){
                return this.money + '¥';
            }
        },
    }).mount('#app');
</script>

methods 方法

在使用vue的时候,可能会用到很多的方法,它们可以将功能连接到事件的指令,甚至只是创建一个小的逻辑就像

其他函数一样被重用。接下来我们用方法实现上面的字符串反转。

<div id="app">
    {{msg}} <br>
    {{reversedMsg()}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                msg: 'hello world!'
            }
        },
        methods:{
            reversedMsg(){
                return this.msg.split('').reverse().join('');
            }
        }
    }).mount('#app');
</script>

虽然使用computed和methods方法来实现反转,两种方法得到的结果是相同的,但本质是不一样的。

计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变的时候才会重新求值,这就意味着 只要message还没有发生改变,多次访问reversedMessage计算属性立即返回的是之前计算的结果,而不会再次执 行计算函数。

而对于methods方法,只要发生重新渲染,methods调用总会执行该函数。

如果某个computed需要的遍历一个极大的数组和做大量的计算,可以减小性能开销,如果不希望有缓存,则用 methods。

watch 监听器

watch能够监听数据的改变。监听之后会调用一个回调函数。 此回调函数的参数有两个:

  1. 更新后的值(新值)

  2. 更新前的值(旧值)

监听基本数据类型

下面使用watch来监听商品数量的变化。如果商品数量小于1,就重置成上一个值。

<div id="app">
    商品名称:小米手机; 数量:
    <button @click="sub">-</button>{{quantity}}<button @click="add">+</button>
    <br>
    总价:{{total}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                quantity: 1
            }
        },
        computed:{
            total(){
                return this.quantity*100;
            }
        },
        methods:{
            add(){
                this.quantity++;
            },
            sub(){
                this.quantity--;
            }
        },
        watch:{
            quantity(newVal,oldVal){
                this.quantity = newVal<=0?oldVal:newVal;
            }
        }
    }).mount('#app');
</script>

深度监听

在上面的例子中,监听的简单的数据类型,数据改变很容易观察,但是当需要监听的数据变为对象类型的时候,上

面的监听方法就失效了,因为上面的简单数据类型属于浅度监听,对应的对象类型就需要用到深度监听,只需要在

上面的基础上加上deep: true就可以了。

<div id="app">
    商品名称:{{goods.name}}; 数量:
    <button @click="sub">-</button>{{goods.quantity}}<button @click="add">+</button>
    <br>
    总价:{{total}}
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                goods:{
                    name: '小米手机',
                    quantity: 1
                }
            }
        },
        computed:{
            total(){
                return this.goods.quantity*100;
            }
        },
        methods:{
            add(){
                this.goods.quantity++;
            },
            sub(){
                this.goods.quantity--;
            }
        },
        watch:{
            goods:{
                handler(newVal,oldVal){
                     /** 
                    * 注意:虽然使用深度监听,可以监听到对象的改变。 
                    * 但是,由于是对象类型,所以newVal与oldVal都指向同一个对象。 
                    * 所以,newVal与oldVal中的quantity都是改变后的新值。 
                    */ 
                    console.log(newVal,oldVal)
                    this.goods.quantity = newVal.quantity<=0?oldVal.quantity:newVal.quantity;
                },
                deep: true
            }
        }
    }).mount('#app');
</script>

上面代码中,由于监听的是对象类型,所以newVal与oldVal都指向同一个对象。

所以,在深度监听对象时,是不能正确获取更新前的对象和更新后的对象的。

解决方案:利用计算属性将对象变成字符串后再监听。

<div id="app">
    商品名称:{{goods.name}}; 数量:
    <button @click="sub">-</button>{{goods.quantity}}<button @click="add">+</button>
    <br>
    总价:{{total}}
</div>
<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                goods:{
                    name: '小米手机',
                    quantity: 1
                }
            }
        },
        computed:{
            total(){
                return this.goods.quantity*100;
            },
            goodsStr(){
                return JSON.stringify(this.goods);
            }
        },
        methods:{
            add(){
                this.goods.quantity++;
            },
            sub(){
                this.goods.quantity--;
            }
        },
        watch:{
            goodsStr(newVal,oldVal){
                let newGoods = JSON.parse(newVal);
                let oldGoods = JSON.parse(oldVal);
                this.goods.quantity = newGoods.quantity<=0?oldGoods.quantity:newGoods.quantity;
            }
        }
    }).mount('#app');
</script>

Vue的表单绑定

v-bind实现了数据的单向绑定,将vue实例中的数据同元素属性值进行绑定,接下来看一下vue中的数据双向绑定v-model。

v-mode实现表单绑定

<div id="app">
    <h3>注册</h3>
    <form>
        用户名:<input type="text" v-model="user.userName"><br>
        密码:<input type="password" v-model="user.password"><br>
        确认密码:<input type="password" v-model="user.beginPass"><br>
            <!-- 单选框 -->
        性别:<input type="radio" v-model="user.sex" value="0">男 
              <input type="radio" v-model="user.sex" value="1">女<br>
              <!-- 复选框 -->
        爱好:<input type="checkbox" v-model="user.like" value="0">读书
              <input type="checkbox" v-model="user.like" value="1">体育
              <input type="checkbox" v-model="user.like" value="2">旅游<br>
              <!-- 下拉选 -->
        国籍:<select v-model="user.nationality">
                  <option value="0">中国</option>
                  <option value="1">美国</option>
                  <option value="2">俄罗斯</option>
              </select><br>
           <!--   文本域 -->
        个人简介:<textarea cols="30" rows="5" v-model="user.brief"></textarea> <br>
        <!--  <button @click="reg">注册</button>-->
        <input type="button" @click="reg" value="注册">
    </form>
</div>
<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                user:{
                    userName:'',
                    password:'',
                    beginPass:'',
                    sex: 0,
                    like: [],
                    nationality: 0,
                    brief: ''
                }
            }
        },
        methods:{
            reg(){
                console.log(this.user);
            }
        }
    }).mount('#app');
</script>

v-model修饰符

v-model中还可以使用一些修饰符来实现某些功能:

  1. v-model.lazy 只有在input输入框发生一个blur时才触发,也就是延迟同步到失去焦点时。

  2. v-model.trim 将用户输入的前后的空格去掉。

  3. v-model.number 将用户输入的字符串转换成number。

<div id="app">
    {{num}} <input type="text" v-model.lazy="num"><br>
    <input type="text" v-model.trim="msg"><button @click="add">点击</button><br>
    {{num+1}} <input type="text" v-model.number="num"><br>
</div>
<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                num: '10',
                msg: 'hello'
            }
        },
        methods:{
            add(){
                console.log(this.msg)
            }
        }
    }).mount('#app');
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/589355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据之数据仓库技术:ETL工具和Kettle简介

大数据之数据仓库技术&#xff1a;ETL工具和Kettle简介 ETL简介ETL工具和KettleKettle家族 Kettle资源KettlePack 任务调度工具 ETL简介 ETL(Extract-Transform-Load): 在大数据技术领域内&#xff0c;用来描述将数据从 来源端 经过 抽取(extract), 转换(transform), 加载(loa…

cefsharp实现资源替换如网页背景、移除替换标签、html标识、执行javascript脚本学习笔记(含源码说明)

(一)实现测试(仅供学习参考) 1.1 目标系统页面(登录页)和登录后首页面中2处(一个替换一个移除) 1.2 实现后效果(使用cefsharp自定义浏览器实现以上功能) 1.3 登录后页面替换和移除 系统名称和一个功能菜单li (二)通过分析代码实现脚本编写 2.1 分开处理,设置了…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好&#xff01;今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题&#xff1a;https://leetcode.cn/problems/reverse-linked-list 1.2解…

Linux 第十八章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

一周零碎时间练习微服务(nacos,rq,springcloud,es等)内容

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

UI-Diffuser——使用生成性人工智能的UI原型设计

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

JavaEE >> Spring MVC(1)

MVC MVC&#xff1a;Model View Controller 的缩写&#xff0c;是一种软件架构模式&#xff0c;将软件系统分为模型、视图和控制器三个部分。 Mode&#xff08;模型&#xff09;&#xff1a;是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

CAMEL:大型语言模型社会的“心智”探索沟通代理

英文名称: CAMEL: Communicative Agents for “Mind” Exploration of Large Language Model Society 中文名称: CAMEL&#xff1a;大型语言模型社会的“心智”探索沟通代理 链接: https://arxiv.org/pdf/2303.17760.pdf 代码: https://github.com/camel-ai/camel 4.4K Star 作…

Scala应用 —— JDBC的创建

文章目录 Scala应用 —— JDBC的创建前言一、JDBC的创建过程1.初始化连接1.1 配置驱动1.2 创建连接对象 2. 初始化执行器2.1 创建执行器对象2.2 初始化执行器参数 3. 执行操作并返回结果 二、Scala JDBC的基本设计思路1. 操作步骤设计2. 解决结果差异化3.实现jdbc方法并输出结果…

53.HarmonyOS鸿蒙系统 App(ArkTS) socket套接字连接失败无效参数--invalid argument

ark ts socket套接字连接失败无效参数--invalid argument 绑定本机真实连接的WIFI的IP&#xff0c;不要绑定127.0.0.1

云原生Kubernetes: K8S 1.29版本 部署Harbor

目录 一、实验 1.环境 2.Linux 部署docker compose 3.证书秘钥配置 4.K8S 1.29版本 部署Harbor 5.K8S 1.29版本 使用Harbor 二、问题 1.docker 登录harbor失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.2…

Debian操作系统的常用指令介绍

Debian是一个流行的Linux操作系统&#xff0c;以其稳定性和安全性而闻名。对于Debian用户来说&#xff0c;掌握一些基本的命令行指令是非常重要的&#xff0c;因为它们可以帮助你更高效地管理系统。在这篇博客中&#xff0c;我们将介绍一些在Debian系统中常用的指令及其功能。 …

79、贪心-跳跃游戏II

思路&#xff1a; 首先理解题意&#xff1a;从首位置跳最少多少次到达末尾。 第一种&#xff1a;使用递归&#xff0c;将所有跳转路径都获取到进行求出最小值。 第二种&#xff1a;使用动态规划&#xff0c;下一次最优取决上一次的最优解 第三针&#xff1a;贪心&#xff…

区块链 | IPFS 工作原理入门

&#x1f98a;原文&#xff1a;What is the InterPlanetary File System (IPFS), and how does it work? &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络&#xff0c;但在数据存储方面&#…

智能消费记账|基于SSM+vue的大学生智能消费记账系统(源码+数据库+文档)

智能消费记账目录 基于SSMvue的大学生智能消费记账系统 一、前言 二、系统设计 三、系统功能设计 1 用户列表 2 预算信息管理 3 预算类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

R语言的学习—5—多元数据直观表示

1、数据读取 ## 数据整理 d3.1read.xlsx(adstats.xlsx,d3.1,rowNamesT);d3.1 #读取adstats.xlsx表格d3.1数据 barplot(apply(d3.1,1,mean)) #按行做均值条形图 barplot(apply(d3.1,1,mean),las3) barplot(apply(d3.1,2,mean)) #按列做均值图条形图 barplot(a…

Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析

随着万物互联&#xff0c;视频会议直播互动深入业务各方面&#xff0c;主流SFU并不适合管理&#xff0c;很多业务需要各种监控终端&#xff0c;互动SIP硬件设备&#xff0c;Web在线业务平台能相互融合&#xff0c;互联互通&#xff0c; 视频混流直播&#xff0c;录存直播推广&a…

手撕C语言题典——合并两个有序数组(顺序表)

搭配食用更佳哦~~ 数据结构之顺顺顺——顺序表-CSDN博客 数据结构之顺序表的基本操作-CSDN博客 继续来做一下关于顺序表的经典算法题叭~ 前言 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 合并数组也是力扣上关于顺序表的一道简单题&#xff0c;继续来加深…

字节缓冲流

BufferedInputStream() 该类实现缓冲流输出对象&#xff08;可以向底层输出流写入字节而不必为写入的每一个字节导致底层系统的调用&#xff09; BufferedOutputStream() 创建BufferedOutputStream()将创建一个内部缓冲数组 当从流中读取或跳过字节时&#xff0c;内部缓冲区根…
最新文章