Vue组件基础(父向子、子向父、子向子传值)

news2025/2/24 14:04:44

Vue组件基础-父向子、子向父、子向子传值

  • 一、Vue组件概念,创建和使用
    • 1.1 组件概念
    • 1.2 组件基础使用
    • 1.3 组件-scoped作用
  • 二、Vue组件通信
    • 2.1 父向子传值(props)
    • 2.2 子向父传值($emit)
    • 2.3 子与子传值(EventBus)

一、Vue组件概念,创建和使用

1.1 组件概念

组件是可复用的Vue实例,封装标签,样式和JS代码

组件化:封装的思想,把页面上 可复用的部分 封装为 组件,从而方便项目的开发和维护

一个页面,可以拆分成一个个组件,一个组件就是一个整体,每个组件可以有自己独立的结构 样式 和 行为(html,css,js)

  • 组件的好处:各自独立,互不影响

在这里插入图片描述

1.2 组件基础使用

每个组件都是一个独立的个体, 代码里体现为一个独立的.vue文件

  • 1.创建组件 封装要复用的标签, 样式, JS代码
  • 2.注册组件
    • 全局注册组件 -main.js中
    • 局部注册组件 -某.vue文件中

全局注册组件

//组件的基本使用--全局注册
//1.创建组件 组件名.vue
//2.引入组件 
import Pannel from './components/Pannel_1.vue'

//3.全局注册组件
Vue.component('PannelG', Pannel)

局部注册组件

//组件--局部注册
//a.创建组件 组件名.vue
//b.引入组件
import Pannel from './components/Pannel.vue'
export default {
  //c.局部注册组件
  components: {
    Pannel: Pannel   //键 和 值相同可简写为 Pannel
  },
 }

在这里插入图片描述

  • 3.使用组件
  <div id="app">
    <h3>案例:折叠面板</h3>
    <!-- d.组件使用 -->
    <Pannel></Pannel>
  </div>

1.3 组件-scoped作用

  • 准备: 当前组件内标签都被添加 data-v-hash值 的属性
  • 获取: css选择器都被添加 [data-v-hash值] 的属性选择器
    在这里插入图片描述
    在这里插入图片描述

二、Vue组件通信

2.1 父向子传值(props)

父组件 -> 子组件 传值

  • 子组件(被引入的叫做子组件)
  • 父组件(引入其他组件的页面)

步骤

  • 1.子组件内, 定义变量, 准备接收, 然后使用变量
    在这里插入图片描述
<template>
    <div class="my-product">
        <h3>标题: {{ title }}</h3>
        <p>价格: {{ price }}</p>
        <p>{{ intop }}</p>
    </div>
</template>
  
<script>
export default {
    // a.子组件 定义变量
    props: ['title', 'price', 'intop']
}
</script>
  
  • 2.父组件内, 要展示封装的子组件
    • 引入组件, 注册组件, 使用组件, 传值进去
      在这里插入图片描述
<template>
  <div>
    <!-- 目标:(app.vue) 向 子组件传值 -->
    <!-- 每次组件显示不同的数据信息 -->
    <!-- 步骤 -->
    <!-- a.子组件定义变量 接受变量 -->
    <!-- b.父组件 传值进去 -->
    <!-- 3.使用组件 -->
    <MyProduct title="好吃的口水鸡" price="50" intop="开业大酬宾, 全场八折"></MyProduct>
  </div>
</template>

<script>
//1.引入组件
import MyProduct from './components/MyProduct.vue'
export default {
  // 2.注册组件
  components: {
    MyProduct //key和value值 重名了  可以简写
  }
}

父传子配合v-for循环使用

在这里插入图片描述

单项数据流

  • 从父到子的数据流向, 叫单向数据流
    在这里插入图片描述
  • 子组件内直接改变父组件传过来的值(props),不通知父级,会报错,数据不一致性
  • Vue规定props里的变量, 本身是只读的

2.2 子向父传值($emit)

子组件触发父自定义事件方法

步骤

  • 1.父组件内, 绑定自定义事件和事件处理函数
    • 语法: @自定义事件名="父methods里函数名"
      在这里插入图片描述
      在这里插入图片描述

父组件完整代码


<template>
  <div>
    <!-- 目标子穿父 -->
    <!-- 第一步  父组件 @自定义事件名="父函数名"-->
    <MyProductsub v-for="(obj, ind) in list" :key="obj.id" :title="obj.proname" :price="obj.proprice" :intop="obj.info"
      :index="ind" @subprice="fn">
    </MyProductsub>
  </div>
</template>

<script>
//目标 循环组件 分别传入数据
//1.引入组件
import MyProductsub from './components/MyProduct_sub.vue';
export default {
  //2.注册组件
  components: {
    MyProductsub
  },
  data() {
    return {
      list: [
        { id: 1, proname: "超级好吃的棒棒糖", proprice: 18.8, info: '开业大酬宾, 全场8折' },
        { id: 2, proname: "超级好吃的大鸡腿", proprice: 34.2, info: '好吃不腻, 快来买啊' },
        { id: 3, proname: "超级无敌的冰激凌", proprice: 14.2, info: '炎热的夏天, 来个冰激凌了' },
      ],
    }
  },
  methods: {
    fn(index, price) {
      //逻辑代码
      this.list[index].proprice > 1 && (this.list[index].proprice = (this.list[index].proprice - price).toFixed(2))
    }
  }
}
</script>
  • 2.子组件触发父自定义事件方法 调用$emit方法
    在这里插入图片描述

子组件完整代码

<template>
    <div class="my-product">
        <h3>标题: {{ title }}</h3>
        <p>价格: {{ price }}</p>
        <p>{{ intop }}</p>
        <button @click="btn_sub">宝刀-1</button>
    </div>
</template>
  
<script>
//1.引入空白vue对象(EventBus) 
import eventBus from '../EventBus'
export default {
    // a.子组件 定义变量
    props: ['index', 'title', 'price', 'intop'],
    methods: {
        //砍价方法
        btn_sub() {
            //错误
            //1.子组件改父组件传过来的数据  不通知父亲 会造成数据的不一行
            //2.vue回顶props 本身 只读的(不允许重新赋值)
            // this.price--
            //第二步 触发父亲的自定义事件 并传值
            this.$emit('subprice', this.index, 1)
        }
    }
}
</script>

2.3 子与子传值(EventBus)

App.vue里引入MyProduct.vue和List.vue

在这里插入图片描述

组件通信-EventBus

  • 常用于跨组件通信时使用
    在这里插入图片描述

步骤

  • 1.src/EventBus/index.js – 创建空白Vue对象并导出
//引入Vue
import Vue from 'vue'

//导出 空白的vue对象
export default new Vue()
  • 2.在要接收值的组件(List.vue) eventBus.$on('事件名', 函数体)
    在这里插入图片描述
//目标:跨组件传值
//1.引入空白vue对象(EventBus)
import eventBus from '../EventBus/index.js'   //默认查找index.js
//2.接收方 $on监听事件
export default {
    props: ['arr'],
    //3.组件创建完毕后  在created生命周期中 监听send事件
    created() {
        eventBus.$on('send', (index, price) => {
            this.arr[index].proprice > 1 && (this.arr[index].proprice = (this.arr[index].proprice - price).toFixed(2))
        })
    }
}
  • 3.在要传递值的组件(MyProduct.vue) eventBus.$emit('事件名', 值)
    在这里插入图片描述
//1.引入空白vue对象(EventBus) 
import eventBus from '../EventBus'
export default {
    // a.子组件 定义变量
    props: ['index', 'title', 'price', 'intop'],
    methods: {
        //砍价方法
        btn_sub() {
            eventBus.$emit('send', this.index, 1)
        }
    }
}

在这里插入图片描述

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

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

相关文章

【100个 Unity实用技能】 | 脚本无需挂载到游戏对象上也可执行的方法

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

springboot使用ssh公钥连接mysql(含账号密码连接)

引言 在项目开发过程中&#xff0c;遇到了连接数据库时需要使用ssh公钥的情况。在本地使用navicat可以直接通过可视化界面去进行ssh的连接&#xff0c;但是在java中无法直接去进行连接。 后来经过查询资料&#xff0c;发现必须要在java中编写相关配置文件后才可以正常连接。 …

Linux内核源码进程原理分析

Linux内核源码进程原理分析一、Linux 内核架构图二、进程基础知识三、Linux 进程四要素四、task_struct 数据结构主要成员五、创建新进程分析六、剖析进程状态迁移七、写时复制技术一、Linux 内核架构图 二、进程基础知识 Linux 内核把进程称为任务(task)&#xff0c;进程的虚…

Linux下MQTT客户端消息订阅与发布实现

MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议。它基于TCP协议&#xff0c;默认端口号为1883&#xff0c;为此&#xff0c;它也需要一个消息中间件 。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。在很多情况下…

蓝桥杯三月刷题 第一天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;数列求值&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;质数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;饮料换购&#x1f914;一、思路:&#x1f60e;二、代…

23.3.4打卡 AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)A~E

F题题面都看不懂嘞!开摆! 没找到合适的markdown, 截图网页翻译了我真是天才 比赛链接: https://atcoder.jp/contests/abc291 A题 题意 给出一个字符串, 找到第一个大写字母的下标 简单题就不多说了, 直接放代码 代码 void solve() {cin>>str;nstr.size();str"…

CentOS7操作系统安装nginx实战(多种方法,超详细)

文章目录前言一. 实验环境二. 使用yum安装nginx2.1 添加yum源2.1.1 使用官网提供的源地址&#xff08;方法一&#xff09;2.1.2 使用epel的方式进行安装&#xff08;方法二&#xff09;2.2 开始安装nginx2.3 启动并进行测试2.4 其他的一些用法&#xff1a;三. 编译方式安装ngin…

Kali、Metasploitable2部署

1、安装VMWare虚拟机及metasploitable2软件 链接&#xff1a;https://pan.baidu.com/s/1rqhjh1P9VJg5Q1esBgpZ-A 提取码&#xff1a;dc66 metasploitable2部署很简单&#xff0c;解压后&#xff0c;直接双击后缀.vmx文件&#xff0c;默认账户msfadmin/msfadmin&#xff0c;sud…

php实训报告

实训一 PHP语法基础 一、实训目的 掌握PHP数据类型知识。掌握PHP变量与常量的知识和运用方法。掌握PHP选择结构流程控制的知识及应用。掌握PHP循环结构流程控制的知识及应用。 二、实训工具或设备 主流 PC 机一台&#xff08;要求安装 windows 操作系统&#xff09;&#xff…

基于m-p条件查询代码生成

目录 起因 演示 使用 0.自定义注解 1.定义一个dto的条件查询类 2.调用主程序 效果图 小结 代码 注解 Dto类 完整代码 起因 最近两天一直写后台管理统计的增删改查(很少写增删改查&#xff0c;所以不是很熟练)&#xff0c;几乎每个表都要涉及到条件查询的业务&#xf…

7个常用的原生JS数组方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 7个常用的原生JS数组方法一、Array.map()二、Array.filter三、Array.reduce四、Array.forEach五、Array.find六、Array.every七、Array.some总结一、Array.map() 作用&#…

Transformer 模型:入门详解(1)

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 众所周知&#xff0c;transformer 架构是自然语言处理 (NLP) 领域的一项突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;无法捕获文本中的长期依赖性的局限性。事实证明&#xff0c;transformer 架构是…

【数据结构初阶】详解“树”

目录 前言 1.树概念及结构 &#xff08;1&#xff09;树的概念 &#xff08;2&#xff09;树的名词介绍 &#xff08;3&#xff09;树的表示 ​编辑 2.二叉树概念及结构 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特殊的二叉树 &#xff08;3&#xff0…

sizeof与strlen练习

前言 本篇仅仅是为了更加了解sizeof操作符和strlen函数练习. 对于多条sizeof操作符和strlen函数出现,可能很容易造成头脑不清晰,做题时容易混乱. 目录前言一维数组字符数组情况1:情况2情况3二维数组练习之前请牢记下面这段话.这将是头脑清晰地关键. 提示: sizeof(数组名)&#…

MyBatis高频面试专题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

【ID:17】【20分】A. DS顺序表--类实现

时间限制1秒内存限制128兆字节题目描述用C语言和类实现顺序表属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09;操作包括&#xff1a;创建、插入、删除、查找类定义参考输入第1行先输入n表示有n个数据&#xff0c;即n是实际长度;接着输入n个数据…

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第三题:迁移

迁移 题目 将一台AD服务器迁移到FusionCompute平台,并保障业务正常。 思维导图 markmap内容1 文字介绍 准备Rainbow服务器:在Windows系统安装Rainbow,必须保证其与源端主机、目的端平台互通。关闭防火墙。【首次登录rainbow时,需要注册用户名和密码,考试时根据考题要…

989. 数组形式的整数加法

989. 数组形式的整数加法https://leetcode.cn/problems/add-to-array-form-of-integer/ 难度简单226 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组…

【Linux】进程等待 | 详解 wait/waitpid 的 status 参数

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;在上一章中我们讲解了进程创建与进程终止&#xff0c;本章我们开始讲解进程等待。进程等待这部分知识相较于前面还是较为复杂的&#xff0…

Vue2的生命周期(详解)

Vue的生命周期一、生命周期的概念二、钩子函数三、Vue2的生命周期3.1 初始化阶段3.2 挂载阶段3.3 更新阶段3.4 销毁阶段一、生命周期的概念 Vue实例的生命周期: 从创建到销毁的整个过程 二、钩子函数 Vue框架内置函数,随着组件的生命周期阶段,自动执行 作用:特定的时间点,执行特…