首页 > 其他分享 >前端vue3学习记录二

前端vue3学习记录二

时间:2024-08-09 16:25:46浏览次数:16  
标签:reactive 记录 对象 前端 vue3 watch person 监视 属性

ref 和 reactive 的补充

在使用 reactive  进行对象数据的响应化时,要注意,将响应式对象分配给一个新的对象的时候,新的对象是不具有响应式性质的

function Changecar() {
 car = { brand: '红旗', price: 20000 } // 没有响应式性质
 car = reactive({ brand: '红旗', price: 20000 }) // 也没有响应式性质
 Object.assign(car, { brand: '红旗', price: 20000 }) // 利用对象的拷贝接口就可以使car仍然具有响应式的性质
}

使用 ref 对对象进行响应式时,就不会发生上述情况

function Changecar() {
// 使用ref就不会发生新对象失去响应式性质的情况
  car.value = { brand: '红旗', price: 20000 }
}

toRefs 和 toRef

toRefs 可以将一个reactive 的响应式对象转化为多个 由ref 定义的响应式对象,当将一个reactive定义的响应式对象解构时就不会丢失他的响应式式属性

let person = reactive({ name: '陈欢', age: 20 })

 let { name, age } = person
let { name, age } = toRefs(person)

toref 的使用

let person = reactive({ name: '陈欢', age: 20 })
let  n1 = ref(person, 'age')

vue3 中的computed计算属性

你可以通过computed函数来定义一个计算属性computed函数接收一个计算函数作为参数,并返回一个响应式的ref对象。下面代码中有两种computed的写法,一种是计算函数做参数的写法,另外一种是对象形式的写法

computed 计算属性以一个计算函数作为参数时,他只有只读的属性,以一个对象作为参数时,里面的 get函数是返回 计算属性的函数, 而set函数是接收一个传递给计算属性的新值

<script lang="ts" , setup>
// 引入包
import { ref, reactive, toRefs, computed } from 'vue'
let firstname = ref('陈')
let lastname = ref('欢')

 let fullname = computed(() => {
   return firstname.value.slice(0, 1).toUpperCase() + firstname.value.slice(1) + '-' + lastname.value })

// computed 计算属性中的get函数 和 set函数??
let fullname = computed({
  get() {
    return (
      firstname.value.slice(0, 1).toUpperCase() + firstname.value.slice(1) + '-' + lastname.value
    )
  },
  // val参数是什么??
  set(val) {
    const [stl1, stl2] = val.split('-')
    firstname.value = stl1
    lastname.value = stl2
  }
})

function Changename() {
  fullname.value = '徐-勇钢'
}
</script>

watch监视

vue3中的watch监视以下四种情况

1.ref 定义的数据

2. reactive 定义的数据

3. 函数返回的一个值(getter 函数)

4.一个包含上述内容的数组

1.ref 的 watch 监视基本属性 

首先,也先在 setup 中引入 watch监视包 

watch 是一个函数, 第一个参数值是你要监视的对象,第二个参数是一个回调函数,函数中的第一个形参为监视对象的新的值,第二个参数为监视对象变化之前的值,可以在回调函数中设置要进行的操作,并且注意 watch 函数 的返回只可以用来结束监视。

let sum = ref(0)
function Changesum() {
  sum.value += 1
}
let stop = watch(sum, (newvalue, oldvalue) => {
  console.log('sum的值变化了', newvalue, oldvalue)
  if (newvalue > 10) stop()
})

2.ref 的watch监视对象属性

ref监视对象时注意:ref 是一个浅层监视监视着对象的地址,只有对象发生变化才会出发监视,对象里面的属性发生变化并不会触发监视,需要在watch中加上 deep: true 来手动开启深层监视

如果修改的是对象中的属性,那么监视里面的 watch 中newvalue 参数和 oldvalue参数都是新的值,因为他们对象的地址没有发生变化

 如果修改的是整个ref 定义的对象,那么对应的newvalue参数和oldvaluea参数对应的就是新值和旧值,因为不是同一个对象了

let person = ref({ name: '陈欢', age: 20 })
function Changename() {
  person.value.name += '徐勇钢'
}
function Changeage() {
  person.value.age += 1
}
function Changeperson() {
  // Object.assign(person, { name: '徐勇', age: 30 })
  person.value = { name: '徐勇', age: 30 }
}

watch(
  person,
  (newvalue, oldvalue) => {
    console.log('person改变了', newvalue, oldvalue)
  },
  { deep: true, immediate: true }
)

 注意上述代码中加了deep 属性开启深度监视,immediate 为开启立即监视,相当于do while一样,没触发监视时,就先执行一遍watch监视里的内容

3.reactive 的watch监视对象属性

监视 reactive 定义的 对象类型数据时,默认开启深度监视且不可关闭
深度监视就是指你对象中的任何一个属性发生变化都会监视到, 相当于隐式创建深层监听
为什么监视的新值和旧值没有发生变化,因为用的是reactive ,person对象的地址一直都没有变化,你改变名字, 改变年龄,改变对象的时候都没有创建新的对象 ,person的地址一直没有发生变化

监视到对象的某个属性时,新值和旧的值就一定不一样

let person = reactive({ name: '陈欢', age: 20 })
function Changename() {
  person.name = '徐勇钢'
}
function Changeage() {
  person.age += 1
}
function Changeperson() {
  Object.assign(person, { name: '徐勇', age: 30 })
}

watch(person, (newvalue, oldvalue) => {
  console.log('person改变了', newvalue, oldvalue)
})

4.监视ref或reactive对应的对象类型数据中的某一个属性

当只想监视对象类型中的某一个属性时的情况;

监视的是对象里面的基本属性时

注意:当监视的对象里面的基本属性时,watch 监视函数里面的监视对象要写成函数式,可以简写成箭头函数的形式

let person = reactive({ name: '陈欢', 
age: 20, 
car: { first: 'su7', second: '宝马' } 
})

watch(
   () => person.name,
  (newvalue, oldvalue) => {
    console.log('person改变了', newvalue, oldvalue)
  }
)

 如上述所示,监视的是person对象里面的基本属性:name属性,所以监视对象写成箭头函数的简写形式

监视的是对象里面的对象属性, 这种情况比较复杂

 监视的是对象中的对象属性时,并没有要求一定要写成函数的形式,可以直接写要监视的对象,如:person.car, 但是这种情况的话,只有监视的对象里面的属性发生变化才会触发监视,写成函数的形式的话,() => person.car, 虽然他最大的对象时reactive 定义的响应式,但是此时只有你监视的对象的对象整体发生变化时,才会触发监视器,综上,当监视的是对象里面的一个对象属性时,监视的那个对象也尽量写成函数的形式,并且在第三个参数处加上手动开启深度监视的代码,这样你所监视的对象的对象的属性无论里面的属性改变还是整个对象改变都会监视到。

对于 写person.car 的理解:对于修改这里的属性可以触发监视器,但是当对象发生变化时,地址发生了变化,就触发不了监视器

let person = reactive({ name: '陈欢', age: 20, car: { first: 'su7', second: '宝马' } })

watch(
  // () => person.name,
  () => person.car,
  // person.car,
  (newvalue, oldvalue) => {
    console.log('person改变了', newvalue, oldvalue)
  },
  { deep: true }
)

5.上述数据的组合监视

只要以数组的方式写出要监视的对象就可以

let person = reactive({ name: '陈欢', age: 20, car: { first: 'su7', second: '宝马' } })

watch(
  
  [() => person.car, () = >person.name ],
 
  (newvalue, oldvalue) => {
    console.log('person改变了', newvalue, oldvalue)
  },
  { deep: true }
)

标签:reactive,记录,对象,前端,vue3,watch,person,监视,属性
From: https://blog.csdn.net/qq_74414570/article/details/141029314

相关文章

  • Vue3实现印章徽章组件
    1、组件结构2、组件封装src/components/StampBadge/src/StampBadge.vue文件代码<template><divclass="first-ring"v-bind="getBindValue":class="getStampBadgeClass"><divclass="second-ri......
  • Vue3水印组件
    1、组件封装<template><divref="watermarkContainerRef"class="watermark-container"><!--插槽--><slot></slot></div></template><scriptsetup>import{ref,onMounted,watc......
  • 前端面试手撕算法大全
    写在前面文末有我在前端面试多年的经验文章,分享给大家!!!防抖//防抖:n秒后在执行该事件,若在n秒内被重复触发,则重新计时//防抖(debounce)函数是指在一定时间内,事件被触发多次,只执行最后一次。这在处理诸如输入框实时搜索等场景时非常有用,避免了频繁触发事件导致性能问题......
  • 浅谈前端研发链路之构建
    前言我们每天都在说构建构建,你真的了解前端构建吗?文末有我在前端面试多年的经验文章!!!在现代前端开发中,构建过程扮演着至关重要的角色。随着Web应用变得越来越复杂,直接编写原生HTML、CSS和JavaScript已经不能满足开发需求,我们需要工程化的体系去构建前端应用。构建过......
  • 性能数据采集分析(Guider开源项目集成)(第一次发帖,用于个人经验记录)
    https://github.com/iipeace/guiderpython环境下集成guider的经验分享初始化Guider环境:步骤一:PushPython-Guider环境假设python-guider环境是一个文件夹或者压缩文件,需要将其推送到Android设备上。假设该环境位于本地路径/path/to/python-guider。adbpush/path/to......
  • 【前端】NodeJS:HTTP协议
    文章目录HTTP协议1概念2请求报文的组成3HTTP的请求行4请求头5HTTP的请求体6响应报文的组成7创建HTTP服务7.1操作步骤7.2测试7.3注意事项8浏览器查看HTTP报文8.1查看请求行和请求头8.2查看请求体8.3查看URL查询字符串8.4查看响应行与响应头8.5查看响应体......
  • 【前端】NodeJS:NodeJS模块化
    文章目录1NodeJS模块化1.1模块化与模块1.2模块化项目1.3模块化好处2模块暴露数据2.1模块初体验2.2暴露数据3导入(引入)模块4导入模块的基本流程5CommonJS规范1NodeJS模块化1.1模块化与模块将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称......
  • Vue3入门项目 简洁清晰保姆级内容讲解
    序章vue3的后台管理项目,从0到1搭建,内容非常丰富涵盖项目搭建、路由配置、用户鉴权、首页报表、用户列表、前后端联调等功能,推荐指数:5颗星!视频学习链接:vue3通用后台管理-零基础从0到1详细的入门保姆级别教程——哔哩哔哩bilibili环境配置node版本:需要Node.js版本1......
  • Vue3拖拽功能 vue-draggable-plus
    Vue拖拽功能vue-draggable-plus,支持V2和V3文章目录Vue拖拽功能vue-draggable-plus,支持V2和V3介绍VueDraggablePlus一、使用说明版本支持安装二、使用实例1.双列表拖拽2.更多拖拽效果总结介绍VueDraggablePlus最近需要pc上做拖拽功能,之前在移动端使用的是Sor......
  • 录屏方法剖析,记录脚本跑测不再难
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言很多同学在跑测过程中都希望可以不用一直盯着跑测画面,又希望可以在跑测后复核跑测结果,那么Airtest所提供的录屏方法会是很好的选择。目前该录屏方法已经......