组合式API

文章目录

  • 前言
  • 了解组合式API
    • 简单类型 ref封装
    • 对象类型 user.name
    • 子组件
    • 数组类型 reactive封装
  • 组合式 API 基础练习
  • 基础练习优化


前言

Vue 3 的组合式 API(Composition API)是一组函数和语法糖,用于更灵活和可组合地组织 Vue 组件的代码逻辑。与 Vue 2 的 Options API 不同,组合式 API 不再以选项的形式存在,而是通过 <script setup> 标签来使用。

组合式 API 提供了以下几个核心函数:

  • setup():组件创建之前调用的函数,用于定义组件的状态、计算属性、方法、事件等。setup() 函数可以返回一个对象,包含模板中需要用到的数据和方法。
  • ref():接收一个初始值并返回一个响应式对象,可以通过 .value 属性获取或修改值。
  • reactive():接收一个普通对象并返回一个响应式的对象,内部所有属性都是响应式的。
  • computed():接收一个计算函数作为参数,返回一个响应式的计算属性。
  • watch():监听数据变化并执行回调函数。
  • onMounted()onUpdated()onUnmounted():生命周期钩子函数,分别在组件挂载、更新和卸载时调用。

使用组合式 API 的好处包括:

  • 更好的代码组织性,将相关代码组织在同一个函数内,更方便阅读和维护;
  • 更容易重用代码,可以编写可复用的函数或复杂逻辑的组合函数;
  • 更好的类型推断和 IDE 支持。

组合式 API 可以与 Options API 共存,因此可以按需选择使用。

了解组合式API

新建项目后在根组件中重新生成vue
然后删掉script标签内代码全部删掉

<template><div>{{ name }}</div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
let name = '张三'
</script>
<style scoped>
</style>

在这里插入图片描述
其中name 是一个响应式的数据属性,初始值为 ‘张三’
在模板中使用插值语法 {{}} 来动态展示 name 属性的值

简单类型 ref封装

上面的例子比较简单,下面看简单类型加上ref封装变成响应式数据

<template><div>{{ name }}<br><button @click="change">换名字</button></div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
let name = '张三'
function change(){name = '张三去打水了'
}
</script>
<style scoped>
</style>

运行后代码并没有改变

定义的数据默认不支持响应式(代码一变立刻同步到视图上,配置式API默认支持)

  1. 接下来需要导入东西
import {ref} from 'vue'

组合式API想把数据变成响应式的,需要用ref对数据做一个封装

简单类型需要用ref进行封装,而对象类型不需要

  1. 调用.value属性
<template><div>{{ name }}<br><button @click="change">换名字</button></div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
import {ref} from 'vue'let name = ref ('张三')
function change(){name.value = '张三去打水了'
}
</script>
<style scoped>
</style>

接下来点击按钮数据改变
在这里插入图片描述

对象类型 user.name

<template><div>{{ name }}--{{ user.name }}<br><button @click="change">换名字</button></div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
import {ref} from 'vue'let name = ref ('张三')
// 对象类型
let user = {name: '李四'
}
function change(){name.value = '张三去打水了'user.name = '李四去挑水'
}
</script>
<style scoped>
</style>

在上面的代码中,user 对象的 name 属性值为 ‘李四’,该属性与 name 响应式变量不同,二者无关。
在模板中,{{ user.name }} 用于显示 user 对象的 name 属性值,而 {{ name }} 则用于显示 name 响应式变量的值。

子组件

之前使用子组件是导入、注册、使用,在组合式API内是导入之后直接使用

导入:

import HelloWorld from '@/components/HelloWorld.vue';

使用:

    <HelloWorld></HelloWorld>

效果:
在这里插入图片描述

数组类型 reactive封装

<template><div>{{ name }}--{{ user.name }}<br><p v-for="(item, index) in arr" :key="index">{{ item }}</p><button @click="change">换名字</button><HelloWorld></HelloWorld></div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
import {ref} from 'vue'import HelloWorld from '@/components/HelloWorld.vue';
let name = ref ('张三')
// 对象类型
let user = {name: '李四'
}
//数组类型
let arr = ['a','b','c']function change(){name.value = '张三去打水了'user.name = '李四去挑水'arr.splice(0,1)
}
</script>
<style scoped>
</style>

运行后会把第一个数据删掉
在这里插入图片描述
但是再删就删不掉了

接下来也给数组封装一下reactive

<template><div>{{ name }}--{{ user.name }}<br><p v-for="(item, index) in arr" :key="index">{{ item }}</p><button @click="change">换名字</button><HelloWorld></HelloWorld></div>
</template>
<!-- 加上setup就是组合式API -->
<script setup>
import {ref,reactive} from 'vue'import HelloWorld from '@/components/HelloWorld.vue';
let name = ref ('张三')
// 对象类型
let user = {name: '李四'
}
//数组类型
let arr = reactive(['a','b','c'])function change(){name.value = '张三去打水了'user.name = '李四去挑水'arr.splice(0,1)
}
</script>
<style scoped>
</style>

组合式 API 基础练习

新建两个子组件:Add、List,生成基本结构后删除script标签内默认生成的配置项

根组件中:
使用了 <List> 组件,该组件的代码未展示,可以理解为列表组件;
引入了 reactive 函数,创建了一个响应式的数组 arr,用于存储待办列表中的数据

<template><div><h1>待办列表</h1><List></List></div>
</template><script setup>
import List from '@/components/List.vue'
import { reactive } from 'vue';// 定义数组
let arr = reactive(['看电影','玩游戏'])
</script>
<style scoped>
</style>

List子组件中

在列表组件 <script setup> 中,使用了 defineProps 函数来定义组件的属性,可以用于定义组件的 props。在这里定义了一个 list 属性,类型为数组类型 Array。

在模板中,使用了 v-for 循环遍历 list 数组中的数据,然后使用 {{ item }} 渲染每一项的数据。这里加上了 :key="index",以便 Vue 可以快速识别每个列表项,并渲染正确的数据。

<template><div><ol><li v-for="(item, index) in list" :key="index">{{ item }}</li></ol></div>
</template><script setup>
// 组合式写法,自定义属性
let myProps = defineProps({list :{type: Array}
})
</script>
<style scoped>
</style>

接下来在父组件中传递一个属性数据

    <List :list="arr"></List>

在这里插入图片描述

接下来在父组件中传入子组件App

  1. 导入
import Add  from '@/components/Add.vue';
  1. 使用
    <Add @item="recive"></Add>
  1. 定义方法
function recive(v) {arr.push(v)
}

接下来就剩子组件Add了

<template><div><input type="text" v-model="item"><button @click="send">添加</button></div>
</template><script setup>
// 定义事件  数据名item
import {ref} from 'vue'
let item = ref('')// 定义事件  send
// 组合式API自定义事件
let emits = defineEmits(['item'])
function send(){if ( item.value!='' ) {// 不为空 发送数据emits('item',item.value)// 清空输入框,避免重复添加item.value = ''}}
</script>
<style scoped>
/* 输入框样式 */
input {padding: 8px 16px;font-size: 16px;outline:none;border: 1px solid black;border-radius: 4px;margin-right: 8px;}/* 按钮样式 */button {padding: 8px 16px;font-size: 16px;background-color: #409EFF;color: white;border: none;border-radius: 4px;cursor: pointer;}
</style>

在这里插入图片描述

基础练习优化

请添加图片描述

以下是对代码的注释和步骤的解释:

<template><div><h1>待办列表</h1><Add @item="recive"></Add><List @remove="del" :list="arr"></List></div>
</template>

上面的代码是 App.vue 文件的模板部分,主要是引入 Add.vueList.vue 组件,并绑定对应的自定义事件。

<script setup>
import List from '@/components/List.vue'
import Add from '@/components/Add.vue'
import { reactive } from 'vue'// 定义数组
let arr = reactive(['玩游戏','看电影'])function recive(v){arr.push(v)
}
function del(i){arr.splice(i,1)
}
</script>

上面的代码是 App.vue 文件的逻辑部分。引入 List.vueAdd.vue 组件,并用 reactive 定义了一个响应式数组 arr,用于存储待办列表。

recive 函数用于接收从 Add.vue 组件传递过来的数据,并将其添加到 arr 数组中。

del 函数用于接收从 List.vue 组件传递过来的数据,并将对应的列表项从 arr 数组中删除。

<template><div><input type="text" v-model="item"><button @click="send">添加</button></div></template>

上面的代码是 Add.vue 文件的模板部分,主要包含一个输入框和一个按钮,用于向父组件派发数据。

<script setup>
// 定义事件  数据名item
import {ref} from 'vue'
let item = ref('')// 定义事件  send
// 组合式API自定义事件
let emits = defineEmits(['item'])
function send(){if ( item.value!='' ) {// 不为空 发送数据emits('item',item.value)// 清空输入框,避免重复添加item.value=''}
}
</script>

上面的代码是 Add.vue 文件的逻辑部分,用 defineEmits 定义了一个自定义事件 item,用 ref 定义了一个响应式变量 item,用于获取输入框内的值。当点击添加按钮时,根据输入框内的值,触发自定义事件并将输入框内的值作为参数传递给父组件,最后清空输入框。

<template><div><ol><li @click="send(index)" v-for="(item, index) in list" :key="index">{{ item }}</li></ol></div></template>

上面的代码是 List.vue 文件的模板部分,主要用于展示待办列表。

<script setup>//组合式写法 自定义属性let myProps = defineProps({list:{type: Array}})let emits = defineEmits(['remove'])function send(i){emits('remove',i)}</script>

上面的代码是 List.vue 文件的逻辑部分,用 defineProps 定义了一个 list 属性,用于接收父组件传递过来的数据。用 defineEmits 定义了一个自定义事件 remove,当每个列表项被点击时触发该事件,并向父组件派发一个消息。

<style scoped>li{color: #223;margin: 10px 0;font-size: 25px;}li:hover{cursor: pointer;color: #31c27c;}li:hover::after{content: "-点击已办";color: red;}
</style>

上面的代码是 List.vue 文件的样式部分,主要用于美化待办列表的样式。

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

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

相关文章

leetcode 538. 把二叉搜索树转换为累加树

2023.7.16 这道题利用中序遍历&#xff08;右中左&#xff09;的操作不断修改节点的值即刻&#xff0c;直接看代码&#xff1a; class Solution { public:TreeNode* convertBST(TreeNode* root) {stack<TreeNode*> stk;//前面的累加值int pre_value 0;TreeNode* cur r…

review回文子串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 class Solution {List<List<String>> lists new ArrayList<>(); // 用于存储所有可能…

【数据挖掘】时间序列教程【二】

2.4 示例:颗粒物浓度 在本章中,我们将使用美国环境保护署的一些空气污染数据作为运行样本。该数据集由 2 年和 5 年空气动力学直径小于或等于 3.2017 \(mu\)g/m\(^2018\) 的颗粒物组成。 我们将特别关注来自两个特定监视器的数据,一个在加利福尼亚州弗雷斯诺,另一个在密…

图片文字对齐 图片文字居中对齐

方法一: 用 vertical-align: middle; <view class="container"><view class="search"><image src="../../images/icon/search.png" alt="" /><text class="tex">搜索</text></view>&…

透彻!127.0.0.1和0.0.0.0之间的区别总算听明白了!

参考视频&#xff1a;透彻&#xff01;127.0.0.1和0.0.0.0之间的区别总算听明白了&#xff01;_哔哩哔哩_bilibili 0.0.0.0不是一个ip地址&#xff0c;而是一个通配符&#xff0c;通配当前主机上面所有的网卡&#xff08;包括虚拟网卡&#xff09;。

深度学习环境安装|PyCharm,Anaconda,PyTorch,CUDA,cuDNN等

本文参考了许多优秀博主的博客&#xff0c;大部分安装步骤可在其他博客中找到&#xff0c;鉴于我本人第一次安装后&#xff0c;时隔半年&#xff0c;我忘记了当时安装的许多细节和版本信息&#xff0c;所以再一次报错时&#xff0c;重装花费了大量时间。因此&#xff0c;我觉得…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profib…

【新版系统架构】第十七章-通信系统架构设计理论与实践

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

Redis---缓存双写一致性

目录 一、什么是缓存双写一致性呢&#xff1f; 1.1 双检加锁机制 二、数据库和缓存一致性的更新策略 2.1、先更新数据库&#xff0c;后更新缓存 2.2 、先更新缓存&#xff0c;后更新数据库 2.3、先删除缓存&#xff0c;在更新数据库 延时双删的策略&#xff1a; 2.4.先更新数…

Matplotlib---3D图

1. 3D图 # 3D引擎 from mpl_toolkits.mplot3d.axes3d import Axes3D fig plt.figure(figsize(8, 5)) x np.linspace(0, 100, 400) y np.sin(x) z np.cos(x)# 三维折线图 axes Axes3D(fig, auto_add_to_figureFalse) fig.add_axes(axes) axes.plot(x,y,z) plt.savefi…

Runner 介绍

Runner 介绍 概述 Runner是用来批量调用collection里某个文件夹里的全部接口的。 (注意&#xff0c;我说的是文件夹内所有接口,可以是一级文件夹&#xff0c;也可是二级文件夹) 示意图 打开runner&#xff0c;如图所示 说明 历史记录 历史执行记录 2.导入 导入别人或之…

h5页面如何与原生交互

本文讲述h5页面跟原生通信&#xff0c;比如在app内&#xff0c;调用相机&#xff0c;获取相册内的图片&#xff0c;在app内拉起微信小程序等等&#xff0c;h5页面没有这么多权限能够直接调用移动端的原生能力&#xff0c;这个时候就需要与原生进行通讯&#xff0c;传递一个信号…

Go实现在线词典翻译(三种翻译接口,结合sync)

火山翻译 首先介绍用火山翻译英译汉。 package mainimport ("bufio""bytes""encoding/json""fmt""io""log""net/http""os""strings""unicode" )type DictRequestHS st…

单片机第一季:零基础6——按键

目录 1&#xff0c;独立按键 2&#xff0c;矩阵按键 &#xff08;注意&#xff1a;文章中的代码仅供参考学习&#xff0c;实际使用时要根据需要修改&#xff09; 1&#xff0c;独立按键 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xf…

Web APIs

文章目录 1.Web APIs 和 JS 基础关联性1.1 JS 的组成 2. API 和 Web API2.1 API2.2 Web API 1.Web APIs 和 JS 基础关联性 1.1 JS 的组成 2. API 和 Web API 2.1 API **API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;**是一些预先定义的函…

观察者模式(下):如何实现一个异步非阻塞的EventBus框架?

上一节课中&#xff0c;我们学习了观察者模式的原理、实现、应用场景&#xff0c;重点介绍了不同应用场景下&#xff0c;几种不同的实现方式&#xff0c;包括&#xff1a;同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞是最经典的实现方式&#xff0c;主要是为了…

SSH框架简介篇

文章目录 概述目录结构 strutsSpringHibernate总结 概述 SSH框架&#xff08;Struts Spring Hibernate&#xff09;是一种广泛应用的Java企业级开发框架组合&#xff0c;它将Struts、Spring和Hibernate三个优秀的框架有机地结合在一起&#xff0c;提供了一套完整的解决方案&…

Linux系统编程:文件系统和inode

目录 一. 磁盘的结构和读写数据的方式 1.1 磁盘级文件和内存级文件 1.2 磁盘的物理结构 1.3 访问磁盘数据的方式 二. 磁盘文件系统 2.1 磁盘的分区管理方法 2.2 文件名和inode的关系 三. 结合文件系统对文件创建和删除的相关问题的理解 3.1 文件创建时操作系统进行的工…

51单片机--DS1302时钟

文章目录 DS1302引脚定义和应用电路内部结构框图寄存器的定义时序定义BCD码DS1302时钟代码 DS1302 DS1302是美国DALLAS公司推出的一款实时时钟电路芯片。它具有高性能和低功耗的特点&#xff0c;可以通过SPI三线接口与CPU进行同步通信。DS1302能够提供秒、分、时、日、星期、月…

【SQL应知应会】表分区(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 一、分区表1.非分区表2.分区表2…