Vue3:组件基础(下)

Vue 3 组件库开发实战:打造基础 UI 组件库并发布 - 构建可复用的 Vue 组件资产 在接下来的博客中,我们将继续深入 Vue 3 的工程化实践,探索更多高级的组件库开发技巧,例如组件库的文档生成、组件库的测试、组件库的版本管理、组件库的持续集成/持续部署 (CI/CD) 等,构建更完善、更专业的 Vue 3 组件库。尝试点击不同类型的按钮,输入框中输入内容,以及查看卡片组件的展示效果,验证组件库组件是否可以正常使用。应运而生,它是一组预先构建好的、可复用的 UI 组件集合,可以像乐高积木一样,在不同的项目之间灵活组装和复用,极大地提升了开发效率,并保证了 UI 风格的统一性。 阅读详情

Vue3:组件基础(下)

Date: April 12, 2023
Sum: props验证、计算属性、自定义时间、组件上的v-model、任务列表案例


目标:

能够知道如何对 props 进行验证

能够知道如何使用计算属性

令能够知道如何为组件自定义事件

令能够知道如何在组件上使用 v-model




props 验证

  1. 什么是 props 验证

指的是:在封装组件时对外界传递过来的 props 数据进行合法性的校验,从而防止数据不合法的问题。

Untitled

使用数组类型的 props 节点的缺点:无法为每个 prop 指定具体的数据类型。

  1. 对象类型的 props 节点

使用对象类型的 props 节点,可以对每个 prop 进行数据类型的校验,示意图如下:

Untitled

  1. props 验证

对象类型的 props 节点提供了多种数据验证方案,例如:

① 基础的类型检查 ② 多个可能的类型 ③ 必填项校验 ④ 属性默认值 ⑤ 自定义验证函数

3.1 基础的类型检查

可以直接为组件的 prop 属性指定基础的校验类型,从而防止组件的使用者为其绑定错误类型的数据:

Untitled

3.2 多个可能的类型

如果某个 prop 属性值的类型不唯一,此时可以通过数组的形式,为其指定多个可能的类型,示例代码如下:

Untitled

3.3 必填项校验

如果组件的某个 prop 属性是必填项,必须让组件的使用者为其传递属性的值。此时,可以通过如下的方式将其设置为必填项:

export default {
  name: 'MyCount',
  props: {
    count: {
      type: Number,
      required: true //设定required
    },
    state: Boolean,
  }
}

3.4 属性默认值

在封装组件时,可以为某个 prop 属性指定默认值。示例代码如下:

export default {
  name: 'MyCount',
  props: {
	// 通过“配置对象”的形式,来定义 propC 属性的“验证规则”
    count: {
      type: Number,
      default: 100, // 如果使用者没有指定 default 的值,则 count 属性的值默认为 100
      required: true 
    },
    state: Boolean,
  }
}

3.5 自定义验证函数

在封装组件时,可以为 prop 属性指定自定义的验证函数,从而对 prop 属性的值进行更加精确的控制:

Untitled




计算属性

  1. 什么是计算属性

计算属性本质上就是一个 function 函数,它可以实时监听 data 中数据的变化,并 return 一个计算后的新值,供组件渲染 DOM 时使用。

  1. 如何声明计算属性

计算属性需要以 function 函数的形式声明到组件的 computed 选项中,

示例代码如下:

<template>
  <div>
    <!-- 通过v-model进行双向数据绑定。 .number指自动将用户的输入值转为数值类型 -->
    <input type="text" v-model.number="count" />
    <p>{{ count }} 乘以2的值为: {{ plus }}</p>
  </div>
</template>

<script>
export default {
  name: 'MyCounter',
  data() {
    return {
      count: 1,
    }
  },
  computed: {
    // 计算属性:监听data中count值的变化,自动计算出count*2之后的新值
    plus() {
      return this.count * 2
    }
  }
}
</script>

结果:

Untitled

注意:计算属性侧重于得到一个计算的结果,因此计算属性中必须有 return 返回值!

  1. 计算属性的使用注意点

① 计算属性必须定义在 computed 节点中

② 计算属性必须是一个 function 函数

③ 计算属性必须有返回值

④ 计算属性必须当做普通属性使用

比如 {{plus}}, 而非是这样用:{{plus()}}

  1. 计算属性 vs 方法

相对于方法来说,计算属性会缓存计算的结果,只有计算属性的依赖项发生变化时,才会重新进行运算。因此计算属性的性能更好

案例:

  • Code:

    <template>
      <div>
        <!-- 通过v-model进行双向数据绑定。 .number指自动将用户的输入值转为数值类型 -->
        <input type="text" v-model.number="count" />
        <p>{{ count }} 乘以2的值为: {{ plus }}</p>
        <p>{{ count }} 乘以2的值为: {{ plus }}</p>
        <p>{{ count }} 乘以2的值为: {{ plus }}</p>
        <hr/>
        <p>{{ count }} 乘以2的值为: {{ m_plus() }}</p>
        <p>{{ count }} 乘以2的值为: {{ m_plus() }}</p>
        <p>{{ count }} 乘以2的值为: {{ m_plus() }}</p>
      </div>
    </template>
    
    <script>
    export default {
      name: 'MyCounter',
      data() {
        return {
          count: 1,
        }
      },
      computed: {
        // 计算属性:监听data中count值的变化,自动计算出count*2之后的新值
        plus() {
          console.log("计算属性被执行了");
          return this.count * 2
        }
      },
      methods: {
        m_plus() {
          console.log("方法被执行了");
          return this.count * 2
        }
      }
    }
    </script>
    

    效果:

    Untitled

注意:

计算属性的结果会被缓存,性能好

方法的计算结果无法被缓存,性能低

5. 计算属性案例

案例需求,使用计算属性动态计算:

① 已勾选的商品总个数 ② 已勾选的商品总价 ③ 结算按钮的禁用状态

Untitled

  • Code:

    computed: {
        //动态计算出勾选水果的总数量
        total() {
          let t = 0
          this.fruitlist.forEach(x => {
            if(x.state) {
              t += x.count
            }
          })
          return t
        },
        amount() {
          let a = 0
          this.fruitlist
            .filter(x => x.state)
            .forEach(x => {
              a += x.price * x.count
            })
          return a
        },
        isDisabled() {
          this.total === 0
        }
      },
    

注意:

这里的this指的是当前组件实例

computed: {
	isDisabled() {
		this.toal === 0
	}
}



自定义事件

  1. 什么是自定义事件

在封装组件时,为了让组件的使用者可以监听到组件内状态的变化,此时需要用到组件的自定义事件

Untitled

注意:这里是在App.vue中监听MyCounter组件中数据的变化。

  1. 自定义事件的 3 个使用步骤

在封装组件时:

① 声明自定义事件

② 触发自定义事件

在使用组件时:

③ 监听自定义事件

2.1 声明自定义事件

开发者为自定义组件封装的自定义事件,必须事先在 emits 节点中声明,示例代码如下:

Untitled

2.2 触发自定义事件

在 emits 节点下声明的自定义事件,可以通过 this.$emit(‘自定义事件的名称’) 方法进行触发,示例代码如下:

Untitled

2.3 监听自定义事件

在使用自定义的组件时,可以通过 v-on 的形式监听自定义事件。示例代码如下:

Untitled

3. 自定义事件传参

在调用 this.$emit() 方法触发自定义事件时,可以通过第 2 个参数为自定义事件传参

示例代码如下:

//counter.vue
methods: {
  add() {
    this.count++
    this.$emit('countChange',this.count) // 触发自定义事件,通过第二个参数传参
  }
}
//App.vue
methods: {
  getCount(val) {
    console.log("触发了 countChange 自定义事件", val);
  }
},

理解:在counter组件中的$emit中传入参数,然后在App.vue中的methods中传入参数接收即可




组件上的 v-model

1. 为什么需要在组件上使用 v-mode

v-model 是双向数据绑定指令,当需要维护组件内外数据的同步时,可以在组件上使用 v-model 指令。示意图如下:

Untitled

外界数据的变化会自动同步到 counter 组件中 ; counter 组件中数据的变化,也会自动同步到外界

理解:父组件和子组件中数据的变化会相互影响

2. 在组件上使用 v-model 的步骤

2.1 父向子传递数据

Untitled

① 父组件通过 v-bind: 属性绑定的形式,把数据传递给子组件
② 子组件中,通过 props 接收父组件传递过来的数据

案例:

<template>
  <div>
    <h1>App根组件 --- {{ count }}</h1>
    <button @click="count += 1">+1</button>
    <hr/>
    <my-counter :number="count"></my-counter> //通过v-bind属性将count值传递给number
  </div>
</template>

Untitled


2.2 子向父传递数据

Untitled

① 在 v-bind: 指令之前添加 v-model 指令

② 在子组件中声明 emits 自定义事件,格式为 update:xxx

③ 调用 $emit() 触发自定义事件,更新父组件中的数据

案例:

// App.vue
<template>
  <div>
    <h1>App 根组件  ---- {{count}}</h1>
    <button @click="count += 1">+1</button>
    <hr />

    <my-counter v-model:number="count"></my-counter>
  </div>
</template>
// Counter.vue
<template>
  <div>
    <p>count值是:{{number}}</p>
    <button @click="add">+1</button>
  </div>
</template>

<script>
export default {
  name: 'MyCounter',
  props: ['number'],
  emits: ['update:number'],
  methods: {
    add() {
      this.$emit('update:number', this.number + 1)
    }
  }
}
</script>

效果:

子父组件中数据同步

Untitled




总结:

① 能够知道如何对 props 进行验证

数组格式、对象格式

type、default、required、validator

② 能够知道如何使用计算属性

computed 节点、必须 return 一个结果、缓存计算结果

③ 能够知道如何为组件绑定自定义事件

v-on 绑定自定义事件、emits、$emit()

④ 能够知道如何在组件上使用 v-model

应用场景:实现组件内外的数据同步

v-model:props名称、emits、$emit(‘update:props名称’)

Vue3 入门-第四篇:组件基础-创建与注册 这是子组件 阅读详情

相关推荐

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9499

一个简单数学公式输入组件FormulaInput

一个支持简单数学公式计算的输入组件,基于 Vue 3 + TypeScript + Ant Design Vue 开发。 属性说明 属性名 类型 默认值 说明 modelValue string | number ‘’ 组件的值,支持 v-model 双向绑定 placeholder string ‘请输入数字或计算公式’ 输入框占位文本 disabled boolean false 是否禁用 options Option[] [] 下拉选项列表 decimalPlaces

xzflash的博客 1736

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 521

vue---十分钟搞懂vue计算属性

计算属性本质上就是一个 function 函数,它可以实时监听 data 中数据的变化,并 return 一个计算后的新值,供组件渲染 DOM 时使用。✨个人笔记博客✨星月前端博客✨原创不易,还希望各位大佬支持一下✏️评论,你的意见是我进步的财富!......

厚积薄发. 4340

从零到一:手把手教你构建工业级Modbus转MQTT网关(STM32+ESP8266实战)

本文详细介绍了如何利用STM32和ESP8266构建工业级Modbus转MQTT网关,涵盖硬件选型、代码示例、协议转换及稳定性设计。重点解析Modbus RTU与MQTT协议对接阿里云物联网平台的实战步骤,确保数据可靠传输与长期稳定运行,为工业物联网应用提供完整解决方案。

u0v1w2x3的博客 686

Pseudobulk与FindMarkers单细胞差异基因分析实战对比

本文深入对比了单细胞差异基因分析中Pseudobulk与FindMarkers两种主流方法。通过实战演示,详细解析了二者在底层逻辑、数据准备、分析流程及结果解读上的核心差异,并提供了基于不同生物学问题与数据特点的选择策略,帮助研究者做出更精准的分析决策。

weixin_29218963的博客 333

vben userform表单 表单及增加表单位置设置

提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了userform的使用,更多方便快捷vben的userform的使用还需要更加深入了解,如有什么问题欢迎私信我。

muitoprazer的博客 5275

Win10系统蓝屏错误BAD SYSTEM CONFIG INFO的解决方案

BAD SYSTEM CONFIG INFO错误是Win10系统中较为常见的一种蓝屏错误,通常与系统配置文件损坏或丢失有关。本文介绍了三种有效的解决方法:使用系统修复高级选项修复、通过PE修复文件和重装新系统。用户可以根据实际情况选择合适的方法进行操作。同时,建议用户定期备份系统重要文件和数据,以防止类似问题的发生。在遇到问题时,保持冷静并耐心操作,通常可以顺利解决问题。

mmoo_python的博客 7727

vant源码分析--col、row组件

vant中col和row组件能完成layout布局,来进行行列布局。 row组件目录结构 src └─ row ├─ index.js # 组件入口 ├─ index.less # 组件样式 index.js组件入口 还是引入createNamespace函数并调用,createNamespace函数返回三个函数,在这里接收了其中两个函数。 import ...

weixin_45532305的博客 3671

AUTOSAR从入门到精通-【应用实战篇】车载HMI-ADAS

ADAS是高级驾驶辅助系统(Advanced Driving Assistance System)简称ADAS。ADAS高级驾驶辅助系统是利用安装于车上的各式各样的传感器, 在第一时间收集车内外的环境数据, 进行静、动态物体的辨识、侦测与追踪等技术上的处理, 从而能够让驾驶者在最快的时间察觉可能发生的危险, 以引起注意和提高安全性的主动安全技术。

lin_xiu的博客 1435

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 938

VUE 3——1:组件基础

文章目录一,安装与使用1,声明式渲染2,处理用户输入3,条件与循环4,组件化应用构建二,应用 & 组件实例(一)创建应用实例(二)根组件与挂载(三)组件实例的 property(四)生命周期三,模板语法(一)插值1,文本插值2,原始 HTML 插值3,绑定 Attribute4,使用 JavaScript 表达式(二)指令1,参数2,动态参数3,修饰符(三)缩写四,Data Property 和 Methods Property(一)Data Property(二)Methods Propert

dangfulin的博客 2373

流体动力学仿真软件:SU2_(3).SU2的网格生成技术

设置网格的大小、密度等参数。

kkchenjj的博客 1030

《Vue3实战教程》15:Vue3组件基础

​当使用构建步骤时,我们一般会将 Vue 组件定义在一个单独的.vue文件中,这被叫做单文件组件(简称 SFC):vue当不使用构建步骤时,一个 Vue 组件以一个包含 Vue 特定选项的 JavaScript 对象来定义:jssetup() {},`// 也可以针对一个 DOM 内联模板:这里的模板是一个内联的 JavaScript 字符串,Vue 将会在运行时编译它。你也可以使用 ID 选择器来指向一个元素 (通常是原生的。

大强博客 1010

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Vue3 Vant4 Mobile组件封装指南:从基础UI到业务组件的复用技巧

在移动应用开发中,高效的组件封装是提升开发效率和代码质量的关键。本文将以Vue3.5和Vant4为技术栈,详细介绍从基础UI到业务组件的完整封装流程,帮助开发者构建可复用、易维护的移动组件库。 ## 1. 组件封装的核心原则 组件封装需要遵循**单一职责**和**高内聚低耦合**原则。在Vue3 Vant4 Mobile项目中,所有组件统一存放在`src/components/`目录下,如[L

gitblog_00869的博客 898

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vue3:组件基础(上)

vite的基本使用、组件化开发思想、vue组件的构成、组件的基本使用、封装组件的案例

CaptainDrake的博客 2093

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Vue 3】最全组件设计指南:从基础到进阶

在现代Web开发中,Vue 3组件系统的强大特性使得开发者可以更高效地构建可复用、模块化的应用界面。Vue 3的组件设计从简单的状态管理到复杂的复用和优化策略,不仅涵盖了基础的组件设计,还提供了更高级的实现方式。本文将从基础到进阶,详细解析Vue 3的组件设计,帮助您快速上手并掌握这一强大工具。Vue 3中的Composition API使得组件逻辑更加易于复用。我们可以通过组合函数(Composables)将公共逻辑封装成模块,以便在多个组件中共享使用。将useCounter。

佚名程序员 1407

Vue3 组件系统深度解析:从基础到高级组件模式

单一职责原则:每个组件只做一件事明确接口定义:严格的Props/Events约定性能敏感设计:从开始考虑渲染效率渐进式增强:基础功能+高级特性分层掌握基础组件开发 →实践高级组件模式 →研究开源组件源码 →设计自己的组件体系。

Yue 1309

Vue 3 组件通信全解:从基础到高级技巧

在前端开发中,组件可以被看作是构建用户界面的独立单元。它封装了特定的功能和样式,可以被重复使用,并且可以独立于其他部分进行开发和测试。组件的主要作用是提高代码的复用性、可维护性和可扩展性。通过将界面拆分成多个组件,开发者可以更容易地管理复杂的应用程序,并且可以针对每个组件进行优化,从而提高整体的开发效率和应用性能。Vue 3 引入了 Composition API,为组件通信带来了新的灵活性和强大的功能。

a3098448071的博客 1691

Vue3组件通信零基础入门:从hello world到实战

记住,props是父传子的单向数据流,emit是子传父的事件通知,掌握好这两个核心概念,就能构建出各种复杂的组件交互了。父组件则需要在子组件标签上监听这个事件,并绑定对应的处理方法。比如一个计数器组件,父组件传递初始值给子组件显示,子组件有两个按钮分别控制增加和减少,每次点击都会通知父组件更新数据。在父组件中,我们只需要在模板中使用子组件标签时,通过属性绑定的方式传递数据。这样,父组件的数据就能在子组件中使用了。今天想和大家分享一下Vue3中组件通信的基础知识,特别是父子组件之间的传值方法。

StarfallRaven13的博客 87

vue3基础: 组件注册

为了方便,Vue 支持将模板中使用 kebab-case 的标签解析为使用 PascalCase 注册的组件。这意味着一个以 MyComponent 为名注册的组件,在模板中可以通过 <MyComponent> 或 <my-component> 引用。如果你全局注册了一个组件,即使它并没有被实际使用,它仍然会出现在打包后的 JS 文件中。在父组件中使用子组件时,不太容易定位子组件的实现。局部注册的组件需要在使用它的父组件中显式导入,并且只能在该父组件中使用。请注意:局部注册的组件在后代组件中并不可用。

m0_74359467的博客 791

Vue3消息提示组件完全指南:从基础应用到无障碍设计

在现代Web应用中,消息提示系统是提升用户体验的关键组成部分。基于Vue3和Element Plus构建的后台管理系统通常采用两种核心消息机制:**轻量级消息提示**和**持久化通知**。 ### 轻量级消息提示(ElMessage) 轻量级消息提示是一种瞬时反馈机制,适用于操作结果的即时告知。它具有以下特点: - 自动消失(默认3秒) - 非阻塞式交互 - 简洁的视觉反馈 - 通常位于页面顶部

gitblog_00770的博客 668

企业级Vue3日历组件开发指南:从基础集成到高级功能定制

在现代Web应用开发中,日历组件作为时间管理和事件规划的核心工具,其功能性与用户体验直接影响产品竞争力。Vue3作为当前主流的前端框架,如何高效集成兼具灵活性与性能的日历解决方案?本文将以FullCalendar Vue3组件为核心,系统讲解从环境配置到业务场景落地的完整实现路径,帮助开发者构建符合企业级标准的日历应用。 ## 一、日历组件的核心价值:为何选择FullCalendar Vue3?

gitblog_00581的博客 404

深入浅出 Vue3:组件与模板基础全解析

通过本篇章,我们对 Vue3 的组件结构和模板语法有了更清晰的认识。熟练掌握这些基础知识,将为我们后续构建复杂的 Vue3 应用打下坚实的基础。

Pro_er的博客 1538
上一篇: Vue3:基础入门
下一篇: Vue3:组件基础(上)
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值