Vue学习记录之七(组件之间传参)

一、父传子

1、父组件传递

父: App.vue, 通过使用组件 <导入的组件名 :属性名1=“” :属性名2=“”></导入的组件名>,传递给子组件
传递了一个t字符串类型是不需要v-bind,也就是不需要冒号,非字符串类型的必须加 v-bind(😃

<template><div>父集</div><hr><!--v-bind:属性名 或者 简写 :属性名--><waterFall :title="name" :arr="[1,2,3]"></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
let name = "lvmanba"
</script>
<style lang="scss">#app{@include bfc;}
</style>

2、子组件接收

通过defineProps来接收父传递过来的属性。defineProps是无须引入的直接使用即可

<template><div>子集</div><div>接收的字符串值为: {{ title }}</div><div>接收的数组值为: {{ arr }}</div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
//方法1:接收父组件传递过来的值使用 defineProps函数。
/*
defineProps({title:{type: String,default: "默认值"}
})
*/
//上面可以完成在模版中使用,如果想在ts中使用,则赋值给一个变量即可以在模版,也可以在ts中使用
// 注意,接收的变量不能和里面的变量名相同,如果相同,模版中的title显示的内容就为了:{ "title": "lvmanba" }
/*
const props = defineProps({title:{type: String,default: "默认值"}
})
console.log(props.title)  //这样就可以读取到了。
*/
//-----------------------------------------------------------------------------------------------------
// 方法2:有了ts 可以直接使用泛型自变量的形式来接收
//接受一个泛型,里面是对象
/*
defineProps<{title:string
}>()
*/
// 赋值给变量,就可以在ts中使用了。
/*
const props = defineProps<{title: string,arr: number[]
}>()
*/
//-------------------------------------------------------------------------------------------------
/* 
方法3, 如果父类没有传递过来参数,就会报错,需要设置默认值。
可以在方法2的基础上修改,使用ts特有的 withDefaults
它是一个函数,两个参数
1、第一个参数只能接受defineProps的返回值。
2、第二个参数是一个对象,用来设置默认值的, 如果类型复杂,需要使用一个函数来返回的。
如  arr:()=>{}*/
const props = withDefaults(defineProps<{title: string,arr: number[]
}>(),{title: "我是默认值",arr: ()=>[0]
})上面的写法也可以发开写,单独定义类型,然后直接使用defineProps
type prop = {title: string,arr: number[]
}
const props = withDefaults(defineProps<prop>(),{title: "我是默认值",arr: ()=>[0]
})</script>

二、子传父

1、方法一

子组件传值给父组件主要是子组件通过defineEmits注册一个自定义事件,而后触发emit去调用该自定义事件,并传递参数给父组件。defineEmits 是一个组合式 API,用于在组件中定义可以触发的事件。
在这里插入图片描述
子组件代码

<template><div>子集</div><button @click="send">给父组件传值</button>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
/*
第一种方式:
1、使用defineEmits 注册一个自定义事件,帮助你定义组件能触发的事件。
格式为: const emit = defineEmits(['方法1','方法2'...])
*/
const emit = defineEmits(['mymethod'])
//2、通过上面的点击事件,去调用我们注册的自定义事件,并传递值
const send = () =>{emit('mymethod','lvmanba1','birds2')
}
</script>

父文件代码

<template><div>父集</div><hr><!--v-on:    简写为"@""。为HTML标签绑定事件v-bind:  简写为":"。 为HTML标签绑定属性--><waterFall @mymethod="getName" ></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
const getName = (name:string) =>{ //传递的参数,传递几个,在这里就写几个参数,参数的名称不变。console.log(name)
}
</script>

2、方法二

defineEmits 接收一个泛型,接受一个对象,传递的是一个方法。可以写多个方法。
格式为:(方法名,参数名):返回值

<template><div>子集</div><button @click="send">给父组件传值</button>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
/*
第二种方式:defineEmits 接收一个泛型,类面接受一个对象
传递的是一个方法。可以写多个方法。
格式为:(方法名,参数名):返回值
*/const emit = defineEmits<{(e:"mymethod",name:string):void(e:"mymethod2",name:string):void(e:"mymethod3",name:string):void
}>()
const send = () =>{emit('mymethod','lvmanba1')emit('mymethod2','lvmanba2')emit('mymethod3','lvmanba3')
}
</script>

父类通过 v-on 来接收子类的方法。

<template><div>父集</div><hr><waterFall @mymethod="getName"></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
const getName = (name:string) =>{console.log(name)
}
</script>

父类也可以接受子类的多个方法

<template><div>父集</div><hr><!--v-on:    简写为"@""。为HTML标签绑定事件v-bind:  简写为":"。 为HTML标签绑定属性这里接收子类的两个方法,既mymethod 和 mymethod2,他们可以在父类中对应一个方法,也可以对应多个方法,这里对应的都是getName--><waterFall @mymethod="getName" @mymethod2="getName"></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
const getName = (name:string) =>{console.log(name)
}
</script>

3、方法三

子组件暴露方法或属性给父组件 defineExpose, 适合场景,表单验证等。父类使用ref来接收。
1、现在子类中保护方法或者属性

<template><div>子集</div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
// 这个是子类中要暴露的方法和属性
defineExpose({name:"lvmanba2024",open:()=>console.log("我是子类的方法")
})</script>

2、在父类中接收

<template><div>父集</div><hr><button @click="getSon">获取子类传递的信息</button><!--2、在引入组件中使用ref绑定下面定义组件类型的ref变量。当你在模板中使用 ref 时,可以通过这个引用来访问对应的组件或 DOM 元素的属性和方法。--><waterFall ref="water"></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
//InstanceType 是一个内置的工具类型,用于获取一个类的实例类型。
//在TS中用于获取变量或值的类型  typeof waterFall 获取waterFall的类型
//1、定义一个空的ref类型变量,变量名随意,我这里叫water,类型为引入子类的类型。
const water = ref<InstanceType<typeof waterFall>>()
const getSon=()=>{//3、通过空的ref变量来访问子类的属性和方法。console.log(water.value?.name)console.log(water.value?.open)
}
</script>

三、案例封装瀑布流组件

App.vue

<template><waterFall :list="list"></waterFall>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import waterFall from './components/water-fall.vue';
const list = [{height: 300,background: 'red'},{height: 400,background: 'pink'},{height: 500,background: 'blue'},{height: 200,background: 'green'},{height: 300,background: 'gray'},{height: 400,background: '#CC00FF'},{height: 200,background: 'black'},{height: 100,background: '#996666'},{height: 500,background: 'skyblue'},{height: 300,background: '#993366'},{height: 100,background: '#33FF33'},{height: 400,background: 'skyblue'},{height: 200,background: '#6633CC'},{height: 300,background: '#666699'},{height: 300,background: '#66CCFF'},{height: 300,background: 'skyblue'},{height: 200,background: '#CC3366'},{height: 200,background: '#CC9966'},{height: 200,background: '#FF00FF'},{height: 500,background: '#990000'},{height: 400,background: 'red'},{height: 100,background: '#999966'},{height: 200,background: '#CCCC66'},{height: 300,background: '#FF33FF'},{height: 400,background: '#FFFF66'},{height: 200,background: 'red'},{height: 100,background: 'skyblue'},{height: 200,background: '#33CC00'},{height: 300,background: '#330033'},{height: 100,background: '#0066CC'},{height: 200,background: 'skyblue'},{height: 100,background: '#006666'},{height: 200,background: 'yellow'},{height: 300,background: 'yellow'},{height: 100,background: '#33CCFF'},{height: 400,background: 'yellow'},{height: 400,background: 'yellow'},{height: 200,background: '#33FF00'},{height: 300,background: 'yellow'},{height: 100,background: 'green'}]
</script>
<style lang="scss">
#app,
html,
body {height: 100%;
}
*{padding: 0;margin: 0;
}
</style>

water-fall.vue 代码

<template><div class="wraps"><div :style="{height:item.height+'px',background: item.background,left:item.left+'px',top:item.top+'px'}" class="items" v-for="item in waterList"></div></div>
</template>
<script setup lang='ts'>
import { List } from '@element-plus/icons-vue';
import { ref,reactive,onMounted } from 'vue'
//接收父组件传递过来的数组
const props = defineProps<{list:any[]
}>()
//里面有高度和背景,又新增了左侧的绝对距离 和 顶部的高度。
const waterList = reactive<any[]>([])  
const heightList:number[]=[]const init = () =>{const width = 130;const x = document.body.clientWidth; //可视区的宽度//console.log(x)//计算能显示多少列//console.log(x/width)  向下取整const column = Math.floor(x / width)//开始遍历for(let i=0; i<props.list.length;i++){if(i<column){ //第一行props.list[i].left = i * widthprops.list[i].top = 10waterList.push(props.list[i])heightList.push(props.list[i].height+10)  //收集第一行的高度}else{//从第二行开始,就依次找高度最小的,放置在下面,为维持整体高度的一致性,形成瀑布流let current = heightList[0]; //假定第一个高度是最小的。let index = 0; //假定第一个高度是最小的,那么索引就为0//开始遍历,找真正高度最小的heightList.forEach((h,i)=>{if(current > h){current = h;index = i}})props.list[i].top = current + 20props.list[i].left = index * width//重新维护高度heightList[index] = heightList[index]+props.list[i].height + 20waterList.push(props.list[i])//console.log(heightList)//console.log(current)}}}
onMounted(()=>{window.onresize = () => init()init()
})
</script>
<style lang="scss" scoped>
.wraps{position: relative;height: 100%;.items{position: absolute;width: 120px;}
}
</style>

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

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

相关文章

CTC loss 博客转载

论文地址&#xff1a; https://www.cs.toronto.edu/~graves/icml_2006.pdf 为了对应这个图&#xff0c;我们假设一种符合的模型情况&#xff1a; 英文OCR&#xff0c;37个类别&#xff08;26个小写字母10个汉字空格&#xff09;&#xff0c;最大输出长度8个字符 模型预测结果…

PCL 计算点云的平均密度(方法一)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 本文将介绍如何计算点云的…

如何避开学习和研究机器人方向无价值的知识节约时间

往昔 这是一篇十年前就想写&#xff0c;但是一直没有实力和勇气落笔的文字。 如今 简约 授之以鱼&#xff0c;不如授之以渔。 啰嗦 机器人方向如何简单判定这个知识是否有价值。 只谈一个方向&#xff0c;就是这个知识点是“死”还是“活”&#xff1f; 什么是“死”&am…

element-ui表格操作大全

一、基础表格展示 数据绑定&#xff1a; 在el-table元素中注入data对象数组&#xff0c;在el-table-column&#xff08;列&#xff09;中使用prop属性来对应对象中的键名&#xff0c;使用label属性定义列名 元素案例内容&#xff1a; <el-table border :data"userL…

举例说明:自然语言处理实战项目

自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;旨在使计算机能够理解、解释和生成人类语言。以下是一些NLP实战项目的示例&#xff1a; 1. 情感分析&#xff08;Sentiment Analysis&#xff09; 项目描述: …

【LLM学习之路】9月16日 第六天

【LLM学习之路】9月16日 第六天 损失函数 L1Loss 可以取平均也可以求和 参数解析 input &#xff08;N&#xff0c;*&#xff09; N是batchsize&#xff0c;星号代表可以是任意维度 不是输入的参数&#xff0c;只是描述数据 target 形状要同上 MSELoss平方差 CrossEntr…

(done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)

参考&#xff1a;https://www.youtube.com/watch?vZZ9u1vUtcIA 声学特征描述了声音&#xff0c;不同特征捕捉声音的不同方面性质 声学特征有助于我们构建智能声学系统 声学特征分类有&#xff1a; 1.抽象等级 2.时域视野 3.音乐的部分 4.信号域 5.机器学习方法 如下图展示…

力扣中等 33.搜索旋转排序数组

文章目录 题目介绍题解 题目介绍 题解 首先用 153. 寻找旋转排序数组中的最小值 的方法&#xff0c;找到 nums 的最小值的下标 i。 然后分类讨论&#xff1a; 如果 target>nums[n−1]&#xff0c;在 [0,i−1] 中二分查找 target。 如果 target≤nums[n−1]&#xff0c;那…

51单片机——独立按键

一、独立按键对应单片机P3管脚&#xff0c;如图 二、按键点亮LED灯 #include <STC89C5xRC.H> void main() { while(1) { if(P300) { P200; } else { P201; } } } 当按键为0时&#xff0c;代表按下&#xff0c;所以当P30按下时&#xff0c;让P20&#xff1d;0&#…

二叉树(二)深度遍历和广度遍历

一、层序遍历 广度优先搜索&#xff1a;使用队列&#xff0c;先进先出 模板&#xff1a; 1、定义返回的result和用于辅助的队列 2、队列初始化&#xff1a; root非空时进队 3、遍历整个队列&#xff1a;大循环while(!que.empty()) 记录每层的size以及装每层结果的变量&a…

leetcode第十三题:罗马数字转整数

罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;基于快排改进的快速…

【全网最全】2024华为杯数学建模C题高质量成品查看论文!【附带全套代码+数据】

题 目&#xff1a; ___基于数据驱动下磁性元件的磁芯损耗建模 完整版获取&#xff1a; 点击链接加入群聊【2024华为杯数学建模助攻资料】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kxtS4vwn3gcv8oCYYyrqd0BvFc7tNfhV7&authKeyedQFZne%2BzvEfLEVg2v8FOm%…

计算机基础(Computer Fundamentals)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【学习笔记】手写Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例

关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例 有源蜂鸣器与无源蜂鸣器区别有源蜂鸣器无源蜂鸣器模块化有源蜂鸣器及无源蜂鸣器驱动方式的说明 有源、无源蜂鸣器代码驱动总结 有源蜂鸣器与无源蜂鸣器区别 有源蜂鸣器与无源蜂鸣器区别在于是否有振荡源。 有源蜂鸣器即…

【BEV 视图变换】Ray-based(2): 代码复现+画图解释 基于深度估计、bev_pool

paper&#xff1a;Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D code&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 一、完整复现代码(可一键运行)和效果图 import torch import torch.nn as nn import mat…

8587 行编辑程序

### 思路 1. **初始化栈**&#xff1a;创建一个空栈用于存储有效字符。 2. **读取输入**&#xff1a;读取输入的行数 n&#xff0c;然后逐行读取字符。 3. **处理字符**&#xff1a; - 如果是 #&#xff0c;则弹出栈顶字符&#xff08;如果栈不为空&#xff09;。 - 如果…

谷歌的AI反击战:创始人谢尔盖·布林的回归与大模型组合的未来

近年来&#xff0c;随着AI技术的迅猛发展&#xff0c;尤其是ChatGPT等大语言模型的出现&#xff0c;全球科技格局正发生剧烈变化。作为曾经引领AI潮流的谷歌&#xff0c;在这场竞争中逐渐失去了领头羊的地位。然而&#xff0c;谷歌的创始人之一谢尔盖布林&#xff08;Sergey Br…

黑马智数Day1

src文件夹 src 目录指的是源代码目录&#xff0c;存放项目应用的源代码&#xff0c;包含项目的逻辑和功能实现&#xff0c;实际上线之后在浏览器中跑的代码就是它们 apis - 业务接口 assets - 静态资源 &#xff08;图片&#xff09; components - 组件 公共组件 constants…