Vue学习计划-Vue2--VueCLi(四)组件传值和自定义事件

1. 组件传值

  1. 组件化编码流程:
    1. 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突
    2. 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
      1. 一个组件在用,放在组件自身即可
      2. 一些组件在用,放在他们共同的父组件上(状态提示)
    3. 实现交互:从绑定事件开始
  2. props适用于:
    1. 父组件 ===> 子组件 通信
    2. 子组件 ===> 父组件 通信(要求父先给子一个事件)
    3. 组件接收形式
    1. props: ['xxx']2.  props:{xxx:{type: String,required: true // 必传},xxx:{type: Number, // 类型default: 20 // 默认值...自定义校验等等}}3. props:{xxx: Number, // 设置类型xxx:{type: Number, // 类型default: 20 // 默认值...自定义校验等等}}    
  1. props接收的值不可以修改

示例: 我们只需要四个组件,父组件APP.vue,子组件SelectInput.vueSelectList .vueSelectMulDel.vue,需求:子组件操作数据改变父组件内的列表数据,实现增删
1. 文件目录:components文件夹内创建子组件文件
在这里插入图片描述
2. 在父组件APP.vue中:引入3个子组件

因为所有的子组件共同需要用到列表的数据,所以数据写在父组件内
因为操作的数据在父组件内部。所以和操作方法都写在父组件内

<template><div><SelectInput :addDataList="addDataList"></SelectInput><SelectList :daList="dataList" :delDataList="delDataList"/><SelectMulDel :mulDelDataList="mulDelDataList"></SelectMulDel></div>
</template>
<script>
import SelectList from './components/SelectList.vue'
import SelectInput from './components/SelectInput.vue'
import SelectMulDel from './components/SelectMulDel.vue'
export default {name: 'App',components:{SelectList,SelectInput,SelectMulDel},data(){return {// 数据创建在父组件内dataList:[{ name: '小红', checked: false},{ name: '小绿', checked: false},]}},methods:{// 添加数据addDataList(val){this.dataList.push(val)},// 删除数据delDataList(index){this.dataList.splice(index, 1)  },// 批量删除mulDelDataList(){console.log(this.dataList);this.dataList = this.dataList.filter(item=> !item.checked)}}
}
</script>
  1. 子组件SelectInput.vue中:

编写添加数据和添加按钮功能
通过props传入的添加方法实现添加功能

<template><div class="container"><input type="text" v-model="value"><button @click="add">添加</button></div>
</template>
<script>
export default{props:['addDataList'],data(){return {value: '小美丽'}},methods:{add(){console.log(this.value);this.addDataList({ name: this.value, checked: false })}}
}
</script>
  1. 子组件SelectList.vue中:

展示列表数据和行内删除
通过props传入的删除方法实现行内删除功能

<template><div class="container"><ul><!-- 批量删除, key为唯一值, 假设name不可以重复 --><li v-for="(item, index) in daList" :key="item.name"><!-- v-model双向绑定,直接改变值,就相当于改变props传入的值,引起错误 --><!-- <input type="checkbox" v-model="item.checked" @change="item.checked = !item.checked"> --><input type="checkbox" :value="item.checked" @change="item.checked = !item.checked">{{ item.name }}<button @click="del(index)">删除</button></li></ul></div>
</template><script>
export default{props:['daList', 'delDataList'],methods:{del(index){// props 传入的值不允许改变//   this.daList.splice(index, 1) this.delDataList(index, 1)  }}
}
</script>
<style scoped>
.container{background-color: antiquewhite;
}
ul{list-style: none;
}
</style>
  1. 子组件SelectMulDel.vue中:

展示列表数据的选择行为
通过props传入的批量删除方法实现批量删除功能

<template><div><button @click="mulDelete">批量删除</button></div>
</template>
<script>
export default{props:['mulDelDataList'],methods:{mulDelete(){this.mulDelDataList()},}
}
</script>
  1. 展示效果:点击功能ok
    在这里插入图片描述

2. 组件的自定义事件

  1. 一种组件间通信的方式,适用于:子组件=>父组件
  2. 使用场景:A是父组件,B是子组件,B想传给A,那么就要在A中给B绑定自定义事件(事件的回调在A中
  3. 绑定自定义事件:
    1. 第一种方式:在父组件中:<Demo @my-event="test"></Demo>
    2. 第二种方式:在父组件中:
    <Demo ref="demo"></Demo>
    ....
    mounted(){this.$refs.xxx.$on('my-event', this.test)
    }
    
    1. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法
  4. 触发自定义事件:this.$emit('my-event', 数据)
  5. 解绑自定义事件:this.$off('my-event')
  6. 组件上也可以绑定原生DOM事件,需要使用native修饰符

示例:上述的props案例是父组件将数据和操作方法统一已props形式传入子组件,子组件还需接收才可使用,现在我们将自定义事件编写,在此已SelectInput.vue为例

  • 第一种:自定义事件@方式
  1. App.vue内修改为:@addDataList 接收子组件传过来的自定义事件
	<SelectInput @addDataList="addDataList"></SelectInput>
  1. 子组件内SelectInput.vue修改为:
<template><div class="container"><input type="text" v-model="value" /><button @click="add">添加</button></div>
</template><script>
export default {data() {return {value: "小美丽",};},methods: {add() {this.$emit("addDataList", { name: this.value, checked: false });// 可emit提交多个自定义事件},},
};
</script>
  • 第二种:自定义事件ref方式
  1. App.vue内修改为:
  1. SelectInput 标签上添加ref属性,
  2. 生命周期mounted中,通过$on绑定事件
  3. 生命周期beforeDestroy中,通过$off移除自定义事件
<SelectInput ref="MyInput"></SelectInput>
...
mounted() {this.$refs.MyInput.$on("addDataList", this.addDataList);},beforeDestroy() {this.$refs.MyInput.$off("addListInput");// this.$refs.MyInput.$off(); // 可以不传参数,移除所有自定义事件},
  1. 子组件内SelectInput.vue修改和@一样

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

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

相关文章

蓝桥杯专题-真题版含答案-【排序法 - 改良的选择排序】【插补搜寻法】【稀疏矩阵】【欧拉与鸡蛋】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

PMP项目管理 - 质量管理

系列文章目录 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. PMP项目管理 - 质量管理 系列文章目录一、规划质量管理 - 关注工作需要达到的质量二、管理…

java stream的常见操作

1.List<String> 转 List<Integer> 如果 strList 中全是数字字符串&#xff0c;可通过如下转换为 integerList List<String> strList new ArrayList<>(Arrays.asList("7","8","9"));List<Integer> integerList …

【golang/g3n】3D游戏引擎G3N的windows安装与测试

目录 说在前面安装测试 说在前面 操作系统&#xff1a;win 11go version&#xff1a;go1.21.5 windows/amd64g3n版本&#xff1a;github.com/g3n/engine v0.2.0其他&#xff1a;找了下golang 3d相关的库&#xff0c;目前好像就这个比较活跃 安装 按照官方教程所说&#xff0c;…

当初自己为什么选择计算机?

还记得当初自己为什么选择计算机&#xff1f; 为什么当初选择计算机行业&#xff1f; 要说爱上计算机应该是高中的时候了&#xff0c;那时候第一次接触编程&#xff08;C&#xff09;&#xff0c;说实话&#xff0c;第一次写程序的时候感觉头大&#xff0c;啥都不会&#xff0c…

05 Vue中常用的指令

概述 All Vue-based directives start with a v-* prefix as a Vue-specific attribute. 所有基于 Vue 的指令都以 v-* 前缀作为 Vue 特有的属性。 v-text The v-text directive has the same reactivity as with interpolation. Interpolation with {{ }} is more perform…

linux 开机启动流程

1.打开电源 2.BIOS 有时间和启动方式 3.启动Systemd 其pid为1 4.挂载引导分区 /boot 5.启动各种服务 如rc.local

Ubuntu 常用命令之 ls 命令用法介绍

Ubuntu ls 命令用法介绍 ls是Linux系统下的一个基本命令&#xff0c;用于列出目录中的文件和子目录。它有许多选项可以用来改变列出的内容和格式。 以下是一些基本的ls命令选项 -l&#xff1a;以长格式列出文件&#xff0c;包括文件类型、权限、链接数、所有者、组、大小、最…

刚clone下来的项目如何上传到新的仓库

查看当前项目的git信息 git remote -v 查看git目录上传到哪个路径下 拉下的项目如何上传到新的仓库 git clone xxxcd xxxrm -r .git 删除原有的git信息&#xff0c;有问题一直回车git init 初始化gitgit add . git commit -m ‘xxx’git remote add origin 远程库地址&#…

ping命令的工作原理

ping&#xff0c;Packet Internet Groper&#xff0c;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序。Ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令&#xff0c; 主要是向特定的目的主机发送 ICMP&#xff08;Internet Control Message Protocol 因特…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

目录 一、实验 1.部署Ansible自动化运维工具 2.K8S 节点安装nginx 3.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用 二、问题 1.ansible安装报错 2.ansible远程ping失败 3. Jenkins流水线通过ansible命令直接ping多台机器的网络状态报错 一、实验 …

课设:FPGA音频均衡器 verilog设计及仿真 加报告

FPGA音频均衡器:将音频处理发挥到极致 引言: 随着音频技术的不断进步和音乐产业的飞速发展,人们对于音质的要求越来越高。而FPGA音频均衡器作为一种集数字信号处理与硬件加速技术于一体的创新解决方案,为音频处理带来了全新的可能性。本文将介绍什么是FPGA音频均衡器,以及…

力扣97. 交错字符串

动态规划 思路&#xff1a; 假设 dp[i][j] 是 s1 前 i 个元素和 s2 前 j 个元素能否交错构成 s3 的状态&#xff1b;则其上一个状态有&#xff1a; dp[i - 1][j] 且 s1[i -1] s3[i j - 1] 条件决定了状态 dp[i][j]&#xff1b;或者 dp[i][j - 1] 且 s2[j - 1] s3[i j - 1]…

C语言:猜数字游戏

#include<stdio.h> #include<time.h> #include<stdlib.h> void menu() {printf("********************************\n");printf("****** 1.开始 2.退出 ******\n");printf("********************************\n"); } voi…

tp中的调试模式

ThinkPHP有专门为开发过程而设置的调试模式&#xff0c;开启调试模式后&#xff0c;会牺牲一定的执行效率&#xff0c;但带来的方便和除错功能非常值得。 我们强烈建议ThinkPHP开发人员在开发阶段始终开启调试模式&#xff08;直到正式部署后关闭调试模式&#xff09;&#xf…

JDK8接口新增的方法

前言 在JDK8之前接口中的方法是不能有方法体的&#xff0c;但是在JDK8之后 为什么要新增这三个接口 增强接口能力&#xff0c;便于项目的扩展和维护把功能卸载接口中便于直接调用&#xff0c;如果要修改直接修改接口中的方法就可以 一&#xff0c;默认方法 必须使用default修饰…

Swin-Transformer 在图像识别中的应用

1. 卷积神经网络简单介绍 图像识别任务主要利用神经网络对图像进行特征提取&#xff0c;最后通过全连接层将特征和分类个数进行映射。传统的网络是利用线性网络对图像进行分类&#xff0c;然而图像信息是二维的&#xff0c;一般来说&#xff0c;图像像素点和周围邻域像素点相关…

2机5节点系统潮流MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 电力系统潮流计算是电力系统最基本的计算&#xff0c;也是最重要的计算。所谓潮流计算&#xff0c;就是已知电网的接线方式与参数及运行条件&#xff0c;计算电力系统稳态运行各母线电压、各支路电流、功率及…

接口自动化测试实操【设置断言思路】

1 断言设置思路 这里总结了我在项目中常用的5种断言方式&#xff0c;基本可能满足90%以上的断言场景&#xff0c;具体参见如下脑图&#xff1a; 在这里插入图片描述 下面分别解释一下图中的五种思路&#xff1a; 1&#xff09; 响应码 对于http类接口&#xff0c;有时开发人…

Spring AOP 和 Spring Boot 统一功能处理

文章目录 Spring AOP 是什么什么是 AOPAOP 组成切面&#xff08;Aspect&#xff09;连接点&#xff08;Join Point&#xff09;切点&#xff08;Pointcut&#xff09;通知&#xff08;Advice&#xff09; 实现 Spring AOP添加 Spring AOP 框架支持execution表达式定义切面、切点…