掌握这些容易被忽略的Vue组件细节,提升开发效率,事半功倍!

news2024/11/18 18:48:05

组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。
在这里插入图片描述

组件在日常开发的重要性不言而喻,掌握下述细则,可以让你在开发中事半功倍!

Props

defineProps() 宏中的参数不可以访问 <script setup> 中定义的其他变量,因为在编译时整个表达式都会被移到外部的函数中。

  • Boolean 外的未传递的可选 prop 将会有一个默认值 undefined
  • Boolean 类型的未传递 prop 将被转换为 false。这可以通过为它设置 default 来更改——例如:设置为 default: undefined 将与非布尔类型的 prop 的行为保持一致。

事件

组件触发的事件没有冒泡机制。只能监听直接子组件触发的事件。平级组件或是跨越多层嵌套的组件间通信,应使用一个外部的事件总线,或是使用一个全局状态管理方案。

我们在 <template> 中使用的 $emit 方法不能在组件的 <script setup> 部分中使用,需要通过 defineEmits()

<script setup>
const emit = defineEmits(['inFocus', 'submit'])

function buttonClick() {
  emit('submit')
}
</script>

注意:defineEmits()不能在子函数中使用。必须直接放置在 <script setup> 的顶级作用域下。

事件校验

可以通过返回一个布尔值,来表明事件是否合法。

<script setup>
const emit = defineEmits({
  // 没有校验
  click: null,

  // 校验 submit 事件
  submit: ({ email, password }) => {
    if (email && password) {
      return true
    } else {
      console.warn('Invalid submit event payload!')
      return false
    }
  }
})

function submitForm(email, password) {
  emit('submit', { email, password })
}
</script>

v-model

单个组件上,需要创建多个双向绑定值时,我们可以采用多个 v-model

<CustomInput v-model:title="title" v-model:msg="msg" />
<!-- CustomInput.vue -->
<script setup>
import { computed } from 'vue'

const props = defineProps(['title', 'msg'])
const emit = defineEmits(['update:title', 'update:msg'])

const titleValue = computed({
  get() {
    return props.title
  },
  set(value) {
    emit('update:title', value)
  }
})
const msgValue = computed({})
</script>

<template>
  <input v-model="titleValue" />
</template>

注意,子组件 v-model 不能直接绑定 title/msg。

v-model cannot be used on a prop, because local prop bindings are not writable.

透传 Attributes

透传Attributes,是指由父组件传入,且没有被子组件声明为 props 或是组件自定义事件的 attributes 和事件处理函数。

<MyButton class="large" @click="onClick"/>

想要所有像 classv-on 监听器这样的透传 attribute 都应用在内部的 <button> 上而不是外层的 <div> 上。使用 inheritAttrs: false 来禁用 attribute 继承。

<!-- MyButton -->
<div class="btn-wrapper">
  <button class="btn" v-bind="$attrs">click me</button>
</div>

<script>
// 使用普通的 <script> 来声明选项
export default {
  inheritAttrs: false
}
</script>

需要注意的是,虽然这里的 attrs 对象总是反映为最新的透传 attribute,但它并不是响应式的 (考虑到性能因素)。你不能通过侦听器去监听它的变化。如果你需要响应性,可以使用 prop。

作用域插槽

场景:数据源自子组件,样式等希望父组件自己控制。

<!-- FancyList -->
<ul>
  <li v-for="item in items">
    <slot name="item" v-bind="item"></slot>
  </li>
</ul>

<FancyList> 封装一些加载远端数据的逻辑、使用数据进行列表渲染、或者是像分页或无限滚动这样更进阶的功能

注意,我们这里使用了 v-bind 来传递插槽的 props。

<FancyList :api-url="url" :per-page="10">
  <template #item="{ body, username, likes }">
    <div class="item">
      <p>{{ body }}</p>
      <p>by {{ username }} | {{ likes }} likes</p>
    </div>
  </template>
</FancyList>

对单个列表元素内容和样式的控制权留给使用它的父组件。

依赖注入

  • 使用 Symbol 作注入名以避免潜在的冲突(推荐在一个单独的文件中导出这些注入名 Symbol);
  • 任何对响应式状态的变更都保持在供给方组件中;
  • 为确保提供的数据不能被注入方的组件更改,可以使用 readonly() 来包装提供的值
// keys.js
export const location = Symbol()
<!-- 在供给方组件内 -->
<script setup>
import { provide, ref } from 'vue'
import { location } from './keys.js'

const locationRef = ref('North Pole')

function updateLocation() {
  locationRef.value = 'South Pole'
}

provide(location, {
  // 确保注入方不可以更改 
  readonly(location),
  updateLocation
})
</script>
<!-- 在注入方组件 -->
<script setup>
import { inject } from 'vue'
import { location } from './keys.js'  

const { locationRef, updateLocation } = inject(location)
</script>

<template>
  <button @click="updateLocation">{{ locationRef }}</button>
</template>

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

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

相关文章

mysql的高可用架构之mmm

目录 一、mmm的相关知识 1&#xff09;mmm架构的概念 2&#xff09;MMM 高可用架构的重要组件 3&#xff09;mmm故障切换流程 二、mmm高可用双主双从架构部署 实验设计 实验需求 实验组件部署 具体实验步骤 步骤一&#xff1a; 搭建 MySQL 多主多从模式 &#…

Uniapp中简单弹出层的使用

图示 思路 当派工单这个输入框获取到焦点后&#xff0c;弹出弹出层选择数据。 1、定义这个输入框 <view class"cu-form-group"><view class"title"><text class"text-red">*</text>派工单号: </view><input…

Mysql查询语句优化方法

查询优化 小表驱动大表 优化原则&#xff1a;对于MySQL数据库而言&#xff0c;永远都是小表驱动大表。 /** * 举个例子&#xff1a;可以使用嵌套的for循环来理解小表驱动大表。 * 以下两个循环结果都是一样的&#xff0c;但是对于MySQL来说不一样&#xff0c; * 第一种可以理解…

第1章-Java语言概述

Java基础知识图解 1. Java语言概述 1.1 Java简史 是SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。是一种面向Internet的编程语言。 Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。 这些Java程序被称为Java小…

DepthAI API详解

目录 DepthAI的整体架构Device 对象通过标识连接到指定设备定义输入/输出队列Device对象的常用方法addLogCallback()方法close()方法getInputQueue()方法getOutputQueue()方法 PipelinePipeline常用的方法create()方法createColorCamera()方法createMonoCamera()方法createNeur…

泛微以低代码助力央企合规、案件管理数字化

近年来&#xff0c;国家出台一系列文件&#xff0c;不断强化央企国企合同、法务、合规、风控一体化管理&#xff0c;深化法治企业建设。 2022年&#xff0c;国资委印发《中央企业合规管理办法》&#xff0c;要求中央企业加强合规管理&#xff0c;切实防控风险&#xff0c;并指…

新手小白学JAVA_IDEA修改主题 设置背景图片

很多小白在刚刚使用IDEA的时候还不是很熟练 本文主要给大家提供一些使用的小技巧&#xff0c;希望能帮助到你 1.修改IDEA默认主题 IDEA的默认主题是黑色的&#xff0c;其实也可以选择其他的主题 我们一起来试一试吧~ 2.修改IDEA背景图片 IDEA的背景图片也是可以自定义的 我们…

arcgis波段提取--多波段合成

1、打开软件&#xff0c;导入彩色栅格影像&#xff0c;如下&#xff1a; 上图有RGB三个波段&#xff0c;在左侧图层下可以看到波段情况。 2、在菜单栏中选择"窗口"--"影像分析"&#xff0c;如下&#xff1a; 点击影像分析功能&#xff0c;打开如下界面&am…

移除flyway,手动进行数据库的迁移

国产数据库如达梦、金仓数据库&#xff0c;开源数据迁移工具貌似支持的很少&#xff0c;手写工具类进行数据库脚本的迁移&#xff0c;主要有2个类如下&#xff1a; /*** 模拟flyway进行sql迁移*/ Component Slf4j public class SqlInitialize implements InitializingBean, Ord…

Java【String字符串不可变】

字符串不可变&练习 字符串不可变1. 字符串设置为不可变的原因2. 如何修改字符串内容3 StringBuilder类的具体使用4. 面试题 字符串不可变 1. 字符串设置为不可变的原因 方便实现字符串常量池&#xff0c;若String对象可变&#xff0c;常量池中的内容就会随时变化&#xf…

Linux SVN提交日志校验

#!/bin/bash export LANG"en_US.UTF-8" #确保中文日志显示正常&#xff0c;便于统计日志 REPOS"$1" TXN"$2" #限制日志长度 LENGTH20 #exit 0SVNLOOK"/usr/bin/svnlook" BLACKLIST".* *.o *.chw *.pck ~\$*"function error_…

五、菜单管理

云尚办公系统&#xff1a;菜单管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&#x…

【Linux系统编程】Linux基本指令详解(二)

文章目录 前言1. cp 指令&#xff08;重要&#xff09;2. mv 指令&#xff08;重要&#xff09;3. cat 指令echo 命令输出重定向追加重定向wc 命令输入重定向 4. more 指令5. less指令&#xff08;重要&#xff09;6. head指令7. tail指令8. 命令行管道&#xff08;了解&#x…

《AVL树》

文章目录 一、AVL树的基本概念二、AVL树的结点定义三、AVL树的插入四、AVL树的旋转1. 右单旋2. 左单旋3. 右左双旋4. 左右双旋 五、AVL树的验证六、AVL树的性能七、源代码 一、AVL树的基本概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将…

Mysql+ETLCloud CDC+Doris实时数仓同步实战

业务需求及其痛点 很多大型企业需要对各种销售及营销数据进行实时同步分析&#xff0c;例如销售订单信息&#xff0c;库存信息&#xff0c;会员信息&#xff0c;设备状态信息等等&#xff0c;这些统计分析信息可以实时同步到Doris中进行分析和统计&#xff0c;Doris作为分析型…

《深入浅出SSD:固态存储核心技术、原理与实战》----学习记录(一)

前言 传统数据存储介质有磁带、光盘等&#xff0c;但更多的是硬盘(HDD)。随着数据呈爆炸式增长&#xff0c;对数据存储介质在速度上、容量上有更高的要求。时势造英雄&#xff0c;固态硬盘(Solid State Disk&#xff0c;SSD)横空出世。SSD使用电子芯片存储数据&#xff0c;没有…

数学建模算法(基于matlab和python)之 改进的欧拉方法与四阶L-K方法(4/10)

实验目的及要求&#xff1a; 1、熟悉各种初值问题的算法&#xff0c;编出算法程序&#xff1b; 2、明确各种算法的精度寓所选步长有密切关系&#xff1b; 3、熟悉在Matlab平台上直接求解常微分方程初值问题。 实验内容&#xff1a; 1、编写改进的欧拉公式通用子程序&#xff0…

禽流感病毒防治VR模拟实训教学效率高-深圳华锐视点

对于临床兽医学实训而言&#xff0c;学生在实验教学中依托传统的教学方式已经无法满足学生的学习效率&#xff0c;理论知识和实验教学无法完美结合。 随着互联网数字化的飞速发展&#xff0c;数字化虚拟仿真教学兴起&#xff0c;有效的提升了传统教学的质量&#xff0c;学生在实…

Blender骨骼绑定

演示视频参考连接:Blender骨骼绑定教程3&#xff1a;清除绑定 & Deform & 权重修改_哔哩哔哩_bilibili 对给定人体Mesh建立骨骼的操作步骤&#xff1a; 在Blender中打开人体Mesh模型&#xff0c;并确保该模型处于object模式。或者使用快捷键“Shift A”并选择“骨骼…

【FFmpeg实战】视频容器

原文地址&#xff1a;https://alphahinex.github.io/2020/03/12/video-container/ 视频容器 我们常见的视频格式有 avi 或 mp4 等&#xff0c;这些所谓的视频格式&#xff0c;实际上指的只是视频容器的格式。就像 zip 格式的压缩包里面可以放置任意类型的文件一样&#xff0c;…