Vue学习之Vue组件的核心概念

news2024/11/20 7:24:14

组件是什么

vue组件就是一个个独立的小型的ui模块,整个大型的系统就是由一个个小型的UI模块拼接而成的
在这里插入图片描述
vue组件就是vue实例,通过new Vue函数来创建的一个vue实例,不同的组件只不过是options的不同,我们基本百分之90的开发工作都是围绕options的配置来进行的

三大核心概念

属性、事件、插槽

属性

在这里插入图片描述
属性例子:

export default {
	name: "PropsDemo",
	// 不推荐使用这种做法,不利于维护
	// props: ['name', 'type', 'list', 'isVisible'],
	// 建议使用下面的做法来声明属性(使用对象的形式声明)
	props: {
		name: String,
		type: {
			validator: function(type) {
				// 这个值必须匹配以下字符串中的一个
				return ['success', 'warning', 'danger'].includes(value);
			}
		},
		list: {
			type: Array,
			// 对象或数组默认值必须从一个工厂获取
			default: () => []
		},
		isVisible: {
			type: boolean,
			default: false
		},
		// 不建议使用onChange来命名,会和语法冲突
		onChange: {
			type: Function,
			default: () => {}
		}
	}
}

属性使用方法
Props.vue文件内容如下:

<template>
    <div>
        name: {{ name }}
        <br>
        type: {{ type }}
        <br>
        list: {{ list }}
        <br>
        isVisible: {{ isVisible }}
        <br>
        <button @click="handleClick">change type</button>
    </div>
</template>

<script>
export default {
    name: 'PropsDemo',
    // 自动挂载属性
    inheritAttrs: false,
    props: {
        name: String,
        type: {
            validator: function(value) {
                return ["success", "warning", "danger"].includes(value);
            }
        },
        list: {
            type: Array,
            default: () => []
        },
        isVisible: {
            type: Boolean,
            default: false
        },
        onChild: {
            type: Function,
            default: () => {}    
        }
    },
    methods: {
        handleClick() {
            // 不可以这么做,会报错, 因为我们的属性是单向数据流的,不允许在子组件内更改父组件传递过来的值
            // this.type = "warning";
            console.log("触发")
            console.log("子组件的type是:")
            console.log(this.type)
            this.onChild(123)
        }
    }
}
</script>

App.vue文件使用如下:

<div>
    <Props
          name="Hello Vue!"
          :type="type"
          :is-visible="false"
          :on-child="handlePropChange"
          title="属性Demo"
          class="test1"
          :class="['test2']"
          :style="{ marginTop: '20px' }"
          style="margin-top: 10px;"
        />
  </div>

<script>
import Props from './components/Props.vue';

export default {
  name: 'App',
  components: {
    TodoItem,
    Props,
    // Event
  },
  data() {
    return {
      msg: "hello geek!",
      info: '',
      list: [],
      type: "success",
      name: "事件名"
    }
  },
  methods: {
    handleClick() {
        if (this.info != '') {
            this.list.push(this.info)
            this.info = ''
        }
    },
    handlePropChange(param) {
      console.log(param)
      console.log("父组件")
      if (this.type === "success") {
        this.type = "warning"
      } else {
        this.type = "success"
      }
      console.log("父组件的type")
      console.log(this.type)
    },
    handleEventChange() {

    }
  }
}
</script>

子组件中对属性进行了封装,全部在Props中,当父组件使用时,通过:属性名称的方式进行引用和赋值
子组件定义了一个函数的属性:onChild,在父组件使用这个属性时,也是和使用普通组件一样的方式,对onChild进行赋值,只不过赋的是函数,是的,函数也是作为参数来存在
此函数可以接收参数,是否接收参数,接收什么参数,取决于子组件对此函数的定义,可以看到子组件中有一个 handleClick方法,方法内部对onChild进行了调用,并传递参数123,当父组件的handlePropChange方法在接收函数时,也定义了一个参数用来接收(param):

handlePropChange(param) {
      console.log(param)
      console.log("父组件")
      if (this.type === "success") {
        this.type = "warning"
      } else {
        this.type = "success"
      }
      console.log("父组件的type")
      console.log(this.type)
    }

事件

在这里插入图片描述

定义 Even.vue文件

<template>
    <div>
        name: {{ name || '--' }}
        <br>
        <input :value="name" @change="handleChange">
        <br/>
        <br/>
        <div @click="handleDivClick">
            <button @click="handleClick">重制成功</button>
            <button @click.stop="handleClick">重制失败</button>
        </div>
    </div>
</template>

<script>
export default {
    name: 'EventDemo',
    props: {
        name: {
            type: String
        }
    },
    methods: {
        handleChange(e) {
            console.log("改变1")
            this.$emit('change', e.target.value)
            console.log("改变2")
            console.log(e.target.value)
        },
        handleDivClick() {
            console.log("清空")
            this.$emit('change', '')
        },
        handleClick() {
            // 无论做什么都会失败!
            // e.stopPropagation();
        }
    }
}
</script>

父组件引用方法:

<Event :name="eventName"  @change="handleEventChange"/>

// 导入
import Event from './components/Event.vue';

// 方法定义
handleEventChange(param) {
  console.log("父组件接收到change事件")
  if (param?.target?.value) {
    this.eventName = param?.target?.value
    console.log(param?.target?.value)
  } else {
    this.eventName = ""
  }
}

子组件定义方法: handleChange,通过this.$emit('change', e.target.value),调用change方法,传递当前输入框的值作为参数
父组件通过handleEventChange函数进行接收,并声明一个参数:param,通过param中的param?.target?.value来获取传递的参数值

插槽

在这里插入图片描述

组件文件夹内新建文件:Slot.vue

<template>
    <div>
        <slot />
        <slot name="title" />
        <slot name="item" v-bind="{ value: 'vue' }" />
    </div>
</template>
<script>
export default {
    name: "SlotDemo"
}
</script>

父组件引用部分:

<SlotDemo>
  <template v-slot:title>
    <p>title slot1</p>
    <p>title slot2</p>
  </template>
  <template v-slot:item="props">
    <p>item slot-scope {{ props }}</p>
  </template>
</SlotDemo>

// js引用
import SlotDemo from './components/Slot.vue';

子组件通过定义name="title"的插槽、name="item"的插槽,父组件通过v-slot:titlev-slot:item="props"来引用子组件定义的插槽

总结

在这里插入图片描述

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

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

相关文章

LeetCode 1448. 统计二叉树中好节点的数目:DFS

【LetMeFly】1448.统计二叉树中好节点的数目 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-good-nodes-in-binary-tree/ 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点…

4 多层感知机

多层感知机是一组前向结构的人工神经网络&#xff0c;映射一组输入向量到一组输出向量。除了输入节点&#xff0c;每一个节点都是一个带有非线性激活函数的神经元。多层感知机在输入层和输出层之间添加了一个或者多个隐藏层&#xff0c;并通过激活函数转换隐藏层输出。以下介绍…

Unity 应用消息中心-MessageCenter

Ps&#xff1a;主要解决耦合问题&#xff0c;把脚本之间的联系通过不同消息类型事件形式进行贯通 1.MessageCenter主脚本 2.DelegateEvent消息类型脚本 3.MC_Default_Data具体接收类脚本 using System; using System.Collections; using System.Collections.Generic; using …

C语言弯道超车必做好题锦集(编程题)

目录 前言&#xff1a; 1.计算日期到天数转换 2.尼科彻斯定理 3.密码检查 4.图片整理 5.寻找数组的中心下标 6.字符个数统计 7.多数元素 前言&#xff1a; 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我…

压力检测器的基本信息是什么

压力检测器利用了传感器技术、电路处理技术、无线传输技术&#xff0c;能够精准测量气体或者液体等介质的压力&#xff0c;并将测得的数据上传至监控平台。 压力检测器能够适用于供水厂、污水处理厂、消防水系统、输油管道、输气管道等相关场景&#xff0c;拥有自动补偿功能、…

你知道开发程序的流程化、模块化、规范化是怎样的?不同厂商一样吗?

Postive&#xff1a; 我在天津的公司 都是netframwork的 .......... 后来 去北京 就找core 的技术 确实感觉不是一个层次的 .......... Postive&#xff1a; 以前 在天津 就是堆业务 部署iis 点点就完事了 用个redis 就牛逼的不行了 干上core的项目才发现 授权是单独…

[C++] STL_vector使用与常用接口的模拟实现

文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back&#xff08;重点&#xff09;3.2 pop_back&#xff08;重点&#xff09;3.3 operator[]&#xff08;重点&#xff09;3.4 insert3.…

腾讯云下一代CDN -- EdgeOne加速MinIO对象存储

省流 使用MinIO作为EdgeOne的源站。 背景介绍 项目中需要一个兼容S3协议的对象存储服务&#xff0c;腾讯云的COS虽然也兼容S3协议&#xff0c;但是也只是支持简单的上传下载&#xff0c;对于上传的时候同时打标签这种需求&#xff0c;就不兼容S3了。所以决定自建一个对象存储…

基于Java+SpringBoot+vue前后端分离在线问卷调查系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

VR云游同美景邂逅,抓住暑假的小尾巴~

暑期余额不足的宝子们&#xff0c;是不是还没出门玩耍玩个够呢&#xff1f;不如趁这个时候&#xff0c;用VR云游抓住暑假的小尾巴&#xff0c;收获一波开学前的“收心之旅”吧&#xff01; VR云游相较于传统旅游来说&#xff0c;是通过个性化云服务&#xff0c;为智能景区建立综…

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

线性代数的学习和整理8:行列式相关

目录 1 从2元一次方程组求解说起 1.1 直接用方程组消元法求解 1.2 有没有其他方法呢&#xff1f;有&#xff1a;比如2阶行列式方法 1.3 3阶行列式 2 行列式的定义 2.1 矩阵里的方阵 2.2 行列式定义&#xff1a;返回值为标量的一个函数 2.3 行列式的计算公式 2.4 克拉…

189. 轮转数组

189. 轮转数组 class Solution { public:void rotate(vector<int>& nums, int k) {int n nums.size();k k % n;reverse(nums.begin(),nums.end());reverse(nums.begin(),nums.begin()k);reverse(nums.begin()k,nums.end());} };

2023年高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

最新活动报名表单系统源码 支持表单自定义+在线支付报名

分享一款最新活动报名表单系统源码&#xff0c;支持任意行业各种活动在线支付报名&#xff0c;配合万能自定义表单&#xff0c;适用于各种活动报名、课程招生、会议报名统计等等。 功能特点一览&#xff1a; 表单自定义&#xff1a;该报名系统允许组织者根据活动的需求自定义报…

Mybatis与Spring整合以及Aop整合pagehelper插件

一. Mybatis与Spring的集成 将MyBatis与Spring进行整合&#xff0c;主要解决的问题就是将SqlSessionFactory对象交由Spring容器来管理&#xff0c;所以&#xff0c;该整合&#xff0c;只需要将SqlSessionFactory的对象生成器SqlSessionFactoryBean注册在Spring容器中&#xff…

从头开始:将新项目上传至Git仓库的简易指南

无论您是一个经验丰富的开发者还是一个刚刚起步的新手&#xff0c;使用Git来管理您的项目是一个明智的选择。Git是一个强大的版本控制系统&#xff0c;它可以帮助您跟踪项目的变化、合并代码以及与团队成员协作。在本文中&#xff0c;我们将为您提供一步步的指南&#xff0c;教…

opengl shader nv格式转换

可以参考&#xff1a; OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换&#xff1f;&#xff08;全网首次开源&#xff09; - 知乎 nv12 #extension GL_OES_EGL_image_external : require precision mediump float; varying vec2 vTextureCoord; uniform sampler2D…

Matplotlib | 高阶绘图案例【1】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 绘制图布&#xff0c;设置坐标范围&#x1f3f3;️‍&#x1f308; 2. 绘制圆角矩形&#x1f3f3;️‍&#x1f308; 3. 添加水滴&#x1f3f3;️‍&#x1f308; 4. 添加时间线&#x1f3f3;️‍&#x1f308; 5. 添加文本、配色&…

ssm+vue海鲜自助餐厅系统源码和论文

ssmvue海鲜自助餐厅系统源码和论文068 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&…