Vue前端框架11 组件事件与v-mode配合使用、组件数据传递(父传子)、插槽Slot、具名插槽、插槽中的数据传递(双向)

2023-09-14 13:12:56

一、组件事件与v-model配合使用

组件A的数据变化
组件B可以实时显示

<template>
  <h3>Main</h3>
  <p>搜索内容为:{{search}}</p>
  <component-b @searchEvent="getSearch"></component-b>
</template>

<script>
import ComponentB from "@/components/componentB";
export default {
  name: "componentA",
  components: {ComponentB},
  data(){
    return{
      search:""
    }
  },
  methods:{
    getSearch(data){
      this.search=data
    }
  }
}
</script>

<style scoped>

</style>
<template>
  搜索: <input type="text" v-model="search">
</template>

<script>
export default {
  name: "componentB",
  data(){
    return{
      search:""
    }
  },
  //侦听器
  watch:{
    search(newvValue,oldValue){
      console.log(oldValue)
      this.$emit("searchEvent",newvValue)
    }
  }
}
</script>

<style scoped>

</style>

二、组件数据传递(子传父)

利用父组件的函数回调

<template>
  <h3>Main</h3>
  <p>搜索内容为:{{search}}</p>
  <component-b @searchEvent="getSearch" :onEvent="dataFn"></component-b>
  <p>this:{{message}}</p>
</template>

<script>
import ComponentB from "@/components/componentB";
export default {
  name: "componentA",
  components: {ComponentB},
  data(){
    return{
      search:"",
      message:""
    }
  },
  methods:{
    getSearch(data){
      this.search=data
    },
    dataFn(data){
      this.message=data
    }
  }
}
</script>

<style scoped>

</style>
<template>
  搜索: <input type="text" v-model="search">
  <p>{{onEvent(age)}}</p>
</template>

<script>
export default {
  name: "componentB",
  data(){
    return{
      search:"",
      age:22
    }
  },
  //侦听器
  watch:{
    search(newvValue,oldValue){
      console.log(oldValue)
      this.$emit("searchEvent",newvValue)
    }
  },props:{
    onEvent:Function
  }
}
</script>

<style scoped>

</style>

三、插槽Slots

解决的是组件传输一个完整的html结构 也就是一个模板内容

<template>
  <parent-demo></parent-demo>
  <component-a></component-a>
  <slot-demo>
    <div>
      <h3>插槽标题</h3>
<!--      插槽内容不是写死的 而是动态的-->
      <p>{{ message }}</p>
    </div>
  </slot-demo>
</template>

<script>


import ParentDemo from "@/components/parentDemo";
import ComponentA from "@/components/componentA";
import SlotDemo from "@/components/slotDemo";
export default {
  name: 'App',
  components: {SlotDemo, ComponentA, ParentDemo},
  data(){
    return{
      message:"hello"
    }
  }
}
</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>

<template>
  <h3>插槽基础知识</h3>
<!--  slot 是一个插槽的出口 标示了 父元素提供的插槽内容将要在哪里被渲染 -->
<!--  如果没有传插槽 在标签中间的内容 就是默认值-->
  <slot>插槽默认值</slot>
</template>

<script>
export default {
  name: "slotDemo"
}
</script>

<style scoped>

</style>

四、具名插槽

<template>
  <parent-demo></parent-demo>
  <component-a></component-a>
  <slot-demo>
<!--   通过template中的 v-slot属性 和 slot标签的 name对应 -->
<!--    v-slot的简写 可以 简写为# -->
    <template v-slot:header>
      <h3>插槽标题</h3>
    </template>
    <template #main>
      <p>{{ message }}</p>
    </template>

  </slot-demo>
</template>

<script>


import ParentDemo from "@/components/parentDemo";
import ComponentA from "@/components/componentA";
import SlotDemo from "@/components/slotDemo";
export default {
  name: 'App',
  components: {SlotDemo, ComponentA, ParentDemo},
  data(){
    return{
      message:"hello"
    }
  }
}
</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>

<template>
  <h3>插槽基础知识</h3>
<!--  slot 是一个插槽的出口 标示了 父元素提供的插槽内容将要在哪里被渲染 -->
<!--  如果没有传插槽 在标签中间的内容 就是默认值-->
  <slot name="header">插槽默认值</slot>
  <hr>
  <slot name="main"></slot>
</template>

<script>
export default {
  name: "slotDemo"
}
</script>

<style scoped>

</style>

五、插槽中的数据传递

在某些情况下,插槽的内容可能同时需要用到父子两个组件的数据,所以需要方法将子组件在渲染时候将一部分数据提供给插槽

<template>
  <parent-demo></parent-demo>
  <component-a></component-a>
  <slot-demo>
<!--   通过template中的 v-slot属性 和 slot标签的 name对应 -->
<!--    v-slot的简写 可以 简写为# -->
    <template v-slot:header>
      <h3>插槽标题</h3>
    </template>
    <template #main>
      <p>{{ message }}</p>
    </template>
  </slot-demo>

  <SlotAttr>
<!--    建议指明对应的插槽名称-->
    <template v-slot:main="slotProps">
      <p>{{currentTest}}</p>
      <p>{{slotProps.msg}}</p>
    </template>
  </SlotAttr>
</template>

<script>


import ParentDemo from "@/components/parentDemo";
import ComponentA from "@/components/componentA";
import SlotDemo from "@/components/slotDemo";
import SlotAttr from "@/components/slotAttr";
export default {
  name: 'App',
  components: {SlotAttr, SlotDemo, ComponentA, ParentDemo},
  data(){
    return{
      message:"hello",
      currentTest:"测试内容"
    }
  }
}
</script>

<template>
  <h3>插槽plus</h3>
<!--  子元素的数据想要显示 则需要将数据传给父元素
      父元素接收后和父元素原本的内容 一起传给子元素
-->
  <slot :msg="childMessage" name="main">

  </slot>
</template>

<script>
export default {
  name: "slotAttr",
  data(){
    return{
      childMessage:"子组件数据"
    }
  }
}
</script>

<style scoped>

</style>
更多推荐

Vue模板语法

文章目录一、模板语法二、插值2.1文本2.2原始HTML2.3表达式2.4样式绑定三、指令3.1v-if/v-else/v-else-if3.2v-show3.3v-for3.4v-model四、过滤器五、监听、计算属性5.1监听属性5.2计算属性一、模板语法Vue使用一种基于HTML的模板语法,使我们能够声明式地将其

主动写入流对@ResponseBody注解的影响 | 京东云技术团队

问题回溯2023年Q2某日运营反馈一个问题,商品系统商家中心某批量工具模板无法下载,导致功能无法使用(因为模板是动态变化的)商家中心报错(JSON串):{"code":-1,"msg":"失败"}负责的同事看到失败后立即与我展开讨论(因为不是关键业务,所以不需要回滚,修复即可),我们发现新功能模板下载的代码与之前的代码

PIL或Pillow学习2

接着学习下Pillow常用方法:PIL_test1.py:'''9,Pillow图像降噪处理由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”,比如数字图像中常见的“椒盐噪声”,指的是图像会随机出现的一些白、黑色的像素点。图像噪声既影响了图像的质量,又妨碍人

按文件大小批量分类保存,高效管理你的文件!

作为一名文件管理者,你是否经常为如何高效地管理大量文件而烦恼?现在,我们为你提供了一种简单、快速、准确的方法,帮助你轻松解决这个问题!首先。进入文件批量改名高手主页面,并在板块栏里选择“文件智能管理箱”板块。第二步,进入板块之后,我们要点击上方的“文件批量管理任务”。再点击“添加文件”在弹出的文件框里将文件夹里不同类型

[正确重装docker] Win10 重装 Docker 提示 Exising installation is up to date 的正确姿势

Win10重装Docker报错Exisinginstallationisuptodate的一种情况是原来的docker没有卸载干净,或者说,没有正确卸载。巧了,我就是直接删除了,因为一些原因重装了好几次,血泪史留给各位嘲笑。一条正确的卸载命令就能够干净地卸载docker。如果你安装docker一直安装不上,请检查自己的

【Git】万字git与gitHub

🎄欢迎来到@边境矢梦°的csdn博文🎄🎄本文主要梳理在git和GitHub时的笔记与感言🎄🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆Ps:月亮越亮说明知识点越重要(重要性或者难度越大)🌑🌒🌓🌔🌕目录🌸git是分布式版本控制软

Gof23设计模式之状态模式

1.概述【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。publicinterfaceILift{//电梯的4个状态//开门状态pu

微信小程序——常用组件的属性介绍

常用的组件内容标签text文本组件类似于HTML中的span标签,是一个行内元素rich-text富文本标签支持把HTML字符串渲染为WXML结构text标签的基本使用通过text组件的selectable属性,实现长按选中文本内容的效果。只有text标签支持长按选中效果,其他的组件是不支持的结构内容代码:<viewc

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(二)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.模型训练1)数据集分析2)数据预处理相关其它博客工程源代码下载其它资料下载前言本项目专注于MovieLens数据集,并采用TensorFlow中的2D文本卷积网络模型。它结合了协同过滤算法来计算电影之间的余弦相似度,并通过用户的交互方式,以单击电影的方式,提供

npm发布vue3自定义组件库--方法一

npm发布vue3自定义组件库创建项目vuecreatetest-ui自定义组件创建自定义组件,组件名称根据你的需求来,最好一个组件一个文件夹,下图是我的示例。src/components组件和你写页面一样,所谓组件就是方便实用,不用重复搬动页面到不同的项目,可以直接install到你本地的项目,下图是一个示例。编写完

CRC校验原理与FPGA实现(含推导过程)

CRC校验原理与FPGA实现(含推导过程)写在前面一、CRC校验原理1.1CRC校验基本概念1.2CRC校验计算1.2.1发送端CRC校验码计算1.2.1.1CRC校验码计算方法1.2.1.2CRC校验码计算例子1.2.2接收端CRC校验1.2.2.1校验通过1.2.2.2数据段出错1.2.2.3CRC校验码段出错二、

热文推荐