全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
辅助文档:HTML标签大全(实时更新)

本文继续介绍数据绑定、计算属性和比较重要的watch监视

文章目录

  • 一、单向绑定和双向绑定
      • 单向绑定
      • 双向绑定
  • 二、计算属性
      • 基本示例
  • 三、Watch监视数据
    • 1.作用范围
    • 2.watch的写法(基本类型)
    • 3.如何停止监视
    • 4.watch监视对象类型
      • 1)监视对象
      • 2)监视对象的属性
      • 3)监视reactive对象

一、单向绑定和双向绑定

单向绑定

<template>
    <div class = "style_test">
    姓:  <input type = "text" :value="xin">  <br>
    名:  <input type = "text" :value="ming">  <br>
    全名:<input type = "text">
   </div>
</template>

<script>
  export default{
    name : 'Test',//组件名
    }
</script>

<script setup>
    import {ref} from 'vue'
    import {reactive} from 'vue'
    let xin = ref('张')
    let ming = ref('三')
</script>
<style>
  .style_test{
       background-color: rgb(72, 138, 166);
       box-shadow: 0 0 10px;
       border-radius:10px;
       padding: 20px;
  }
</style>

通过:value=“变量”,我们可以实现单向绑定,即数据可以由我设置好的变量流向页面。

但是当我们修改文本框之后,我们xin和ming是不会发生改变的 。

双向绑定

把:model改成v-model即可

<template>
    <div class = "style_test">
    姓:  <input type = "text" v-model="xin">  <br>
    名:  <input type = "text" v-model="ming">  <br>
    全名:<span>{{xin}}{{ming}}</span>
   </div>
</template>

双向绑定后就可以实时渲染修改的数据了。你在文本框里改数据,变量的值会立刻发生变化。

目前需求简单,你写 全名:<span>{{xin}}{{ming}}</span>倒也没什么,但是这个对象很难维护,比如,我需要中文转为拼音,那就解决不了了,所以我们要引入计算属性。

二、计算属性

我们先引入import {computed} from vue
为了解决刚刚上述的问题,如果我们可以写一个函数,进行一系列操作,最后返回我们想要的,那就方便了。

基本示例

<template>
    <div class = "style_test">
    姓:  <input type = "text" v-model="xin">  <br>
    名:  <input type = "text" v-model="ming">  <br>
    全名:<span>{{fullname}}</span> <br>
    <button @click="changename">改名为李四</button>
   </div>
</template>

<script>
  export default{
    name : 'Test',//组件名
    }
</script>

<script setup>
    import {computed, ref} from 'vue'
    import {reactive} from 'vue'
    let xin = ref('张')
    let ming = ref('三')
    let fullname = computed({
        get(){  //读取时调取
            
            return xin.value+ming.value
        },
        set(source_data){  //设置时调取
          const [str1,str2] =  source_data.split('-')
          xin.value = str1
          ming.value = str2
        }
    })
    function changename(){
        fullname.value = '李-四'
    }
</script>

<style>
  .style_test{
       background-color: rgb(72, 138, 166);
       box-shadow: 0 0 10px;
       border-radius:10px;
       padding: 20px;
  }
</style>

接下来进行代码的讲解

首先,我们要先用computed函数,来构造个名字为fullname的计算属性。
然后我们要设置一个get函数和一个set函数。get函数会在每次要用到fullname的时候自动执行,返回值即其获得的值。
同理,在后续代码中修改fullname.value的时候,会自动调用set函数

比如这个修改,set函数的source_data 就会接收到’李-四’的值,然后根据-切分这个字符串,然后分别赋值给xin和ming。这样,再次调用fullname的时候,调用get函数的时候,就是更新后的值了,效果如图。


计算属性算出来的也是一个ref的响应式数据

三、Watch监视数据

import {watch} from 'vue'

1.作用范围

watch只能监视以下数据:
1.ref和reactive定义的数据
2.函数的返回值
3.一个包含以上内容的数组

2.watch的写法(基本类型)

语法是这样的watch(监视谁?, 监视到了要干嘛?)
一个代码示例如下:

<template>
    <div class = "style_test">
        
     <h2>和为:{{sum}}</h2>
     <button @click="add_sum">sum+1</button>
     <h2>{{counter}}</h2>
   </div>
</template>
<script setup>
    import {ref,watch} from 'vue'
    let sum = ref(0)
    let counter = ref(0)
   function add_sum(){
    sum.value += 1
   }

   watch(sum,() =>{
      counter.value+=1
   })
   
</script>


如图,每次sun发生变化,就会自动执行watch函数中的回调函数。
注,在watch的时候,不需要加.value

3.如何停止监视

watch函数是由返回值的,返回一个停止监视的函数。我们用一个函数去接收他,然后在需要停止的时候调用即可。

   const stpw = watch(sum,() =>{
      counter.value+=1
      if(counter.value>=10){stpw()}
   })  


如此写代码,在counter大于10之后就不监视了。

4.watch监视对象类型

1)监视对象

如果在监视里写类名,那么只有对象指向的地址发生改变的时候才会监视到。

<template>
    <div class = "style_test">       
     <h2>age为:{{person.age}}</h2>
     <h2>name为:{{person.name}}</h2>
     <button @click="add_name">age+1</button>
     <button @click="change_person">换人</button>
     <h2>age:{{counter}}</h2>
     <h2>对象:{{counter2 }}</h2>
   </div>
</template>

<script>
    export default {
        name : 'Test'//组件名
    }
</script>

<script setup>
    import {ref,watch} from 'vue'
    
    let person=ref({
      name : 'TTTi9er',
      age : 18
    })
    let counter = ref(0)
    let counter2 = ref(0)
   function add_name(){
    person.value.age += 1
   }

   const stpw = watch(person.age,() =>{
      counter.value+=1
      if(counter.value>=10){stpw()}

   })
   const stpw2 = watch(person,() =>{
      counter2.value+=1
      if(counter.value>=10){stpw2()}

   })
   function change_person(){
    person.value ={name : '张三',
                   age  : 100}
   }
</script>

<style>
  .style_test{
       background-color: rgb(72, 138, 166);
       box-shadow: 0 0 10px;
       border-radius:10px;
       padding: 20px;
  }
</style>

2)监视对象的属性

想要监视对象的属性,我们需要使用watch的第三个参数来开启深度监视。

   const stpw = watch(person,() =>{
      counter.value+=1
      if(counter.value>=10){stpw()}
    },{deep : true})

这样不论是对象,还是对象的属性发生变化,都可以监视到。
据说还有可以监视特定对象的方法,参考链接,笔者亲测无效,如果有佬知道麻烦告知。

3)监视reactive对象

rective,默认是深度监视的,而且无法关闭

<template>
    <div class = "style_test">       
     <h2>age为:{{person.age}}</h2>
     <h2>name为:{{person.name}}</h2>
     <button @click="add_name">age+1</button>
     <button @click="change_person">换人</button>
     <h2>age:{{counter}}</h2>
     <h2>对象:{{counter2 }}</h2>
   </div>
</template>

<script>
    export default {
        name : 'Test'//组件名
    }
</script>

<script setup>
    import {reactive,watch,ref} from 'vue'
    
    let counter= ref(0)
    let counter2= ref(0)
    let person=reactive({
      name : 'TTTi9er',
      age : 18
    })

   function add_name(){
    person.age += 1
   }

   const stpw = watch(person,() =>{
      counter.value+=1
      if(counter.value>=10){stpw()}
    },{deep : true})

   const stpw2 = watch(person,() =>{
      counter2.value+=1
      if(counter2.value>=10){stpw2()}

   })

   function change_person(){
    Object.assign(person,{name:'李四',
                          age:100
    })
   }

</script>

<style>
  .style_test{
       background-color: rgb(72, 138, 166);
       box-shadow: 0 0 10px;
       border-radius:10px;
       padding: 20px;
  }
</style>

监视的操作没区别,基本只有.value的差别。

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

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

相关文章

【JVM】从硬件层面和应用层面的有序性和可见性,到Java的volatile和synchronized

Java的关键字volatile保证了有序性和可见性&#xff0c;这里我试着从底层开始讲一下有序性和可见性。 一&#xff0c;一致性 数据如果同时被两个cpu读取了&#xff0c;如何保证数据的一致性&#xff1f;或者换句话说&#xff0c;cpu1改了数据&#xff0c;cpu2的数据就成了无效…

esp32-cam 1. 出厂固件编译与测试

0. 环境 - ubuntu18 - esp32-cam - usb转ttl ch340 硬件连接 esp32-camch340板子U0RTXDU0TRXDGNDGND5V5V 1. 安装依赖 sudo apt-get install vim sudo apt install git sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial p…

【Linux】awk命令学习

最近用的比较多&#xff0c;学习总结一下。 文档地址&#xff1a;https://www.gnu.org/software/gawk/manual/gawk.html 一、awk介绍二、语句结构1.条件控制语句1&#xff09;if2&#xff09;for3&#xff09;while4&#xff09;break&continue&next&exit 2.比较运…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起&#xff1a;因为工作需要&#xff0c;编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统&#xff0c;偶尔还是有必须要用WINDOWS的时候&#xff0c;于是也安装了WIN10。 双系…

软件应用开发安全设计指南

1.1 应用系统架构安全设计要求 设计时要充分考虑到系统架构的稳固性、可维护性和可扩展性&#xff0c;以确保系统在面对各种安全威胁时能够稳定运行。 在设计系统架构时&#xff0c;要充分考虑各种安全威胁&#xff0c;如DDoS攻击、SQL注入、跨站脚本攻击&#xff08;XSS&…

2022 亚马逊云科技中国峰会,对话开发者论坛

目录 前言 最近整理资料发现还有一些前 2 年的内容没发出来&#xff0c;故补发记录&#xff0c;每年都有新的感悟。 开发者论坛 1. 你认为什么是开发者社区&#xff0c;如何定义一个成功的开发者社区&#xff1f; 我认为可以把开发者社区看成一个 “产品” 来对待&#xff…

SpringBoot @DS注解 和 DynamicDataSource自定义实现多数据源的2种实现方式

前言 在实际的项目中&#xff0c;我们经常会遇到需要操作多个数据源的情况&#xff0c;SpringBoot为我们提供了多种实现多数据源的方式。本文将介绍两种常见的方式&#xff1a;使用DS注解实现多数据源的切换以及使用DynamicDataSource自定义实现多数据源的切换。 我们将分别介…

【Unity】在空物体上实现 IPointerClickHandler 不起作用

感谢Unity接口IPointerClickHandler使用说明_哔哩哔哩_bilibiliUnity接口IPointerClickHandler使用说明, 视频播放量 197、弹幕量 0、点赞数 3、投硬币枚数 2、收藏人数 2、转发人数 0, 视频作者 游戏创作大陆, 作者简介 &#xff0c;相关视频&#xff1a;在Unity多场景同时编辑…

扩散模型(Diffusion Model)概述

扩散模型&#xff08;Diffusion Model&#xff09;是图像生成模型的一种。有别于此前 AI 领域大名鼎鼎的 GAN、VAE 等算法&#xff0c;扩散模型另辟蹊径&#xff0c;其主要思想是一种先对图像增加噪声&#xff0c;再逐步去噪的过程&#xff0c;其中如何去噪还原图像是算法的核心…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

根据往年的安排&#xff0c;2024年上海市小学生古诗文大会预计还有一个月就将启动。我们继续来随机看10道往年的上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每道题我都提供了参考答案和独家解析。 根据往期的经验&#xff0c;只…

pg数据库学习知识要点分析-1

知识要点1 对象标识OID 在PostgreSQL内部&#xff0c;所有的数据库对象都通过相应的对象标识符&#xff08;object identifier&#xff0c;oid&#xff09;进行管理&#xff0c;这些标识符是无符号的4字节整型。数据库对象与相应oid 之间的关系存储在对应的系统目录中&#xf…

如何使用 Node.js 开发一个文件上传功能?

在 Node.js 中实现文件上传功能可以通过多种方式完成&#xff0c;但其中最常用的方法之一是使用 Express 框架和 Multer 中间件。Express 是一个流行的 Node.js Web 框架&#xff0c;而 Multer 是一个用于处理文件上传的中间件。 步骤 1: 准备工作 首先&#xff0c;确保你已经…

基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

数字旅游以科技创新为核心竞争力:推动旅游服务的智能化、高效化,满足游客日益增长的旅游需求

一、引言 随着科技的飞速发展&#xff0c;数字旅游作为旅游业与信息技术结合的产物&#xff0c;正以其独特的魅力改变着传统旅游业的格局。科技创新作为数字旅游的核心竞争力&#xff0c;不仅推动了旅游服务的智能化、高效化&#xff0c;更满足了游客日益增长的旅游需求。本文…

HIVE数据导出

HIVE数据导出 1.INSERT OVERWRITE LOCAL DIRECTORY "路径" SELECT 查询语句; INSERT OVERWRITE LOCAL DIRECTORY "/usr/local/soft/hive-3.1.2/data/output" select * from learn2.partition_student6; 导出数据时 通过执行MapReduce任务导出到本地文件系统…

Python安装win32api

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

【云原生】Docker 实践(二):什么是 Docker 的镜像

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

【neteq】tgcall的调用

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

Git可视化工具tortoisegit 的下载与使用

一、tortoisegit 介绍 TortoiseGit 是一个非常实用的版本控制工具&#xff0c;主要用于与 Git 版本控制系统配合使用。 它的主要特点包括&#xff1a; 图形化界面&#xff1a;提供了直观、方便的操作界面&#xff0c;让用户更易于理解和管理版本控制。与 Windows 资源管理器…