vue-4:注册组件,组件传参,特殊属性ref $parent $root,透传,内置组件,自定义指令,mixins混入

news2025/2/28 6:39:43

注册组件,使用组件(项目中都是写component中)

为什么用组件:组件可以复用,每一个组件都是独立的,模板,数据,css样式互不影响

  • 全局注册组件component:请勿滥用全局组件inx 因为 全局组件会造成组件名污染

    • vue2:Vue.component("组件名", { } ) 全局组件

    • vue3:app.component(“组件名字”, { } )  全局组件

    • vue3: 局部注册组件components

    <div id="app">
            <my-header></my-header>
    </div>
    
</html>
<script src="./lib/vue.global.js"></script>
<script>
    let app =  Vue.createApp({
        data () {
            return {
                
            }
        },
        components: { // 局部组件的注册
            // 组件的名字:对象形式的配置项
            'my-header':{
                template:`<div>{{msg}}</div>`,
                data() {
                    return {
                        msg:"子组件"
                    }
                },
            }
        }
     })
     app.mount("#app")
</script>

组件传参:解决组件之间数据无法共享(单向数据流原则)

  • vue中遵循是单向数据流,数据的流向是父到子,父组件的数据变化了,props中的数据就会立马的更新

    • props:父传子(只读属性):子使用父data中数据(props 校验)

      • 父中子组件 v-bind(自定义属性)绑定属性样式,属性值就是父的数据传递给子组件

      • 在子中定义一个 props来接收场地过来的属性名

      • 接收的props上的所有的数据,都可以直接在子组件的模板上使用,也可以使用在选项中(记得带this)即:methods,watch,computed

      •     <!-- 父传子 -->
            <div id="app">
                {{fMsg}}
                <!-- 子组件 -->
                <my-kun :title="fMsg" :hei="list[0].title" :num="list[0].price"></my-kun>
            </div>
        
        </html>
        <script src="./lib/vue.global.js"></script>
        <script>
            let app = Vue.createApp({
                data() {
                    return {
                        fMsg: '父的数据在此',
                        list: [{ title: '小黑子', price: 5 }, { title: '坤坤', price: 5 }, { title: '凡凡', price: 5 }]
                    }
                }
            })
            app.component('myKun', {
                template: `<div> {{zMsg}}-----{{title}}-----{{hei}}-----{{num}} </div>`,
                // props: ['title','hei','num'],
                props: {
                    'title': [String],
                    'hei': String,
        
                    // 自定义类型校验函数
                    'num': {
                        validator(value) {
                            // The value must match one of these strings
                            return ['你好', '不好',5].includes(value)
                        }
                    },
                },
                data() {
                    return {
                        zMsg: '爱坤才会赢'
                    }
                }
            })
        
            app.mount('#app')
        </script>
    • emits:子传父(监听事件):父组件中使用子组件的数据(可以 emits 效验)

      • 父中子组件绑定事件@myclick="fuMethod"
      • 父中methods中使用 fuMethod( val ){ } 方法。用于接收子传递过来的数据,做处理
      • 而 事件名 myclick则要去子组件中 emits中接收,绑定方法,然后使用(或者直接使用) 然后两种方式使用:
        第一种: emits:['myClick'], //接收 methods:{ ziMethod(){ this.$emit('myclick', this.zMsg) } }, html中使用: @click="ziMethods"
        第二种:接收后,直接html中使用 <button @click="$emit('someEvent')">click me</button> -
      • 父中接收,methods中的fuMethod方法做接收的处理。 处理完后根据:根据单向数据流原则,也自动更新视图
      •     <!-- 父传子 -->
            <div id="app">
                {{fMsg}}
                <!-- 子组件 -->
                <my-kun @myclick="fuMethod"></my-kun>
            </div>
        
        </html>
        <script src="./lib/vue.global.js"></script>
        <script>
            let app = Vue.createApp({
                data() {
                    return {
                        fMsg: '父的数据在此',
                        list: [{ title: '小黑子', price: 5 }, { title: '坤坤', price: 5 }, { title: '凡凡', price: 5 }]
                    }
                },
                methods: {
                    fuMethod(msg) {
                        console.log(111);
                        this.fMsg = msg
                    }
                }
            })
            app.component('myKun', {
                template: `<div> {{zMsg}} <button @click="ziMethod">哈哈</button> </div>`,
                // 直接写template中
                // <button @click="$emit('someEvent')">click me</button>
        
                // emits:["myclick"],
                emits: {
                    // 
                    click: null,
        
                    // 校验 submit 事件
                    'myclick': (payload) => {
                        if (payload) {
                            return true
                        } else {
                            console.warn('忘记传参了')
                            return false
                        }
                    }
                },
                data() {
                    return {
                        zMsg: '爱坤才会赢'
                    }
                },
                methods: {
                    ziMethod() {
                        this.$emit('myclick', this.zMsg)
                    }
                }
            })
        
            app.mount('#app')
        </script>

             兄弟组件传值:

                      先实例化一个公共的通信对象eventBus.js,

                      其中一个兄弟组件通过$emit去发送触发事件 ,

                      一个组件通过$on接收监听事件

                                      vue3:中没有明确的兄弟组件传值的方案,可以使用状态提升

                                    (找到这两个组件共同的父级组件,然后通过父与子之间的传值实现)

//utils文件夹下:eventBus.js

import {createApp} from 'vue'
// 实例化通信对象,导出
export default createApp()

             跨组件传值(父传给儿子或者孙子):依赖注入(provide ,injiect) 

             一个vue文件 provide只能写一个,写多个只有最后一个生效,所以,其他方法,

             计算属性也是如此,自上而下执行代码,只有最后一个生效

特殊属性ref $parent $root

  1. ref 用于注册元素或子组件的引用。子组件最终会渲染成标签,同时传递的数据绑定在这个标签上
    数据可以通过 $attrs.属性名   来获取属性值

  2. 使用选项式 API,引用将被注册在组件的 this.$refs 对象里可以调用

  3. 放在标签上:获取的是所在标签的dom节点 放到组件上,获取子组件的方法属性

    使用方法时记得方法要加()调用。不要重复打印


  4. - $parent:写子组件内可以获取父组件的方法属性,有就获取,没有则为 null
    - $root:写子组件内可以获取 根组件的方法属性,有就获取,没有就是它自己

透传(属性):Vue3:透传属性。透传又分为自动透传绑定,和手动绑定两种。

什么是透传属性? 透传属性指组件在使用的时候,作用在组件上的属性,会被向下流动,绑定到组件内的标签中。
透传:父组件传递数据给子组件时,子组件接收父组件传递的属性  $attrs

透传作用:::
- attribute继承:子继承父:eg:class,id,style,属性,事件等头可以透传到组件内的标签中。
- 对class和style合并

 v-on监听继承
- 禁用透传属性是否继承属性: inheritAttrs: false
- 多根节点的继承:子组件使用props接收父组件传递的属性

内置组件

<KeepAlive> 缓存组件:用于包裹动态切换组件

<KeepAlive> 包裹动态组件时,会缓存不活跃的组件实例,而不是销毁它们。避免重复渲染组件(性能优化)

      is:特殊Attribute用于绑定[动态组件]

      //动态组件:包裹挂载点即可
      <keep-alive>
           <component :is="Com"></component>
      </keep-alive>

      //路由:包裹路由出口即可
      <keep-alive>
          <router-view/>
      </keep-alive>

      //属性:如果 我把两个都写了  excloud的优先级大于incloude
            include 你要缓存谁
            exclude 你不想缓存谁	
     <keep-alive exclude="Db,xxxxx,cccc">
          <!-- 设置动态组件的挂载点 -->
          <component :is="com"></component>
     </keep-alive>


    #### 钩子函数
    activated:在进入到被kepp-alive管理的组件时候触发
    deactivated:在离开被kepp-alive管理的组件时候触发
    替代 `mounted`挂载后 和 `unmounted`销毁后。
    <template>
      <div>
        aaaaaaaa
        <input type="text" />
      </div>
    </template>

    <script>
        export default {
          activated() {
            console.log("进入到了被keep-alive管理的组件中了");
          },
          deactivated() {
            console.log("离开到了被keep-alive管理的组件中了");
          },
        };
    </script>

动画组件 <Transiton />:里边只能放一个标签或者组件(使用vue官网查看)

name=" ":有名就写,没有就默认 mode="out-in"

 一共有 6 个应用于进入与离开过渡效果的 CSS class

插槽 <slot /> 组件: 自定义组件里内容

默认插槽 <slot />

具名插槽 <slot name = "" />

自定义指令

局部指令:

  • 局部指令:通过directives: { 插件名:{ 钩子函数 } } 选项来定义,只能在当前组件中使用

指令的功能:取决指令钩子的钩子函数 created,mouted,updated......

eg: 当一个 input 元素被 Vue 插入到 DOM 中后,它会被自动聚焦

全局指令:  全局指令 v-指令名使用

  • 全局指令:通过app.directive( 'cals' { })方法来定义,可以在任何组件中使用

    • 指令的功能:取决指令钩子的钩子函数 created,mouted,updated......

      • eg:

插件 :

  • 定义插件

    • export default{ install(app){ } }

  • 应用插件main.js

    • import from 导入插件

app.use(插件名) :use方法在执行的时候会 自动寻找插件的 install 方法并执行该方法,完成插件的应用

mixins :混入

作用:抽离多个组件的公共代码(选项),避免代码冗余

使用 :混入的公共代码会出现在组件的选项位置

  • import导入mixins路径

混入:data同级自动混入

可以直接使用mixins里的方法属性了

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

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

相关文章

一个打通基于XML管理Bean

目录 准备工作 添加依赖 引入配置文件 获取bean ①方式一&#xff1a;根据id获取 ②方式二&#xff1a;根据类型获取 ③方式三&#xff1a;根据id和类型 ④注意的地方 ⑤扩展知识 依赖注入之setter注入 ①创建学生类Student ②配置bean时为属性赋值 ③测试 依赖注…

Powerlink协议在嵌入式linux上的移植和主从站通信(电脑和linux板通信实验)

使用最新的openPOWERLINK 2.7.2源码&#xff0c;业余时间搞定了Powerlink协议在嵌入式linux上的移植和测试&#xff0c;并进行了下电脑和linux开发板之间的通信实验。添加了一个节点配置&#xff0c;跑通了源码中提供的主站和从站的两个demo。这里总结下移植过程分享给有需要的…

飞桨EasyDL月刊:4月功能全新升级,模型训练步骤缩短63%

亲爱的开发者&#xff1a; 近来以生成式 AI、多模态预训练大模型为代表的技术变革正席卷全球&#xff0c;与此相关的智能化工具和平台陆续发布。飞桨 EasyDL 和 BML 位于文心全景图的工具与平台层&#xff0c;提供大模型开发套件及多种建模方式&#xff0c;全面支持基于大模型能…

访客接入-唯一客服系统文档中心

网站可以通过多种方式接入客服系统&#xff0c;直接跳转链接&#xff0c;或者在页面右下角弹窗 访客链接 可以在自己的网站接入&#xff0c;访客独立链接&#xff0c;入口形式可以完全自己写&#xff0c;只是跳转链接。 例如下面的访客链接https://gofly.v1kf.com/chatIndex?k…

Angular开发之——安装Angular CLI并初始化项目(02)

一 概述 Angular CLI介绍及开发环境准备安装Angular CLI开发工具使用Angular CLI初始化Angular项目简单体验Angular 二 Angular CLI介绍及开发环境准备 2.1 Angular CLI介绍 目前&#xff0c;无论你使用什么前端框架&#xff0c;都必须要使用到各种NodeJS工具&#xff0c;An…

Leetcode 剑指 Offer II 026. 重排链表

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&a…

day32_HTML

今日内容 零、 复习昨日 一、二阶段介绍 二、HTML 零、 复习昨日 晨考 一、二阶段介绍 第一阶段: JavaSE, 对java基本语法,面向对象知识,和编程有了基本了解 第二阶段: javaweb阶段 开发入门 前端 网页(用户直接交互界面)html 网页css 美化js 动起来 - jquerybootstrap 服务器 …

C++三部曲|C++内存管理全景指南

导语 深入理解C内存管理&#xff0c;一文了解所有C内存问题&#xff0c;万字长文&#xff0c;建议收藏 随着人工智能&#xff0c;云计算等技术的迅猛发展&#xff0c;让Python&#xff0c;go等新兴语言流行了起来&#xff0c;很多人以为C可能已经过时了&#xff0c;确实&…

《vector的模拟实现》

本文主要介绍vector的常见接口的模拟实现 文章目录 vector中常用类成员二、vector的底层结构三、vector的默认成员函数构造函数1—空构造构造函数2—迭代器区间构造拷贝构造函数赋值运算符重载析构函数 四、迭代器相关的函数迭代器的分类迭代器对应的STL容器分类迭代器失效问题…

软件系统架构对测试的影响分析

我们知道软件系统的架构会对系统测试产生影响&#xff0c;而到底会产生哪些影响呢?   首先看一下软件系统架构到底是如何定义的?   软件系统架构就是组成系统的主要重要模块、过程、数据的管理和分配、用户界面的种类和风格&#xff0c;以及系统运行平台等。其中包括它们…

在MacBook上编译v3s内核出错

刚开始的时候&#xff0c;我捣鼓esp8266「现在我也还有8266的开发板&#xff0c;后面也还是会推荐」 后面&#xff0c;我推荐了esp32&#xff0c;买了esp32开发板&#xff0c;可以做uac相关的实验&#xff0c;也可以搞图形界面了。 现在&#xff0c;终于到捣鼓Linux了 PS&#…

完整的医学影像PACS系统全套源码(带三维重建)

一套完整的医学影像存储与传输系统源码&#xff0c;PACS部分主要提供医学影像获取、影像信息网络传递、大容量数据存储、影像显示和处理、影像打印等功能。 RIS主要提供分诊登记、叫号、检查报告生成和打印等功能。本套影像存储与传输系统将二者进行无缝对接&#xff0c;提供了…

Navicat Premium 15安装注教程

Navicat Premium 15安装 准备工作 下载好安装包navicat150_premium_cs_x64和安装完成Navicat Premium 15 链接&#xff1a;https://pan.baidu.com/s/1TJs3pjAXJXhu7-13DJLzpg 提取码&#xff1a;hunk 安装Navicat Premium 15 无脑操作&#xff0c;下一步下一步就行了&…

【利用AI让知识体系化】万字深入浅出Nginx

思维导图 文章目录 思维导图 第一部分&#xff1a;入门篇1.1 起步下载和安装Nginx启动NginxNginx配置文件Nginx命令行总结 1.2 Nginx的基本架构1.3 安装和配置Nginx1.4 Nginx的基本操作 第二部分&#xff1a;核心篇2.1 Nginx的请求处理2.2 Nginx的缓存机制2.3 Nginx的负载均衡机…

二叉树基础

https://www.bilibili.com/video/BV1Hy4y1t7ij/?spm_id_from333.337.search-card.all.click&vd_source168d5f618ec1a68e1f162d91a35a12b6 完全二叉树的底部一定是从左到右是连续的。满二叉树一定是完全二叉树。 二叉搜索树&#xff1a;左边左子树的所有节点都小于这个中间…

【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 参数服务器通信及ros常用工具指令介绍 0.参数服务器概念1.参数服务器增加/修改参数&#xff1a;2.参数服务器查找参数3.参数服务器删除参…

大家都是拷贝,凭什么你这么秀?

入门教程、案例源码、学习资料、读者群 请访问&#xff1a; python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 之前关于 Python 的作用域、赋值、参数传递&#xff0c;我们接连谈了几篇文章&#xff1a; Python常见问题&#xff1a;全局变量和局部变量…

Marking

Marking 题目描述 输入输出 #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll gcd(ll a,ll b) {return b0?a:gcd(b,a%b); } int main() {ll t;cin>>t;ll n,d,k;while(t--){cin>>n>>d>>k;k--;if(g…

数据结构学习分享之树的介绍

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:数据结构学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你了解更多数据结构的知识   &#x1f51d;&#x1f51d; 数据结构第六课 1. 前言&a…

5.13下周黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月12日)美市尾盘&#xff0c;现货黄金收报2010.23美元/盎司&#xff0c;下跌4.57美元或0.23%&#xff0c;日内最高触及2022.59美元/盎司&#xff0c;最低触及…