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

news/2024/7/5 1:35:24

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://lihuaxi.xjx100.cn/news/1888252.html

相关文章

LeeCode刷题

寻找数组的中心下标 给定一个整数nums&#xff0c;请编写一个能够返回数组“中心下标”的方法 中心下标是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标&#xff0c;返回-1.如果数组右多个中心下标&#xff0c;应该返回…

飞天使-docker知识点1-安装docker以及手动制作镜像

文章目录 docker 的好处安装dockerdocker imagesimages 导出与导出删除镜像,指定端口启用容器启停批量关闭正在运行的容器 docker 的镜像制作之下载并安装好nginxdocker 的镜像制作之提交镜像 docker 的好处 快速部署&#xff1a;短时间内可以部署成百上千个应用&#xff0c;更…

K8S(一)—安装部署

目录 安装部署前提以下的操作指导(在master)之前都是三台机器都需要执行 安装docker服务下面的操作仅在k8smaster执行 安装部署 前提 以下的操作指导(在master)之前都是三台机器都需要执行 关闭防火墙 [rootk8smaster ~]# vim /etc/selinux/config [rootk8smaster ~]# swa…

Linux内核参数配置说明

Linux内核参数配置说明 一、引言 Linux内核参数是操作系统运行过程中的重要配置&#xff0c;它们决定了系统资源的管理方式、性能优化以及系统安全等方面的特性。本文将详细介绍Linux内核参数的配置说明&#xff0c;并给出CentOS 7推荐的内核参数设置。 二、Linux内核参数概…

Temporal 常见 FQ 速查

1、启动 worker 失败 INFO No Lofigured for temporal client. Created default one. Unable to create client failed reaching server: upstream connect error or disconnect/reset before headers. reset reason: connection failure 解决&#xff1a;没找到链接资源&…

java商城项目的实现更新

先把需要修改的用户按id查询 1.接收参数&#xff0c;collection就是HashMap的values&#xff0c;这个values中只有id。因为查询需要把查询出的数据返回&#xff0c;这里对类作统一的写法&#xff0c;采用反射技术&#xff0c;传入参数是类的名称。 2.这里引用Java的范型T&…

低代码开发:是提高效率的美味佳肴还是无法满足深度需求的垃圾食品?

文章目录 每日一句正能量前言什么是低代码低代码的优缺点低代码开发平台优点低代码开发平台缺点 低代码会替代传统编程吗&#xff1f;低代码定位 如何入门低代码&#xff1f;后记 每日一句正能量 有志者自有千计万计&#xff0c;无志者只感千难万难。 前言 随着技术的不断发展…

C++怎么快速提升实力?

C怎么快速提升实力&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…