vue2中常用的组件封装技巧

news2024/12/23 22:06:14

文章目录

    • vue组件封装技巧
        • 1.props参数
        • 2.$attrs
        • 3.$emit
        • 4.$listeners
        • 5.插槽

vue组件封装技巧

1.props参数

最简单父传子的技巧,在父组件传入值,子组件声明props接收就可以了

如下:

父组件:

<template>
  <div id="app">
    <Table content="外面调用的"></Table>
  </div>
</template>

<script>
import Table from './components/Table.vue';
export default {
  name: 'App',
  components: {
    Table
}
}
</script>

子组件:

<template>
    <div>{{content}}</div>
</template>
<script>
    export default {
      data() {
        return {
        }
      },
     props:['content'],
   	 mounted() {
     	console.log("父亲过来的",this.$attrs);   
     },
    }
  </script>

上面是用的props的数组语法,下面是对象语法,做更近一步处理时可以使用

props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,

    // 多个可能的类型
    propB: [String, Number],

    // 必填的字符串
    propC: {
      type: String,
      required: true,
    },

    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100,
    },

    // 具有默认值的数组写法
    propK: {
      type: Array,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return ["张三"];
      },
    },

    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: "hello" };
      },
    },

    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ["success", "warning", "danger"].indexOf(value) !== -1;
      },
    },
  },

2.$attrs

用途:在对组件进行二次封装的时候会出现孙子组件的传值问题,如果都通过prop进行层层传递太过麻烦,可以选择不使用props传值而通过$attrs传递

定义:包含了父作用域中不被认为 (且不预期为) props 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 props 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind=”$attrs” 传入内部组件——在创建更高层次的组件时非常有用。

用法:父组件正常传入数据,子组件通过在孙组件上v-bind=:" a t t r s " 将未 p r o p s 声明的数据传递,孙组件通过 t h i s . attrs"将未props声明的数据传递,孙组件通过this. attrs"将未props声明的数据传递,孙组件通过this.atrs.xxx进行使用

父组件:

<template>
  <div id="app">
    <Table content="外面调用的" msg="这是测试attrs"></Table>
  </div>
</template>

<script>
import Table from './components/Table.vue';
export default {
  name: 'App',
  components: {
    Table
}
}
</script>

子组件:

<template>
  <div v-bind="$attrs">{{this.$attrs.content}}</div>
</template>
  
<script>
export default {
  data() {
    return {};
  },

  mounted() {
    console.log("父亲过来的", this.$attrs);
  }
};
</script>

打印台信息:

image-20221014135456615

但这有一个需要注意的点:$attrs将propos未声明的属性会作为HTML属性绑定到组件的根元素上

这时候需要添加:

inheritAttrs:false

image-20221014141754671

3.$emit

可以用于子组件向父组件传递消息,触发定义的事件

父组件:

<template>
  <div  >
    <last @msgA="msgA"></last>
  </div>
</template>
  
<script>
import last from '@/components/last.vue'
export default {
  data() {
    return {};
  },
  components:{
    last
  },
  methods:{
    msgA(name){
      console.log("事件被调用了",name);
    }
  }
};
</script>

子组件:

<template>
  <div></div>
</template>

<script>
export default {
    created(){
        this.$emit('msgA','sssss')   
    },
}
</script>

可以看到控制台输出的内容

4.$listeners

与 $attrs的用法类似,当我们需要将事件处理函数传递给子组件时,可以利用父组件实例上的 l i s t e n e r s 属性,这个属性包含了组件接收到的事件处理函数 , 需要在子组件上绑定: v − o n = " listeners属性,这个属性包含了组件接收到的事件处理函数,需要在子组件上绑定:v-on=" listeners属性,这个属性包含了组件接收到的事件处理函数,需要在子组件上绑定:von="listeners"

父组件:

<template>
  <div  >
    <last @msgA="msgA"></last>
  </div>
  
</template>
  
<script>
import last from '@/components/last.vue'
export default {
  data() {
    return {};
  },
  components:{
    last
  },
  methods:{
    msgA(name){
      console.log("事件被调用了",name);
    }
  }
};
</script>

子组件:

<template>
  <div v-bind="$attrs" v-on="$listeners"></div>
</template>

<script>
export default {
    created(){
        this.$emit('msgA','sssss')
        
    },
    mounted() {
    console.log("父亲过来的值", this.$attrs);
    console.log("父亲传过来的事件",this.$listeners);
    this.$listeners.msgA('sdddddddd')
    },

}
</script>

可以看到控制台打印的信息

image-20221019143754249

简单来说: a t t r s 与 attrs与 attrslisteners 是两个对象, a t t r s 里存放的是父组件中绑定的非 P r o p s 属性, attrs 里存放的是父组件中绑定的非 Props 属性, attrs里存放的是父组件中绑定的非Props属性,listeners里存放的是父组件中绑定的非原生事件。

5.插槽

一个通用组件,往往不能够适应所有应用场景,所以在封装组件的时候只需要完成组件 80% 的功能,剩下的 20% 让父组件通过 solt 解决。比如:某一个公共组件中有两个按钮,一个是“新增”,一个是“删除”,但是在另外的场景中使用这个组件时,两个按钮需要做的事情是不一样的,比如是“查看”和“修改”。所以,我们在封装组件的时候就不要直接写按钮了,而是在合适的位置放置一个slot,其实是一个占位的作用,给按钮的设置提前预留一个位置,然后在父组件中写入按钮即可。
具体插槽如何使用我之前发过一篇文章,见下方链接
插槽

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

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

相关文章

两图看懂什么叫回调函数,使用回调函数实现多态

#include <stdio.h> //任务函数可以增加&#xff0c;任务使用框架函数保持不变&#xff0c;根据传入函数指针的不同调用不同的任务函数&#xff0c;从而实现了多态 //编写任务函数&#xff0c;任务函数可以增加 int Myadd1(int a, int b) { return ab; } int Mymux2(i…

Git 设置代理

Git 传输分两种协议&#xff0c;SSH和 http(s)&#xff0c;设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式&#xff0c;可以在Powershell中使用以下命令设置代理&#xff1a; $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…

【LeetCode】买卖股票的最佳时机最多两次购买机会

买卖股票的最佳时机 题目描述算法分析程序代码 链接: 买卖股票的最佳时机 题目描述 算法分析 程序代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector<vector<int>> f(n,vector<int>(3,-0x3f3f3f))…

【从零学习python 】48.Python中的继承与多继承详解

文章目录 在Python中&#xff0c;继承可以分为单继承、多继承和多层继承。单继承 继承语法多继承 语法格式使用多继承时需要注意以下事项Python中的MRO新式类和旧式&#xff08;经典&#xff09;类 进阶案例 在Python中&#xff0c;继承可以分为单继承、多继承和多层继承。 单…

.NET把文件嵌入到程序集中的EmbeddedFile

简介 有时候我们在发布程序时&#xff0c;不想让客户看到项目中的文件&#xff0c;这时就可以使用.NET的嵌入文件功能&#xff08;虚拟文件&#xff09;。在.NET中&#xff0c;虚拟文件&#xff08;Virtual File&#xff09;是一种特殊类型的文件&#xff0c;它们在编译时被嵌…

手把手教你用Git备份保存代码到云端

第一步 &#xff1a;创建一个Gitee仓库,需要先下载安装git,在下载安装完成后&#xff0c;我们需要首先去Gittee官网上创建一个仓库 路径会自动生成&#xff0c;点击创建即可 第二步&#xff1a; 方法一&#xff1a;用图形化界面&#xff08;方便&#xff09; 下载&#xff…

听说换上人大金仓“自动挡”,效率提升4000多倍!

前情提要 随着数据规模以及应用业务场景复杂度的不断增加&#xff0c;更大规模数据量的数据库应用场景出现&#xff0c;对于传统关系型数据库的优化能力要求也更高。 因为SQL是解释性语言&#xff0c;用户可以指定要什么&#xff0c;而无需关心如何达成目的。所以对于同样一条S…

录取结果怎么公布?这个技术可以轻松实现

对于录取结果的公布&#xff0c;一直是考生和家长重点关注的话题&#xff0c;因此学校公布录取情况的方式和效果也一直是学校工作的重点和难点&#xff0c;传统的公布方式涉及技术开发和服务器搭建&#xff0c;开发周期也较长&#xff01;一般有经验的老教师都会选择使用易查分…

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题&#xff1f;3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办&#xff1f;5. 如何从特定…

JavaSE-17 【异常】

第一章 什么是异常 1.1 异常的概念 异常&#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止 在Java中&#xff0c;异常本身就是一个类&#xff0c;产生异常就是创建一个异常对象并且抛出一个异常对象的过程 Java处理…

如何快速高效地进行 API 自动化测试

我们的研发团队最需要应对的就是各种新需求。软件越来越快的更新速度也让整个系统也变得越来越复杂&#xff0c;这让 测试 工作面临着巨大的挑战。测试人员必须与开发人员沟通&#xff0c;确定测试范围&#xff0c;并及时获取最新的接口用例数据来验证功能。但是&#xff0c;由…

【Apollo】Apollo版本特点与改进

特点与改进 概述里程碑6.0版本特点及改进7.0版本特点及改进8.0版本特点及改进代码差异 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快…

【Web开发指南】MyEclipse XML编辑器的高级功能简介

MyEclipse v2023.1.2离线版下载 1. 在MyEclipse中编辑XML 本文档介绍MyEclipse XML编辑器中的一些可用的函数&#xff0c;MyEclipse XML编辑器包括高级XML编辑&#xff0c;例如&#xff1a; 语法高亮显示标签和属性内容辅助实时验证(当您输入时)文档内容的源&#xff08;Sou…

协同过滤推荐算法-基于Django+mysql的智能水果销售系统设计(可做计算机毕设)

随着科技的不断发展&#xff0c;智能化已经成为各行各业的趋势&#xff0c;水果销售行业也不例外。智能水果销售系统就是应运而生的一种智能化解决方案&#xff0c;它可以为用户提供更加便捷、高效的购物体验。其中&#xff0c;系统模块是智能水果销售系统的重要组成部分。 系…

postgresql 谨慎使用正则删除(%,_)

建表 CREATE TABLE public.ellistest (id bigserial NOT NULL,"name" varchar null,primary key (id) );插入数据 删除含有_线的数据 你会发现表被清空了 delete from ellistest where name like %_%原因 百分号(%)用于表示0、1或多个字符或数字。 下划线通配符…

Java【动态规划】图文详解 “路径问题模型“ , 教你手撕动态规划

文章目录 一、不同路径I1, 题目2, 思路分析2.1, 状态表示2.2, 状态转移方程2.3, 初始化2.4, 填表顺序2.5, 返回值 3, 代码 二、不同路径II1, 题目2, 思路分析2.1, 状态表示2.2, 状态转移方程2.3, 初始化2.4, 填表顺序2.5, 返回值 3, 代码 三、礼物最大价值1, 题目2, 思路分析2.…

从零基础到精通IT:探索高效学习路径与成功案例

文章目录 导语&#xff1a;第一步&#xff1a;明确学习目标与方向选择适合的IT方向设定具体的学习目标咨询和调研 第二步&#xff1a;系统学习基础知识选择适合的编程语言学习数据结构和算法掌握操作系统和计算机网络基础 第三步&#xff1a;实践项目锻炼技能选择合适的项目编写…

C语言:初阶测试错题(查漏补缺)

题一&#xff1a;字符串倒置 示例1 输入 I like beijing. 输出 beijing. like I 思路一&#xff1a; 定义字符串数组arr[ ] ,利用gets()将要倒置的字符串输入&#xff0c;记录字符串长度len&#xff0c;此时写一个逆置函数Inversion()&#xff0c;第一步将整个字符串逆置&…

基于决策树(Decision Tree)的乳腺癌诊蚓

决策树(DecisionTree)学习是以实例为基础的归纳学习算法。算法从--组无序、无规则的事例中推理出决策树表示形式的分类规则,决策树也能表示为多个If-Then规则。一般在决策树中采用“自顶向下、分而治之”的递归方式,将搜索空间分为若千个互不相交的子集,在决策树的内部节点(非叶…