Vue--》setup、ref、reactive函数使用讲解

news2024/9/28 23:37:21

目录

setup

ref函数

reactive函数

Vue3中的响应式原理


setup

Vue3中的一个新的配置项,值为一个函数。组件中所用到的数据、方法等等,均要配置在setup中。setup函数的两种返回值,如下:

若返回一个对象,则对象中的属性、方法、在模板中均可以直接使用。

<template>
  <div>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }} </h2> 
  </div>
  <button @click="say">say</button>
</template>
<script>
export default {
  name:'MyApp',
  setup(){
    let name = '张三'
    let age = 18

    function say(){
      let str = `我的名字是${name},我的年龄是${age}`
      alert('hello workd'+str);
    }
    // 返回一个对象
    return {
      name,age,say
    }
  }
}
</script>

若返回一个渲染函数,则可以自定义渲染内容。

<script>
import {h} from 'vue'
export default {
  name:'MyApp',
  setup(){
    // 返回一个函数(渲染函数)
    return ()=> h('h1','渲染函数')
  }
}
</script>

<template>
  <div>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }} </h2>
    <h2>性别:{{ sex }} </h2>
    <h2>身高:{{ height }} </h2>
  </div>
  <button @click="showData">Vue2中打印showData</button><br><br>
  <button @click="showSetup">Vue3中打印showSetup</button>
</template>
<script>
export default {
  name: 'MyApp',
  // data能与setup进行搭配使用
  data () {
    return {
      sex: '男',
      height: '175'
    }
  },
  methods:{
    // Vue2中能访问到Vue3中的数据
    showData(){
      console.log('打印data数据里能访问到的数据');
      console.log(this.sex);
      console.log(this.height);
      console.log(this.name);
      console.log(this.age);
    }
  },
  setup () {
    let name = '张三'
    let age = 18
    // Vue3中不能访问到Vue2中的数据
    function showSetup () {
      console.log('打印setup数据里能访问到的数据');
      console.log(name);
      console.log(age);
      console.log(this.sex);
      console.log(this.height);
    }
    // 返回一个对象
    return {
      name, age, showSetup
    }
  }
}
</script>

注意

1)尽量不要与Vue2.x配合使用:

Vue2.x配置(data、methods、computed...)中可以访问到setup中的属性和方法,但在setup中不能访问到Vue2.x配置(data、methods、computed...),如果有重名,setup优先。

2)setup不能是一个async函数,因为返回值不再是return的对象,而是promise,模板看不到return对象中的属性。

3)setup执行的时机

在beforeCreate之前执行一次,this是undefined。

4)setup的参数

props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。

context: 上下文对象

attrs:值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性,相当this.$attrs

slots:收到的插槽内容,相当于this.$slots

emit:分发自定义事件的函数,相当于this.$emit

ref函数

定义一个响应式的数据,其语法为:const xxx = ref(initValue)。创建一个包含响应式数据的引用对象,在JS中操作数据为 xxx.value,而在模板中读取数据不需要 .value,直接<div>{{xxx}}</div>

<template>
  <div>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }} </h2>
    <h2>工作:{{ obj.type }}</h2>
    <h2>薪资:{{ obj.salary }}</h2>
  </div>
  <button @click="change">修改信息</button>
</template>
<script>
import {ref} from 'vue'
export default {
  name: 'MyApp',
  setup () {
    // 数据
    const name = ref('张三')
    const age = ref(18)
    const obj = ref({
      type:'前端工程师',
      salary:'30k'
    })
    // 修改信息函数
    function change(){
      name.value = '李四'
      age.value = 20
      obj.value.type = 'UI工程师'
      obj.value.salary = '20k'
    }
    // 返回一个对象
    return {
      name,age,obj,change
    }
  }
}
</script>

注意

接收的数据可以是:基本类型、也可以是对象类型。

基本类型的数据:响应式依然是靠Object.defineProperty()的get和set完成的。

对象类型的数据:内部求助了Vue3的一个新函数——reactive函数

reactive函数

定义一个对象类型的响应式数据(基本类型不要用它,用ref函数)。reactive定义的响应式数据是深层次的,内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作。其语法格式为:const 代理对象 = reactive(源对象) 。接收一个对象(或数组),返回一个代理对象(proxy对象)。

<template>
  <div>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }} </h2>
    <h2>工作:{{ person.job.type }}</h2>
    <h2>薪资:{{ person.job.salary }}</h2>
    <h2>爱好:{{ person.hobby }}</h2>
  </div>
  <button @click="change">修改信息</button>
</template>
<script>
import {reactive} from 'vue'
export default {
  name: 'MyApp',
  setup () {
    // 数据
    const person = reactive({
      name:'张三',
      age:18,
      job:{
        type:'前端工程师',
        salary:'30k'
      },
      hobby:['抽烟','喝酒','烫头']
    })
    // 修改信息函数
    function change(){
      person.name = '李四'
      person.age = 20
      person.job.type = 'UI工程师'
      person.job.salary = '20k'
      person.hobby[0]='学习'
    }
    // 返回一个对象
    return {
      person,change
    }
  }
}
</script>

reactive和ref的对比

从定义数据角度对比:

ref用来定义:基本类型数据。

reactive用来定义:对象(或数组)类型数据。

备注: ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象

从原理角度对比:

ref通过 object.defineProperty()的get与set来实现响应式(数据劫持)。

reactive通过使用Proxy来实现响应式(数据劫持)﹐并通过Reflect操作源对象内部的数据。

从使用角度对比:

ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value

reactive定义的数据:操作数据与读取数据:均不需要.value。

Vue3中的响应式原理

在Vue2.x的响应式中,其实现原理为:

对象类型:通过object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

object.fineProperty(data,'count',{
    get(){},
    set(){}
})

存在问题

新增属性、删除属性页面不会更新。

直接通过下标修改数组,界面不会自动更新。

<template>
  <div>
    <h2 v-show="person.name">姓名:{{person.name}}</h2>
    <h2>年龄:{{person.age}}</h2>
    <h2 v-show="person.sex">性别:{{person.sex}}</h2>
    <button @click="addSex">添加性别</button>
    <button @click="delName">删除姓名</button>
  </div>
</template>

<script>
import Vue from 'vue'
export default {
  name:'MyApp',
  data(){
    return {
      person:{
        name:'张三',
        age:18,
      }
    }
  },
  methods:{
    addSex(){
      // this.$set(this.person,'sex','女')
      // 也可以用如下方式
      Vue.set(this.person,'sex','女')
    },
    delName(){
      this.$delete(this.person,'name')
    }
  }
}
</script>

在Vue3.x的响应式中,其实现原理为:

通过 Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写、属性的添加、属性的删除

通过Reflect(反射):对被代理对象的属性进行操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Docker快速搭建Hfish蜜罐

HFish简介 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能…

源码讲解ThreadLocal父子线程通信问题(图+文+源码)

1 缘起 在复习ThreadLocal相关应用的知识&#xff0c; 有一个老生常谈的问题&#xff1a;父子线程通信&#xff0c; 起初&#xff0c;对于父子线程通信&#xff0c;仅了解ThreadLocal无法通过子线程获取线程数据&#xff0c; 并不了解为什么会这样&#xff1f;以及为什么Inher…

15.4 宏任务和微任务

宏任务和微任务 start 如果彻底理解了事件循环&#xff0c;其实大多数 JS 执行的逻辑都能理解了但是在 ES6 中引入了 Promise, 就引出了两个新概念&#xff0c;宏任务和微任务。 1.宏任务和微任务 1.1 名词 宏任务&#xff1a;macrotask 微任务&#xff1a;microtask 在 E…

异构操作系统的“融合计算”

这些年&#xff0c;由随着应用场景日益丰富和多样化&#xff0c;计算工作越来越复杂&#xff0c;传统的计算方式&#xff08;单机计算/分布式计算&#xff09;已经不能满足&#xff0c;需要一种新的更强大的计算模式来解决这些问题&#xff0c;这是融合计算产生的背景。 …

117.(leaflet之家)leaflet空间判断-点与geojson面图层的空间关系(turf实现)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

Linux系统下的服务管理

文章目录Linux系统下的服务管理1.基本介绍2.service管理指令3.chkconfig指令4.systemctl管理指今4.1.基本语法4.2.systemctl设置服务的自启动状态4.3.防火墙实验案例4.4.防火墙Linux系统下的服务管理 1.基本介绍 服务(service) 本质就是进程&#xff0c;但是是运行在后台的&a…

软考高项(信息系统项目管理师)经验分享

文章目录前言考试过程第一步&#xff1a;日常刷选择题第二步&#xff1a;考前一个月之前刷完精讲课第三步&#xff1a;计算题统一学习第四步&#xff1a;论文早准备第五步&#xff1a;反复刷冲刺视频第六步&#xff1a;刷近几年真题第七步&#xff1a;准备几份考试当天复习资料…

vue组件之间的数据传递和组件的生命周期

一、组件之间的通信1、组件之间的关系&#xff1a;父子关系、兄弟关系、跨级关系2、父子组件之间的通信&#xff08;数据传递&#xff09;&#xff1a;&#xff08;1&#xff09;父组件 ——-> 子组件&#xff1a;使用propsA、第一步&#xff1a;在父组件中使用子组件时&…

【K哥爬虫普法】大数据风控第一案:从魔蝎科技案件判决,看爬虫技术刑事边界

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

线段树 - 从入门到入土

普通线段树 线段树是什么 我们要学习线段树&#xff0c;首先要了解线段树的结构长什么样。 线段树是一颗二叉树&#xff0c;树上的节点储存数据&#xff08;可以是值、字符串、数组、多个值&#xff09;。 作用 一般来说&#xff0c;线段树是用来维护一个数组的。 数据储…

手写RPC框架02-路由模块设计与实现

源码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v3 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现 为什么需要路由模块&#xff1f; 在当今互联网日益发展的情况下&#xff0c;我们一个服务一般都会部署多个&#xff0c;一方…

Python绘制表白代码,又是一个表白神器

前言 嗨呀&#xff0c;又是我&#xff0c;又给你们带来了表白的代码 之前发了那些 照片里面加文字的…还有烟花…还有跳动爱心…emm你们也可以去看看哦 今天带来的这个&#xff0c;也是很不错哦 只不过它出来的有些慢&#xff0c;我这里先给你们看看这个效果图吧 效果展示…

大数据基础平台搭建-(三)Hadoop集群HA+Zookeeper搭建

大数据基础平台搭建-&#xff08;三&#xff09;Hadoop集群HAZookeeper搭建 大数据平台系列文章&#xff1a; 1、大数据基础平台搭建-&#xff08;一&#xff09;基础环境准备 2、大数据基础平台搭建-&#xff08;二&#xff09;Hadoop集群搭建 3、大数据基础平台搭建-&#xf…

如何让小型云台机械手实现按颜色分拣物品?

1. 功能说明 在小型云台机械手附近设置一个工作台&#xff0c;并安装一个TCS3200颜色识别传感器。将红色、蓝色工件分别放置在传感器上&#xff0c;如果检测的物料的颜色为红色&#xff0c;机械臂将物体放在机械臂的左侧&#xff0c;如果检测的物料的颜色为蓝色&#xff0c;机械…

数据结构与算法-希尔排序、归并排序

目录​​​​​​​ 希尔排序 1.算法描述 2.算法的实现 归并排序 4.1算法描述 2.算法实现 希尔排序 1.算法描述 1959年shell发明&#xff0c;第一批突破O&#xff08;n2&#xff09;时间复杂度的排序算法&#xff0c;是简单插入排序的改进版。它与插入之处在于&#xff0…

Android 深入系统完全讲解(二)

操作系统 操作系统是一套软件&#xff0c;它的任务就是为上层开发的用户&#xff0c;提供一个更方便的开发环境&#xff0c;同时 让硬件连接到系统中&#xff0c;能够非常方便&#xff0c;从而提高开发速度&#xff0c;以及稳定可靠。 操作系统就是这么存在的。 我们理解它&am…

基于低代码平台构筑金融行业IT运维服务体系

我今天分享题目是《基于低代码平台&#xff0c;构筑金融行业的IT运维服务体系》。这是一个大家不太熟悉的领域&#xff0c;首先它的行业是金融&#xff0c;其次它做的事情是IT运维。 关于金科信息 我先介绍一下金科信息。金科信息在1993年成立&#xff0c;到明年我们就整整30…

前端开发技术栈(插件篇):datatables

一、Datatables介绍 官网地址&#xff1a;https://datatables.net/ DataTables中文网&#xff1a;http://datatables.club/ 1、Datatables是一款jquery表格插件。它是一个高度灵活的工具&#xff0c;可以将任何HTML表格添加高级的交互功能。 2、分页&#xff0c;即时搜索和排序…

【Bootstrap】可复用的组件

目录 一、字体图标 二、下拉菜单 1. 步骤 2. 对齐 3. 分割线 4. 禁用的菜单项 三、按钮组 1. 按钮组 2. 按钮工具栏 3. 尺寸 4. 嵌套 5. 垂直排列 四、输入框组 1. 输入框组 2. 尺寸 3. 作为额外元素的按钮 4. 作为额外元素的按钮式下拉菜单 一、字体图标 组件…

55、MySOL数据库

目录 一、MySQL安装和配置 二、数据库 三、表 四、数据库的C [create] R [read] U [update] D [delete] 语句 1、insert语句 2、update语句 3、delete语句 4、select语句 五、Mysql常用数据类型&#xff08;列类型&#xff09;&#xff1a;​编辑 六、函数 *合计 / 统计…