Vue 组件传参 prop向下传递、emit向上传递

news/2024/7/10 1:29:33 标签: vue

组件传参


学习了组件用法,就像一种嵌套引用关系,在这个关系中,经常会涉及相互传数据的需求,即父组件传子组件,子组件传父组件。

父、子组件的关系可以总结为 : prop 向下传递(和事件无关), emit 事件(包含事件)向上传递。
如下图所示: 所有的组件组成了完整的页面,但是组件里里面的数据与组件之间的数据是相互进行数据传递的。( 组件之间存在着相互引用,这就存在了父子关系

有时候子组件页面的展示,展示什么样的内容是由父组件决定的,这时候父组件给子组件传参的时候就需要通过参数告诉子组件需要展示什么样的内容。

父组件里面:<HelloWorld msg="Welcome to Your Vue.js App"/>
--------------------------------------------------------------------
子组件里面:
<script>
export default {
  name: 'HelloWorld',
//父组件App.vue传给子组件HelloWorld的数据
//谁使用了这个页面就给这个组件传值
  props: {
    msg: String
  }
}
</script>

//然后将要传递的值放在template里面的h1里面去做展示
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>

HelloWorld这个组件(页面),它的标题是由父组件App.vue来决定内容的。

 <HelloWorld msg="父亲组件App 子组件HelloWorld"/>

 

 

 

 props向下传递


先去子组件里面定义props,在props里面定义要向下传递的数据content。

<template>
    <div>
        <button type="button" @click="btn()">TestVue</button><br>
        {{ content }}
    </div>    
</template>


<script>
//这里不使用vue2的语法
export default ({
    //定义父组件传递给子组件的数据,属性名字为content,类型为string
    data() {
        return{
        }
    },
    methods:{
        //在js当中使用props数据
        btn(){
            alert("content内容为:" + this.content)
        }
    },
    props:{
        content: String,
    }
})
</script>

然后去父亲组件里面定义要传递的数据。 

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <Test content="父亲组件App 子组件Test"></Test>
  <HelloWorld msg="父亲组件App 子组件HelloWorld"/>
</template>

上面就是父传子的一个方式,有点像定义了一个标签,然后将属性传递进去,这个属性在子组件里面可以放在模板里面使用或者放在script里面使用,都行。

v-bind的方式传参:这样可以通过动态绑定的方式传递进去,子组件可以使用父组件的数据,相当于子组件就是父组件里面的html标签

<template>
    <div>
        <button type="button" @click="btn()">TestVue</button><br>
        {{ content }}<br> 
        {{ name }}
    </div>    
</template>


<script>
//这里不使用vue2的语法
export default ({
    //定义父组件传递给子组件的数据,属性名字为content,类型为string
    data() {
        return{

        }
    },
    methods:{
        //在js当中使用props数据
        btn(){
            alert("content内容为:" + this.content + this.name)
        }
    },
    props:{
        content: String,
        name: String
    }
})
</script>


<template>
  <img alt="Vue logo" src="./assets/logo.png">

//这里使用v-bind使用父组件的数据
  <Test :name="AppName" content="父亲组件App 子组件Test"></Test>

  <HelloWorld  msg="父亲组件App 子组件HelloWorld" />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data(){
    return{
      AppName: "lucas"
    }
  }
}
</script>

 

 

emit子传父


如果子组件里面的数据发生了变化,父组件要拿到变化的数据,这怎么办?在子组件里面定义好emit事件名称,在父组件里面使用v-on进行接收。接受的是一个方法,方法并且不能使用括号。

这里的事件名称自定义即可。之前大部分事件都是内置的click keybord:enter这种事件,现在可以在子组件里面去定义自己的事件了。

如果你要监听很多数据,可以将这些数据放在一个对象里面统一做处理。

<template>
    <div>
        <button type="button" @click="btn()">子传父按钮</button><br>
    </div>    
</template>


<script>
//这里不使用vue2的语法
export default ({
    //定义父组件传递给子组件的数据,属性名字为content,类型为string
    data() {
        return{

        }
    },
    methods:{
        //在js当中使用props数据
        btn(){
            //vue自带的emit事件,将数据传递给父组件
            //第一个参数是事件名,第二个参数是数据名称
            this.$emit('childEvent',"子组件事件childEvent传来的数据")
        }
    },
    props:{

    }
})
</script>

 父组件

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <!--监听子组件childEvent事件,绑定receive方法接受子组件传过来的参数,
    然后就是赋值操作,赋值完之后在模板里面显示
  -->
  <Test @childEvent="receive"></Test><br>
  <p style="color:brown">子组件Test传来的数据:{{ TestMsg }}</p>
  <HelloWorld  msg="父亲组件App 子组件HelloWorld" />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  data(){
    return{
      TestMsg: ''
    }
  },
  methods:{
    receive(data){
      alert(data)
      this.TestMsg = data
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

http://www.niftyadmin.cn/n/5279053.html

相关文章

鸿蒙OS应用开发之切换按钮

前面学习很多按钮,可以满足基本的使用,但是很多情况下,只有二选一的需求,这时采用切换按钮,就会让程序更加直观,并且切换按钮可以显示比较大一点,在手机上操作会更加方便。 像下面这些都是切换按钮: 在鸿蒙系统里也定义有相关的切换按钮: Toggle(options: { type: T…

常见加解密算法分析(含使用场景)

加密算法主要分为三类&#xff1a;对称加密算法、非对称加密算法和散列算法。下面将分别介绍这些类别中的常见算法及其特点和使用场景。 对称加密算法 1. AES (Advanced Encryption Standard) AES是一种广泛使用的对称加密标准&#xff0c;可以使用128、192和256位的密钥长度…

前端性能优化五:css和js位置

1. 精简HTML代码: ①. css链接文件尽量放在页面头部:a. css的加载不会阻塞DOM Tree的解析.b. 但会阻塞DOM Tree渲染,也会阻塞后面JS的执行.c. 将css放在任何body元素之前:(1). 可以确保在文档中解析了所有css的样式包括内联样式和外联的.(2). 减少了浏览器必须重排文档的次数.…

CAPL中return,break,continue的用法和区别

文章目录 returnbreakcontinue总结其他示例return,break,continue的用法在众多语言中的用法基本是一致的。 CAPL(CAN Application Programming Language)是Vector Informatik GmbH开发的一种专门用于其CANoe和CANalyzer测试软件的脚本语言。它用于模拟CAN总线上的节点,监控…

Spark中使用scala完成数据抽取任务 -- 总结

如题 任务二&#xff1a;离线数据处理&#xff0c;校赛题目需要使用spark框架将mysql数据库中ds_db01数据库的user_info表的内容抽取到Hive库的user_info表中&#xff0c;并且添加一个字段设置字段的格式 第二个任务和第一个的内容几乎一样。 在该任务中主要需要完成以下几个阶…

移动安全APP--Frida+模拟器,模拟器+burp联动

最近测APP被通报了&#xff0c;问题点测得比较深&#xff0c;涉及到frida和burp抓包&#xff0c;一般在公司可能会有网络的限制&#xff0c;手机没办法抓包&#xff0c;我就直接在模拟器上试了&#xff0c;就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…

GraphPad Prism 10 for Mac v10.0.0.3 安装教程

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

【网络基础】网线制作集线器和交换机讲解路由设置

目录 一 网线制作 ● 由来 ● 材料&#xff08;4种&#xff09; ● 步骤 二 集线器和交换机 2.1 OSI七层模型概念 2.2 集线器与交换机简介 三 路由器设置 3.1 路由器概念 3.2 路由器设置管理登入 3.2.1 进路由器管理(新路由器) 3.2.2 进路由器管理(旧路由器) 四 全…