Vue---组件

news2024/12/27 13:22:02

Vue—组件

目录

  • Vue---组件
    • 定义组件
      • 全局组件
      • 局部组件
    • 组件通讯`***重点***`
      • 父子通信之父传子(props)
      • 父子通信之子传父($emit)
      • ref属性($refs)
    • 动态组件
    • 插槽
    • 命名插槽

定义组件

全局组件

  • vue2中template只能传递单标签,若要定义多个标签需要用div或其他包裹,vue3随意
<div id="app">
    <Child1></Child1>
</div>
Vue.component('Child1', {
    template: `
      <p>我是{{ name }}</p>
    `,
    data() {
        return {name: '组件1'}
    },
})

局部组件

局部组件在注册后只能在当前实例或者是组件中使用

  • 标签的命名只有首字母能大写,其余地方大写会直接报错
<div id="app2">
    <mydiv></mydiv>
</div>
// 写法1
const vm2 = new Vue({
    el: '#app2',
    components: {
        'mydiv': {
            template: `<p>我是{{ name }}</p>`,
            data() {
                return {name: '组件2'}
            }
        }
    }
})
// 写法2
let mydiv = {
    template: `<p>我是{{ name }}</p>`,
    data() {
        return {name: '组件2'}
    }
}
const vm2 = new Vue({
    el: '#app2',
    components: {
        mydiv
    }
})

组件通讯***重点***

在局部注册组件中我们是将组件注册到了vue根组件中,这里的根组件(**const vm2 = new Vue({})**这部分)也就是父组件,那么他和局部组件(子)传递数据的过程就叫组件通讯

<div id="app2"> // 父
    <mydiv></mydiv>	// 子
</div>

父子通信之父传子(props)

  • 关键字props:通过 props,父组件可以向子组件传递数据,子组件可以接收父组件传递的数据并在内部使用
  • 案例中<qwe :name="info.name" :age="info.age"></qwe>的name和age其实就相当于是由props赋予的属性,因为在原根组件中是没有这两个属性的,他们是由props传递过来的
<div id="app">
    <qwe :name="info.name" :age="info.age"></qwe>
</div>
let qwe = {
    template: `
      <div>
        <p>你好</p>
        <p>{{ name }}</p>
        <p>{{ age }}</p>
      </div>
    `,
    props:['name','age']
}
const vm = new Vue({
    el: '#app',
    data: {
        info: {'name': '张三', 'age': 18}
    },
    components: {
        qwe
    }
})
  • props应传递字符串形式属性名,并且与data不要存在同名属性

image-20240428162406361

父子通信之子传父($emit)

  • 关键字$emit:通过 $emit,子组件可以向父组件发送自定义事件,父组件可以监听这些事件并做出相应的处理
<div id="app">
    // getchild为自定义事件,用于子传父
    <child1 @getchild="handleGetChild"></child1>
    我儿子叫{{childname}}
</div>
var child1 = {
    template:
            `
              <button @click="handleSend">点我获得儿子</button>
            `,
    data() {
        return {'name': '张三'}
    },
    methods: {
        handleSend() {
            // 传递this.name给父组件,也就是'张三'
            this.$emit('getchild', this.name)
        }
    }
}
const vm = new Vue({
    el: '#app',
    data: {
        childname: ''
    },
    components: {
        child1
    },
    methods: {
        handleGetChild(info) {
            // info是子组件传递来的数据
            this.childname = info
        }
    }
})

image-20240428170445350

ref属性($refs)

  • $refs关键字:可以从子组件、父组件、任意其他组件中获取数据、调用函数

沿用上述示例:

<div id="app">
    // 新增绑定事件childRef
    <child1 @getchild="handleGetChild" ref="childRef"></child1>
    我儿子叫{{childname}}
</div>
var child1 = {
    template:
            `
              <button @click="handleSend">点我获得儿子</button>
            `,
    data() {
        return {'name': '张三'}
    },
    methods: {
        handleSend() {
            this.$emit('getchild', this.name)
        },
        sayHello(){
            console.log('你好')}
    }
}
const vm = new Vue({
    el: '#app',
    data: {
        childname: ''
    },
    components: {
        child1
    },
    methods: {
        handleGetChild(info) {
            // 打印子组件中的数据
            console.log(this.$refs.childRef.name)
            // 触发子组件中的函数satHello()
            this.$refs.childRef.sayHello()
            this.childname = info
        }
    }
})
  • 此时点击按钮后会在控制台打印’张三 你好’

动态组件

  • is关键字:可以接受一个组件名或对象,并根据该值渲染对应组件
<div id="app">
    <button @click="handleSwitch(1)">点我打开组件1</button>
    <button @click="handleSwitch(2)">点我打开组件2</button>
    <button @click="handleSwitch(3)">点我打开组件3</button>
    <components :is="current"></components>
</div>
var mydiv1 = {
    template:
        `
        <div>我是组件1</div>
        `
}
var mydiv2 = {
    template:
        `
        <div>我是组件2</div>
        `
}
var mydiv3 = {
    template:
        `
        <div>我是组件3</div>
        `
}
var vm = new Vue({
    el: '#app',
    data: {
        current: '',
        switchList: [mydiv1, mydiv2, mydiv3]
    },
    components: {
        mydiv1,
        mydiv2,
        mydiv3,
    },
    methods: {
        handleSwitch(s) {
            this.current = this.switchList[s - 1]
        }
    }
})

插槽

一般情况下,组件内的内容都是写死的,只能通过通信或修改组件本身,这导致其扩展性非常差,因此出现了插槽这一概念,只需在组件中添加<slot></slot>,就可以在body的组件标签中添加内容

<div id="app">
    <p>-----父组件开始-----</p>
    <mydiv></mydiv>
    <mydiv><button>来自插槽的按钮</button></mydiv>
    <mydiv>我是父组件,来占插槽的</mydiv>
    <p>-----父组件结束-----</p>
</div>
var mydiv = {
    template:
        `
        <div>
            <p>----插槽开始----</p>
            <slot></slot>
            <p>----插槽结束----</p>
        </div>
        `
}
var vm = new Vue({
    el:'#app',
    components:{
        mydiv
    }
})
  • 每个插槽都会接受父组件插入的所有数据
  • 当插槽未被使用时他会沿用上一个父组件
<div id="app">
    <p>-----父组件开始-----</p>
    <mydiv><button>来自插槽的按钮</button></mydiv>
    <p>-----父组件结束-----</p>
</div>
template:
`
<div>
<p>----插槽开始----</p>
<slot></slot>
<slot></slot>
<p>----插槽结束----</p>
</div>
`

image-20240428200902587

命名插槽

  • 命名插槽的好处,不会因为未使用插槽而自动填充
<div id="app">
    <p>-----父组件开始-----</p>
    <mydiv v-slot:a><button>来自插槽的按钮</button></mydiv>
    <p>-----父组件结束-----</p>
</div>
    var mydiv = {
        template:
            `
            <div>
                <p>----插槽开始----</p>
                <slot name="a"></slot>
                <slot name="b"></slot>
                <p>----插槽结束----</p>
            </div>
            `
    }
    var vm = new Vue({
        el:'#app',
        components:{
            mydiv
        }
    })

image-20240428201022376

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

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

相关文章

2.Neo4j的搭建启动

Graph Database 图数据库 版本对应关系 官网都是高版本&#xff0c;推荐使用下载地址可以找到社区老版本&#xff1a; https://we-yun.com/doc/neo4j/ neo4j.bat 启动脚本 cypher-shell.bat 执行CQL语句的。 import文件夹可以放入excel,csv等数据文件&#xff0c;导入到…

IMU/捷联惯导常见的术语,以及性能评价标准(附Python解析代码)

0. 简介 现在的机器人领域在普遍使用IMU&#xff08;惯性导航单元&#xff09;。该系统有三个加速度传感器与三个角速度传感器&#xff08;陀螺&#xff09;组成&#xff0c;加速度计用来感受飞机相对于地垂线的加速度分量&#xff0c;陀螺仪用来感知飞机的角速率变化&#xff…

服务器被CC攻击怎么办

遇到CC攻击时&#xff0c;可采取以下措施&#xff1a;限制IP访问频率、启用防DDoS服务、配置Web应用防火墙、增加服务器带宽、使用负载均衡分散请求压力。 处理服务器遭遇CC攻击的方法如下&#xff1a; 1. 确认攻击 你需要确认服务器是否真的遭受了CC攻击&#xff0c;这可以…

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…

张大哥笔记:我付钱了,我就是大爷?

很抱歉用这个当做标题&#xff0c;来给大家分享一些电商的故事&#xff01;大家好&#xff0c;我是张大哥&#xff0c;今天聊聊在电商路上遇到过的奇葩买家&#xff1f; 比如最近我在做PDD的时候&#xff0c;就会遇到很多莫名其妙的sha子&#xff0c;咱是知识份子&#xff0c;肯…

Excel vlookup函数的使用教程 和 可能遇到的错误解决方法

使用VLOOKUP示例 被查询的表格 表一 A列B列C列A1aB2bC3c 要匹配的列 表二 F列G列H列ACBDA 要G列匹配字母&#xff0c;H列匹配数字 G 使用公式VLOOKUP(F5,A:D,3,0) 参数说明 F5 是表二 F列第五行的A A:D表是要匹配的数据列表在A到D列&#xff0c;就是表一 &#xff08;注意…

go 安装软件报go.mod file not found

执行 go get -u github.com/go-sql-driver/mysql 下载mysql 报错 解决方法: 控制台&#xff1a;输入go env 返回如下&#xff1a; 红圈值为NUL&#xff0c;需要设置GOMOD的值, 然后再控制台执行 &#xff08;1&#xff09;mkdir mod (2)go mod init mod 然后再执行下载&…

Linux逻辑方式合并物理磁盘

在日常生活中&#xff0c;我们总是遇到一个文件太大&#xff0c;以至于我们的两个磁盘都装不下&#xff0c;这时我们就需要将两块物理磁盘逻辑化的连接在一起&#xff0c;把物理磁盘使用逻辑化的方法合并在一起&#xff0c;形成卷组&#xff0c;使得磁盘空间可以公用&#xff1…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作&#xff0c; commit&#xff1a;命令用于将你的代码变更保存到本地代码仓库中&#xff0c;它创建了一个新的提交&#xff08;commit…

Python 操作PDF图片 – 添加、替换、删除PDF中的图片

PDF文件中的图片可以丰富文档内容&#xff0c;提升用户的阅读体验。除了在PDF中添加图片外&#xff0c;有时也需要替换或删除其中的图片&#xff0c;以改进视觉效果或更新信息。文本将提供以下三个示例&#xff0c;介绍如何使用Python 操作PDF文件中的图片&#xff1a; 目录 …

2017年全国职业院校技能大赛高职组“信息安全管理与评估”样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后&#xff0c;查找时间过长的问题&#xff0c;将链表存储变为红黑树存储。 put方法的实现&#xff08;5⭐&#xff09; 相关属性&#xff1a; 1. 容量&#xff1a;初始容量为2^4。 2. 加载因子&#xff1a;初始值为0.75 上面两个属性的…

linux网络编程启动!(开端)

网络设计模式 &#xff1a;就两种模型 b/s 模型 : 浏览器—>服务器 优点是&#xff1a;跨平台。开发成本低 缺点是&#xff1a;网络通信的时候必须要使用http/https协议 http协议 是个应用层协议 不能在磁盘缓存或者从磁盘加载大量数据 http 与https 多了一层加密 c/s模型 …

【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令&#xff0c;直到特定的条件被满足为止。这重复执行的一组指令就叫做循环 特点&#xff1a; 首先&#xff0c;循环条件中使用的变量必须是已初始化的&#xff0c;然后在循环中开始执行每次在循环开始时进行一次测试重复地执行一个代码块 循环实例…

OpenHarmony 实战开发——分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动&#xff0c;进行拼单的场景&#xff1b;实现两人拼单时&#xff0c;其他一人添加商品到购物车&#xff0c;另外一人购物车列表能同步更新&#xff0c;且在购物车列表页面结算时&#xff0c;某一人结算对方也能实时知道结…

【无监督+自然语言】 GPT,BERT, GPT-2,GPT-3 生成式预训练模型方法概述 (Generative Pre-Traning)

主要参考 【GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【李沐论文精读】-2022.03.04】 https://www.bilibili.com/video/BV1AF411b7xQ/ 大语言模型综述&#xff1a; https://blog.csdn.net/imwaters/article/details/137019747 GPT与chatgpt的关系 图源&#xff1a;L…

JMeter的下载安装与使用(Mac)

1、下载地址​​​​​​https://jmeter.apache.org/download_jmeter.cgi 2、下载Binaries 下的apache-jmeter5.5.tgz 3、解压 4、启动 在bin目录下打开终端&#xff0c;输入sh jmeter 出现jmeter首页界面&#xff0c;即为成功。 5、使用 5.1 语言选择 option选项卡&am…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图&#xff1a; 报错的代码 报错的代码如下&#xff1a; overridevoid initState() async{super.initState();await getConf…

LoRA 引领多模态模型革命,大模型的微调方案

基于LoRA微调多模态大模型 随着 ChatGPT 的火爆&#xff0c;大模型时代降临&#xff0c;普通人难以进行全量微调。 参数高效微调技术应运而生&#xff0c;为科研人员和开发者提供了微调大模型的机会。 用 LoRA 微调 2.7B 参数的 blip2-opt 模型&#xff0c;提升图生文能力&am…

嵌入式学习——C语言基础——day11

1. 字符型数组和字符串的传参 1.1 常量和变量的区别&#xff08;难点&#xff09; 一般常量不能被修改&#xff0c;变量才能被修改 #include <stdio.h> int main(void) { char str[] {"hello world"};//定义数组&#xff0c;数组名为指针常量 char …