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修改和@一样

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 硬重置之后恢复历史提交版本

****硬重置之前一定要备份分支呀&#xff0c;谨慎使用硬重置&#xff0c;特别是很多人一起使用的分支**** 如果你在reset的时候选择了Hard选项&#xff0c;也就是硬重置 重置完且push过&#xff0c;那么被你本地和远端后面的提交记录肯定就会被抹去。 解决办法&#xff1a; …

TypeScript入门实战笔记 -- 01 如何快速搭建 TypeScript 学习开发环境?

&#x1f34d;IDE for TypeScript 在搭建 TypeScript 环境之前&#xff0c;我们需要先认识几款适合 TypeScript 的 IDE。只有这样&#xff0c;在开发时我们才能根据实际情况选择合适的 IDE 进行安装&#xff0c;从而提升工作效率。 VS Code Visual Studio Code&#xff08;VS C…

Win11专业版,eNSP启动失败,错误代码40 解决方法

微软Win11系统默认开启的 Virtualization-based Security &#xff08;VBS&#xff09;“基于虚拟化的安全性”会导致游戏、跑分性能下降。VBS 基于虚拟化的安全性&#xff0c;通常称为内核隔离。使用硬件虚拟化在内存中创建安全区域&#xff0c;为其他安全功能提供了一个安全平…

parser

"typescript-eslint/parser": "5.56.0", "vue-eslint-parser": "9.1.0", 代码来自ruoyi-plus vue-eslint-parser是一个专门用于解析Vue.js单文件组件&#xff08;.vue文件&#xff09;的ESLint插件。ESLint是一个用于检查和修复Java…

Python接口自动化浅析requests请求封装原理

以下主要介绍如何封装请求 还记得我们之前写的get请求、post请求么&#xff1f; 大家应该有体会&#xff0c;每个请求类型都写成单独的函数&#xff0c;代码复用性不强。 接下来将请求类型都封装起来&#xff0c;自动化用例都可以用这个封装的请求类进行请求 将常用的get、p…

[ESXi 5/6/7/8]设置 ESXi DCUI 欢迎消息

目录 1. ESXi默认设置2. 设置欢迎消息 MOTD2.1 使用GUI设置2.2 使用 ESXCLI 命令设置使用 esxcli 移除欢迎消息 参考资料 配置在 ESXi 直接控制台用户界面 (DCUI) 中显示的欢迎消息&#xff0c;并验证配置是否处于只读模式 Annotations.WelcomeMessage 是ESXi的高级系统设置&am…

Unity中的ShaderToy

文章目录 前言一、ShaderToy网站二、ShaderToy基本框架1、我们可以在ShaderToy网站中&#xff0c;这样看用到的GLSL文档2、void mainImage 是我们的程序入口&#xff0c;类似于片断着色器3、fragColor作为输出变量&#xff0c;为屏幕每一像素的颜色&#xff0c;alpha一般赋值为…

CSS Grid布局入门:从零开始创建一个网格系统

CSS Grid布局入门&#xff1a;从零开始创建一个网格系统 引言 在响应式设计日益重要的今天&#xff0c;CSS Grid布局系统是前端开发中的一次革新。它使得创建复杂、灵活的布局变得简单而直观。本教程将通过分步骤的方式&#xff0c;让你从零开始掌握CSS Grid&#xff0c;并在…

【NLP】RAG 应用中的调优策略

​ 检索增强生成应用程序的调优策略 没有一种放之四海而皆准的算法能够最好地解决所有问题。 本文通过数据科学家的视角审视检索增强生成&#xff08;RAG&#xff09;管道。它讨论了您可以尝试提高 RAG 管道性能的潜在“超参数”。与深度学习中的实验类似&#xff0c;例如&am…

MyBatisPlus简介

1 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 2、特性 无侵入 只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑…

Java+Swing: 从数据库中查询数据并显示在表格中 整理11

分析&#xff1a;要想从数据库中查询数据并分页展示到表格中&#xff0c;我觉得应该按照这个思路&#xff1a;首先就是发起请求&#xff0c;此时需要向数据库中传递三个参数&#xff1a;当前页码&#xff08;pageNum&#xff09;、每一页的数量&#xff08;pageSize&#xff09…

无代码开发让合利宝支付与CRM无缝API集成,提升电商用户运营效率

合利宝支付API的高效集成 在当今快速发展的电子商务领域&#xff0c;电商平台正寻求通过高效的支付系统集成来提升用户体验和业务处理效率。合利宝支付&#xff0c;作为中国领先的支付解决方案提供者&#xff0c;为电商平台提供了一个高效的API连接方案。这种方案允许无代码开…

项目计划书

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全套资料获取&#xff1a;点我获取

炫酷CSS加载动画

HTML结构 首先是HTML代码&#xff0c;定义了一个类名container的<div>容器&#xff1a; 1.在这个容器里面包含了一些加载器.loader&#xff0c;每个加载器都具有不同的旋转角度自定义属性--r(1~4)&#xff0c;而每个加载器里面有20个<span>元素&#xff0c;并且也都…

vue编辑页面提示 this file does not belong to the project

背景 打开vue项目工程 文件夹被锁定&#xff08;有黄色背景&#xff09;&#xff0c;编辑页面时&#xff0c;报错。 报错提示&#xff1a; vue编辑页面提示 this file does not belong to the project 原因 一不下心打开了错误的文件包 解决方案 1、删除.idea文件夹 2、…

光学仿真 | 推动高精度且微型化摄像头以满足市场需求

光学设计人员面临着一项持续挑战&#xff0c;即满足消费者对摄像头等体积更小、更轻量化设备的需求&#xff0c;同时要不断提高图像质量。一般来说&#xff0c;能否获得最佳质量取决于镜头数量&#xff1a;可装入设备的镜头越多&#xff0c;分辨率和色彩精度就越高。 就智能手机…

隐语开源|周爱辉:隐语 TEE 技术解读与跨域管控实践

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow 11月25日&#xff0c;「隐语开源社区 Meetup西安站」顺利举办&…

Pinia无废话,快速上手

Pinia无废话&#xff0c;快速上手 Vue3 状态管理 - Pinia 1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到Vue项目 后面在实际开发项目的时候&#xff0c;Pinia可以在项目创建时自动添加&#xff0c;现…

项目播报 | 河北信投数字科技签约璞华科技,以数字化方式全面提升采购效率

近日&#xff0c;璞华科技签约河北信投数字科技有限责任公司&#xff08;以下简称“河北信投数字科技”&#xff09;。璞华科技基于璞华采云链产品帮助客户打造采购数字化全景解决方案&#xff0c;实现智慧采购数字化转型升级。 本次强强联合&#xff0c;双方就采购数字化平台建…

【产品设计】软件系统三基座之三:用户管理

软件系统中的用户管理该如何做&#xff1f;系统设计过程中要考虑哪几方面&#xff1f;用户体验设计从哪些点来考察&#xff1f; 软件系统三基座包含&#xff1a;权限管理、组织架构、用户管理。基于权限控制、组织搭建&#xff0c;用户可以批量入场。 一、用户管理 在系统构建…