IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 8、Vue组件-自定义组件事件$emit(子组件向父组件传递数据),第三方 mitt 插件实现非父子组件间传递数据 -> 正文阅读

[JavaScript知识库]8、Vue组件-自定义组件事件$emit(子组件向父组件传递数据),第三方 mitt 插件实现非父子组件间传递数据

自定义组件事件$emit(子组件向父组件传递数据)

  1. 内嵌事件类型有 @click 、@change、@keyup等原生元素事件
  2. 自定义事件 是在组件使用时声明,`@事件名称=‘事件触发的方法’
  3. 触发事件可传参也可不传参
  4. 触发事件一般是组件内部触发,父组件声明事件;多用于子组件向父组件传递数据

案例 Home组件写登录逻辑,声明@login事件

<template>
    <div>
        主页面列表信息,后面加载登录组件
        <hr>
        <br>
        <br>
        <br>
        <!--父组件中对子组件声明事件-->
        <my-login @login='toLogin'/>
    </div>
</template>

<script>
import MyLogin from './views/login/MyLogin.vue'
export default {
    methods: {
    	//login 事件触发后执行的方法
        toLogin(data){
            console.log(data);
            alert('子组件事件被触发,调用父组件方法');
        }
    },
    components:{
        MyLogin
    }
}
</script>

MyLogin 组件主要完成登录页面布局及触发事件-$emit

<template>
    <div>
        <ul>
            <li>
                <input type="text" v-model="userInfo.userName" placeholder="用户名">
            </li>
            <li>
                <input type="text" v-model="userInfo.password" placeholder="密 码">
            </li>
            <li>
                <input type="button" @click="login" value="登陆">
            </li>
        </ul>
    </div>
</template>
<script>
export default {
    data() {
        return {
            userInfo:{
                userName:'',
                password:''
            }
        }
    },
    methods: {
        login(){
            //子组件通过触发自己的事件,把数据传递给父组件
            //this.$emit('事件名称','事件参数');
            this.$emit('login',this.userInfo);
        },
    },
}
</script>

$emit 触发事件传递的参数可进行校验-emits

事件参数可进行校验,和props属性值校验基本类似,校验失败时,也会触发事件,只是控制台会有异常信息打印。校验通过时,不会有异常信息打印。

点击“登录”按钮时,触发login事件时,对参数是否符合规则校验-emits

<template>
    <div>
        <ul>
            <li>
                <input type="text" v-model="userInfo.userName" placeholder="用户名">
            </li>
            <li>
                <input type="text" v-model="userInfo.password" placeholder="密 码">
            </li>
            <li>
                <input type="button" @click="login" value="登陆">
            </li>
        </ul>
    </div>
</template>
<script>
export default {
    data() {
        return {
            userInfo:{
                userName:'',
                password:''
            }
        }
    },
    emits:{
        //login监听事件,事件名称和校验方法体
        login: ({userName,
                password}) => {
            if(userName!='' && password!=''){
                return true;
            }else{
                //校验不通过和props属性一样,在控制台打印错误日志。但是事件依然会触发,用处不大。
                console.log('登录名称和密码不能为空!');
                return false;
            }
        },
    },
    methods: {
        login(){
            //子组件通过触发自己的事件,把数据传递给父组件
            //this.$emit('事件名称','事件参数');
            this.$emit('login',this.userInfo);
        },
    },
}
</script>

mitt 第三方插件实现非父子组件间传递数据

  1. 父组件向子组件传递数据时,用props属性
  2. 子组件向父组件传递数据时,用$emit自定义事件
  3. 如何完成非父子组件间数据传递?当应用比较大时,组件间关系比较复杂 时使用mitt第三方插件

mitt 插件主要实现原理,定义全局监听器,任何组件触发自定义事件时,以广播的形式通知所有监听。

项目中引入mitt插件

cnpm install --save mitt

定义Event工具JS,可快速引用mitt 。model/Event.js

// 类似工具类,其他地方引用这个JS 都可以使用mitt

import mitt from 'mitt'
const Event = mitt();
export default Event;

在组件挂载页面时,监听指定的事件 Event.on()

<script>
import Event from '../model/Event.js'
export default {
    mounted(){
        // 组件挂载时,监听事件,一旦事件触发则会监听到
        Event.on('myEvent',(data)=>{
            alert('触发了第三方插件mitt的事件了'+data);
        })
    },
}
</script>

在组件需要的位置直接触发事件 Event.emit()

<script>
import Event from '@/model/Event'
export default {
    data() {
        return {
            userInfo:{
                userName:'',
                password:''
            }
        }
    },
	methods: {
        login(){
            //任何组件都可以 Event.emit()触发事件,这个是全局的
            Event.emit('myEvent',this.userInfo);
        },
    },
}
</script>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:19:49  更:2021-08-10 13:21:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:32:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码