Vue---组件

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS小技巧—基于点数据的密度分析(含练习数据)

关于空间点数据的密度分析&#xff0c;Arcgis Map中提供了基础的点密度分析和核密度分析。核密度分析可以通过手动设置搜索半径&#xff0c;调整密度分布的合理性。 但有时由于实际工作的需要&#xff0c;我们需要对研究范围做特定划分&#xff0c;比如根据格网规则划分做密度…

Flask框架进阶-Flask流式输出和受访配置--纯净详解版

Flask流式输出&#x1f680; 在工作的项目当中遇到了一种情况&#xff0c;当前端页面需要对某个展示信息进行批量更新&#xff0c;如果直接将全部的数据算完之后&#xff0c;再返回更新&#xff0c;则会导致&#xff0c;前端点击刷新之后等待时间过长&#xff0c;开始考虑到用进…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频&#xff0c;用来制作教学教程。不过&#xff0c;每次录制都要通过菜单或搜索来打开录屏软件&#xff0c;实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀&#xff1f;或者有没有通用的快捷键设置方法&#xff1f;” 在当今数字时…

CMake+qt+Visual Studio

#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程&#xff0c;使用Visual Studio 开发 ##使用qt Creator 创建CMake项目 和创建pro工程的步骤一致&#xff0c;只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同 工程新建完成之后&#xff0c;构建cmake 项…

PE文件(三)节表作业

本次作业以notepad进行演示&#xff0c;如下是其在硬盘上的内存 1.手动解析节表 由标准pe头可知&#xff0c;一共由7个节也就是7个节表&#xff0c;可选pe头的大小是0X00F0&#xff0c;即240字节大小 根据上述我们所获取的信息&#xff0c;找到节表的首地址为0x01F8 .text …

微服务:Nacos注册中心

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Nacos注册中心 一、服务注册与发现1.启动Nacos…

Vite proxy-rewrite 属性详解

在前端开发中&#xff0c;为了避免跨域问题&#xff0c;我们会在vite.config.ts 中配置如下问题 rewrite: 由于不了解Nginx的知识&#xff0c;这个属性一直困扰着我&#xff0c;这个重写有啥用&#xff0c;加和不加有啥影响 server: {host: 0.0.0.0,proxy: {/api: {target: ht…

手机通讯录删除了怎么恢复?这里几个方法超快找回!

当我们不小心删除了手机通讯录中的联系人&#xff0c;或者手机丢失导致通讯录信息丢失&#xff0c;恢复通讯录就变得非常重要了。手机通讯录删除了怎么恢复&#xff1f;我们该如何快速找回这些重要的联系人信息呢&#xff1f;下面我们将介绍2种简单易行的方法&#xff0c;帮助您…

Spark核心名词解释与编程

Spark核心概念 名词解释 1)ClusterManager&#xff1a;在Standalone(上述安装的模式&#xff0c;也就是依托于spark集群本身)模式中即为Master&#xff08;主节点&#xff09;&#xff0c;控制整个集群&#xff0c;监控Worker。在YARN模式中为资源管理器ResourceManager(国内…

树莓集团整合行业资源 优化数字产业生态圈

树莓集团&#xff0c;作为国际数字影像产业园的运营方以及链主企业&#xff0c;自创立以来&#xff0c;一直致力于整合行业优质资源&#xff0c;为数字科技领域的优秀企业提供一片肥沃的创新土壤。随着信息技术的迅猛发展和数字经济的深入推进&#xff0c;树莓集团深知自身的责…

七彩虹(Colorful)隐星P16 2023款笔记本电脑原装出厂Win11系统镜像下载 带建Recovery一键还原功能

七彩虹原厂Windows预装OEM专用系统&#xff0c;恢复出厂开箱状态一模一样 适用型号&#xff1a;隐星P16 23 链接&#xff1a;https://pan.baidu.com/s/1Ig5MQMiC8k4VSuCOZRQHUw?pwdak5l 提取码&#xff1a;ak5l 原厂W11系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

机器学习在医疗行业的应用:颠覆传统诊疗模式,开启智慧医疗新时代

文章目录 一、精准诊断的突破二、药物研发的革新三、患者管理的智能化四、智能辅助决策系统五、机器学习在医疗行业的前景 随着科技的飞速发展&#xff0c;机器学习作为人工智能的核心技术&#xff0c;正逐渐渗透到各个行业中&#xff0c;其中在医疗行业的应用尤为引人瞩目。机…

Strassen矩阵乘法——C++

【题目描述】 根据课本“Strassen矩阵乘法”的基本原理&#xff0c;设计并实现一个矩阵快速乘法的工具。并演示至少10000维的矩阵快速乘法对比样例。 【功能要求】 实现普通矩阵乘法算法和“Strassen矩阵乘法”算法对相同的矩阵&#xff0c;分别用普通矩阵乘法算法&#xff…

电机控制系列模块解析(11)—— 电流采样

一、电流采样分类 由下图可知&#xff0c;采样电阻的位置不同&#xff0c;电流采样分为输出电流采样、下桥电流采样、母线电流采样。 输出电流采样 定义&#xff1a;输出电流采样是指对电机定子绕组或转子绕组&#xff08;对于内转子永磁同步电机&#xff09;输出的电流进行测…

什么是区块链?智能合约有什么用?

一、什么是区块链&#xff1f; 区块链是一种去中心化的分布式账本技术&#xff0c;通过加密和共识机制确保数据的安全和透明。它将交易数据按照时间顺序记录在区块中&#xff0c;并通过链式链接保证了数据的不可篡改性。 二、什么是智能合约&#xff1f; 智能合约是运行在区…

如何修改php版本

我使用的Hostease的Windows虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在Plesk面板上找到此切换PHP版本的按钮…

linux tcpdump的交叉编译以及使用

一、源码下载 官网&#xff1a;点击跳转 二、编译 1、解压 tar -xf libpcap-1.10.4.tar.xz tar -xf tcpdump-4.99.4.tar.xz 2、配置及编译 //libpcap&#xff1a; ./configure --hostarm-linux --targetarm-linux CCarm-linux-gcc --with-pcaplinux --prefix$PWD/build//t…

37 线程控制

内核中没有明确的线程的概念&#xff0c;线程作为轻量级进程。所以不会提供线程的系统调用&#xff0c;只提供了轻量级进程的系统调用&#xff0c;但这个接口比较复杂&#xff0c;使用很不方便&#xff0c;我们用户&#xff0c;需要一个线程的接口。应用层对轻量级进程的接口进…

企业如何保证内部传输文件使用的工具是安全的?

企业内部文件的频繁交换成为了日常运营不可或缺的一环。然而&#xff0c;随着数据量的爆炸式增长和网络攻击手段的日益复杂&#xff0c;内网文件传输的安全隐患也日益凸显&#xff0c;成为企业信息安全的薄弱环节。本文将探讨内网文件传输的安全风险、企业常用的防护措施。 内网…