【vue3】12-Vue 3中的Composition Api(二)

news2024/11/16 16:01:13

Vue3 - composition Api

  • setup中的函数
    • (1)computed函数使用
    • (2)setup获取元素或组件
    • (3)组件的生命周期函数
    • (4)provide/inject函数(了解)
    • (5)watch/watchEffect
    • (6)script setup语法(重要)

setup中的函数

(1)computed函数使用

在前面我们讲解过计算属性computed:当我们的某些属性是依赖其他状态时,我们可以使用计算属性来处理

  • 在前面的Options API中,我们是使用computed选项来完成的;
  • 在Composition APl中,我们可以在setup 函数中使用computed方法来编写一个计算属性

如何使用computed呢?

  • 方式一:接收一个getter函数,并为getter函数返回的值,返回一个不变的ref对象;
  • 方式二:接收一个具有get和set的对象,返回一个可变的(可读写) ref对象;

方式一示例:

<template>
    <div class="app">
        <h2>{{ fullNmae }}</h2>
    </div>
</template>
   
<script>
import { reactive, computed } from 'vue';
export default {
    setup() {
        // 1.定义数据
        const names = reactive({
            firstName: "kobe",
            lastName: "bryant"
        })

        const fullNmae = computed(() => {
            return names.firstName + " " + names.lastName

        })

        return {
            fullNmae,
        }
    }
}
</script>
   

方式二示例:

setup() {
  const name = reactive({
    firstName: "kobe",
    lastName: "Bryant"
  })

  // 既有getter函数又有setter函数, 需要传入一个对象作为参数
  const fullName = computed({
    // set函数 会返回一个可变的ref对象
    set: newValue => {
      const names = newValue.split(" ")
      name.firstName = names[0]
      name.lastName = names[1]
    },
    get: () => {
      return name.firstName + " " + name.lastName
    }
  })

  // 因为返回的是ref对象, 所以通过fullName.vlue设置fullName的值
  fullName.value = "aaa bbb"

  return {
    fullName
  }
}

(2)setup获取元素或组件

在setup中,禁用this,如何使用ref获取元素或组件呢?

ref在setup中的使用:

  • 只需要定义一个ref对象绑定到元素或者组件的ref属性上即可;

使用示例:

<template>
    <!-- 1.获取元素 -->
    <h2 ref="titleRef">我是标题</h2>
    <button ref="btnRef">按钮</button>
    <hr>

    <!-- 2.获取组件实例 -->
    <ShowInfo ref="showinfoRef"></ShowInfo>
</template>

<script>
import { onMounted, ref } from "vue";
import ShowInfo from './ShowInfo.vue'

export default {
    // 之前获取元素的做法
    // mounted(){
    //     console.log(this.$refs.title);
    //     console.log(this.$refs.button);
    // },

    components: {
        ShowInfo
    },
    setup() {
    	//定义ref对象并绑定元素或组件上的ref属性
        const titleRef = ref()
        const btnRef = ref()
        const showinfoRef = ref()

        // mounted的生命周期函数
        onMounted(() => {
            console.log(titleRef.value);
            console.log(btnRef.value);
            console.log(showinfoRef.value);
            showinfoRef.value.showinfoSum()
        })

        return {
            titleRef,
            btnRef,
            showinfoRef
        }
    }
}
</script>

(3)组件的生命周期函数

我们前面说过setup 可以用来替代data,methods、computed等等这些选项,也可以替代生命周期钩子

那么setup中如何使用生命周期函数呢?

  • 可以使用直接导入的onX函数注册生命周期钩子;

以前的生命周期和composition API中的生命周期钩子对比图:

在这里插入图片描述
我们发现beforeCreat和created两个生命周期钩子在setup中没有对应的hook,官方给出的解释如下:

在这里插入图片描述

(4)provide/inject函数(了解)

事实上我们之前还学习过Provide和Inject,Composition API也可以替代之前的Provide和 Inject的选项。
我们可以通过provide来提供数据:

  • 可以通过provide方法来定义每个 Property;

provide可以传入两个参数:

  • name:提供的属性名称;
  • value:提供的属性值;
import { provide } from 'vue'

export default {
  setup() {
    // 将导出数据设置为响应式
    const name = ref("chenjg")
    const age = ref(20)

    provide("name", name)
    provide("age", age)
  }
}

在后代组件中可以通过 inject 来注入需要的属性和对应的值:

inject可以传入两个参数:

  • inject 的 property 的 name;
  • 默认值;
setup() {
  const name = inject("name", "默认值")
  const age = inject("age")

  return {
    name,
    age
  }
}

(了解即可,在vue2中多使用vueX,vue3中使用pinia来进行复杂在数据管理)

(5)watch/watchEffect

在前面的Options API中,我们可以通过watch选项来侦听data或者props的数据变化,当数据变化时执行某一些操作。

在Composition APl中,我们可以使用watchEffect和watch来完成响应式数据的侦听;

  • watchEffect:用于自动收集响应式数据的依赖;
  • watch:需要手动指定侦听的数据源;

watch的使用:

watch的API完全等同于组件watch选项的Property:

  • watch需要侦听特定的数据源,并且执行其回调函数;
  • 默认情况下它是惰性的,只有当被侦听的源发生变化时才会执行回调;
setup() {
  let message = ref("hello world")

  watch(message, (oldValue, newValue) => {
    console.log(oldValue, newValue)
  })

  function btnClick() {
    message.value = "oooooo"
  }

  return {
    message,
    btnClick
  }
}

侦听器还可以使用数组同时侦听多个源:

setup() {
  let message = ref("hello world")
  const name = ref("kobe")

  watch([message, name], (oldValue, newValue) => {
    console.log(oldValue, newValue)
  })

  function btnClick() {
    message.value = "oooo"
    name.value = "sevgilid"
  }

  return {
    message,
    btnClick,
    name
  }
}

额外补充:

在这里插入图片描述

watchEffect的使用

当侦听到某些响应式数据变化时,我们希望执行某些操作,这个时候可以使用watchEffect

我们来看一个案例:

  • 首先,watchEffect传入的函数会被立即执行一次,并且在执行的过程中会收集依赖;
  • 其次,只有收集的依赖发生变化时,watchEffect传入的函数才会再次执行;
setup() {
  let message = ref("hello world")
  const name = ref("kobe")

  watchEffect(() => {
    console.log("wactchEffect执行", message.value, name.value)
  })
}

watchEffect的停止侦听:

当侦听某些响应式数据变化,我们希望执行某些操作时,比如停止侦听,这个时候我们可以获取watchEffect的返回值函数,调用该函数即可。

  • 比如在下面的案例中,我们counter达到10的时候就停止侦听:
    setup() {
        const counter = ref(0)
        // 当侦听某些响应式数据变化,我们希望执行某些操作时,这时候可以使用watchEffect
        //1. watcheffect传入的函数会立即执行一次,并且在执行过程中会收集依赖
        const stopWatch = watchEffect(() => {
            console.log("-------", counter.value);
        //2. 当依赖发生变化时,函数会再次执行
            // 判断counter.value>=10 停止监听
            if (counter.value >= 10) {
                stopWatch()
            }
        })
        return {
            counter
        }
    }

(6)script setup语法(重要)

基本使用:

< script setup > 是在单文件组件(SFC)中使用组合式API的编译时语法糖,当同时使用SFC与组合式APl时则推荐该语法。

  • 更少的样板内容,更简洁的代码;
  • 能够使用纯 Typescript声明prop和抛出事件;
  • 更好的运行时性能;
  • 更好的IDE类型推断性能;

使用这个语法,需要将setup attribute添加到< script >代码块上:

在这里插入图片描述

里面的代码会被编译成组件setup()函数的内容:

  • 这意味着与普通的< script >只在组件被首次引入的时候执行一次不同;
  • < script setup >中的代码会在每次组件实例被创建的时候执行。

顶层的绑定会被暴露给模板

当使用< script setup >的时候,任何在< script setup >声明的顶层的绑定(包括变量,函数声明,以及import引入的内容)都能在模板中直接使用:

<script setup>

// 1.所有编写在顶层的代码,都是默认暴露给template可以使用
import { onMounted, ref } from "vue";
import ShowInfo from "./ShowInfo.vue";

// 2.定义响应式数据
const message = ref("hello world")

// 3.定义函数
function changeMessage() {
    message.value = "message已被改变"
}

function infobtnClick(payload) {
    console.log("监听到showinfo内部的点击:", payload);
}

const ShowInfoRef = ref()
onMounted(() => {
    ShowInfoRef.value.foo()
})

</script>
    <!-- script放中间和顶部都可以:但放在上面可以使template和css编辑距离较近 -->

导入的组件直接使用

<template>
  <div class="app">
    <!-- 引入子组件同样直接使用 -->
    <show-info />
  </div>
</template>

<script setup>
  // 引入子组件, 无需注册, 引入即可使用
  import ShowInfo from "./ShowInfo.vue"
  }
</script>


defineProps() 和 defineEmits()

为了在声明props和emits 选项时获得完整的类型推断支持,我们可以使用defineProps和defineEmits API,它们将自动地在< script setup >中可用:

(1) 如果父组件需要向子组件传递传递属性, 接收时需要用到defineProps()方法
(2)子组件发送事件就需要defineEmits()方法

代码示例:

<template>

<div>showinfo:{{ name }} - {{ age }}</div>
<button @click="showInfoBtnClick">showinfoButton</button>
</template>

<script setup>
    // 不使用语法糖的scrip标签里接收父组件传参时使用props{}
    // 使用语法糖时,定义props时使用defineProps()函数
    defineProps({
        name:{
            type:String,
            default:"无名氏"
        },
        age:{
            type:Number,
            default:0
        }
    })

    // 发送事件
    // 以前:emmits:[""]
    const emits = defineEmits(["infoClick"])
    function showInfoBtnClick(){
        emits("infoClick","showinfo内部发生了点击")
    }

</script>

defineExpose()

使用< script setup >的组件是默认关闭的:

  • 通过模板ref或者$parent链获取到的组件的公开实例,不会暴露任何在< script setup >中声明的绑定;

通过defineExpose编译器宏来显式指定在< script setup >组件中要暴露出去的property:

在这里插入图片描述

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

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

相关文章

Java实现PPT转MP4文件

环境要求 必须是Windows电脑&#xff0c;已安装微软Office且已激活。 引入Jar 首先在pom中引入jar包 <dependency><groupId>cc.pptshow</groupId><artifactId>pptshow</artifactId><version>1.3</version> </dependency> …

【2023年计划大纲】2023年技术笔记大纲

2023年技术笔记写作计划 按照技术类型&#xff0c;计划写以下三个领域的笔记&#xff1a; &#xff08;1&#xff09;AUTOSAR标准体系的专业知识&#xff0c;T-BOX,BMS,VCU这几个产品的设计和核心开发。包括UDS协议&#xff0c;XCP协议&#xff0c;OS操作系统。 每一个产品和…

测试工程师常见的面试问题及回答建议

说起软件测试近几年的发展&#xff0c;其实已悄无声息地发生了巨大的变化。前几年随着互联网行业的迅猛发展&#xff0c;软件测试人才稀缺&#xff0c;低门槛高薪资促使大批毕业生和转行人员一窝蜂地涌入。而现在&#xff0c;软件测试发展太快&#xff0c;纵观各大招聘网站&…

Prompt是什么_揭秘Prompt:大模型时代的关键技术与实践应用

文章目录 1 Prompt是什么Prompt的定义和基本概念Prompt的工作原理 2 综合案例案例1&#xff1a;根据内容提取数据生成表格百度&#xff1a;文心一言科大讯飞&#xff1a;讯飞星火 案例2&#xff1a;文生图百度&#xff1a;文心一言科大讯飞&#xff1a;讯飞星火 案例3&#xff…

如何建立一个好的待办事项系统并提高工作效率

如果你有一系列的任务需要完成&#xff0c;你会如何记住它们呢&#xff1f; 最简单的方法当然是将它们记在脑中&#xff0c;但如果任务的数量很多&#xff0c;记忆的细节难免模糊。纸和笔也是一个不错的选择&#xff0c;但纸质的任务清单容易遗失或者损坏。让应用来帮忙当然也…

ubuntu iptables开机自启动

一、配置ubuntu路由转发 用在一台电脑有多个网卡的情形下&#xff0c;一个网卡5网段、一个网卡8网段&#xff0c;8网段是网络出口&#xff0c;所以5网段的设备需要入网的话&#xff0c;要路由转发。 sudo iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j SNAT --to-sou…

对于中小企业,如何管理好仓库?

对于中小企业&#xff0c;如何管理好仓库&#xff1f; 在制造业摸爬滚打的这些年&#xff0c;也拜访了不少客户&#xff0c;帮助不少企业做了数字化方案&#xff0c;正如题主所说&#xff0c;“仓库是每一个经销商的根据地&#xff0c;如果不把仓库管理好&#xff0c;那么整个…

产品经理认证NPDP考试心得

什么是NPDP&#xff1f; 产品经理国际资格认证NPDP&#xff08;New Product Development Professional&#xff09;&#xff0c;由美国产品开发与管理协会&#xff08;PDMA&#xff09;所发起&#xff0c;是国际公认的新产品开发专业认证。 NPDP考试简介 考试方式&#xff1a…

C语言实现顺序表与链表创建

线性表 用于存储若干相同属性元素的有序序列称为线性表。 线性表特征&#xff1a; 存在唯一的第一个元素&#xff1b;存在唯一的最后一个元素&#xff1b;除第一个序列的每一个元素元素都有一个前驱元素&#xff0c;后一个都有一个后继元素。 顺序表 线性表的顺序表示指的…

智慧矿山成行业新趋势,千寻位置助力企业数字化转型

随着政策推动和科技发展&#xff0c;智慧矿山已成为矿业行业的趋势和未来的方向。 智慧矿山就是以矿山数字化、信息化为前提和基础&#xff0c;对矿山生产、人员健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理&#xff0c;最终实现安全矿山、无人矿山、高效…

java设计模式之:访问者模式

前言 关于设计模式&#xff0c;我们得结合生活中的案例来学习&#xff1b;最近我在网上也看了不少文章&#xff0c;今天想跟大家分享一下关于访问者模式的一些知识&#xff0c;先来看一个简单的案例吧。 相信大家都去过医院&#xff0c;看完病&#xff0c;医生都会给我们开一…

Linux重定向和缓冲区理解

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 重定向和缓冲区理解 前言正文文件描述符重定向重定向原理重定向命令重定向函数 缓冲区缓冲区是什么&#xff1f;缓冲区刷新策略内核缓冲区与普通缓冲区 最后 前言 前…

5款超级好用的开发效率工具,建议收藏!

大家好&#xff01;高温天气切莫太累&#xff0c;注意防暑休闲开胃(&#xff5e; o &#xff5e;)~zZ 人口过剩的时代&#xff0c;劳动力也追求高性价比。好的工具&#xff0c;能够帮助我们更高效地完成工作&#xff0c;节省时间&#xff08;摸鱼时间&#xff09;和精力&#…

吐血整理,性能测试方法与步骤详细,进阶测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 总体方向&#xf…

HTML5 sessionStorage会话存储

sessionStorage 是HTML5新增的一个会话存储对象&#xff0c;用于临时保存同一窗口(或标签页)的数据&#xff0c;在关闭窗口或标签页之后将会删除这些数据。本篇主要介绍 sessionStorage(会话存储)的使用方式。包括添加、修改、删除等操作。 目录 1. 介绍 1.1 说明 1.2 特点 1…

微信小程序实现一个文字展开收起功能

1.0 需求背景 需求很常见&#xff0c;就是当一行文字过多时&#xff0c;显示省略号&#xff0c;然后显示展开两个字&#xff0c;点击&#xff0c;文字完全展示开&#xff0c;点击收起&#xff0c;回到省略形式&#xff0c;如下图 2.0 需求分析 有了上图&#xff0c;应该能更好…

2023亚马逊云科技中国峰会之Serverless

序言 Amazon Web Services&#xff0c;是Amazon.com推出的一系列云计算服务。 它提供了一系列的基础设施服务、平台服务和软件服务&#xff0c;希望可以帮助我们更轻松地构建和管理基于云的应用程序。 今天来学习一下 Serverless 本文会介绍以下六个模块&#xff1a; 为什么会…

RocketMq 同组消费者 自动设置InstanceName

RocketMq 同组消费者 自动设置InstanceName 一、背景二、处理方法三、源码分析四、总结 一、背景 同组多于1个消费者&#xff0c;如果没单独设置instanceName,默认为DEFAULT。启动时会报如下错误&#xff1a; org.apache.rocketmq.client.exception.MQClientException: The co…

物联网工业触摸屏与防火墙的安全协作

1 前言 随着物联网技术的快速发展&#xff0c;物联网HMI不仅需要提供SCADA级功能库和控件库&#xff08;点击查看物联网HMI功能库和控件库的详细介绍&#xff09;&#xff0c;还需要具备强大的安全性能。虹科物联网HMI内置防火墙功能&#xff0c;识别和阻止未经授权的访问&…

PCI Express --- LTSSM

目录 1. 链路训练和状态机 1.1 Detect 状态 1.1.1 Detect.Quiet 子状态 1.1.2 Detect.Active 子状态 1.2 Polling 状态 1.2.1 Polling.Active 子状态 1.2.2 Polling.Compliance 子状态 1.2.2 Polling.Configuration 子状态 1.2.3 Polling.Speed 子状态 1.3 Configuration 状…