组件间的通讯方式
创始人
2024-01-31 04:26:27
0

一、父传子

在Vue.component(){}中,加入与template、data同级的props用来接受传值

//接受传值  利用propsprops:{// 自定义接受//定义数据类型type : String,size:Number,pageSize:{//定义多种数据类型,用数组形式type:[Number,String],//设置默认值,若为基本数据类型不存在深拷贝的问题则可以写成对象的形式//(也可以写成函数形式),复杂数据类型写为函数形式,目的也是为了数据隔离,default(){return 5}}},

 然后再vue实例(即父级)控制区内加入组件标签,给标签的属性加冒号(:)即可获取到父级的data中的数据

二、子传父

 (一)子组件调用父组件的方法

1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)

  • {{item.content}} {{item.name}}
--------------------js中methods: {// 1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)// 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到子组件给父组件传递的数据comment(data){console.log(data);this.list.push(data)sessionStorage.setItem('list',JSON.stringify(this.list))}},

2.子组件可以触发这个事件$emit('事件名字')

(1)$emit方法第二个参数可以定义子组件给父组件传递的内容

 Vue.component('son',{template:"#son",data(){return {name:'',content:''}} ,methods:{issue(){if(this.name != '' && this.content != '') {// 2.子组件可以触发这个事件$emit('事件名字')// 1.$emit方法第二个参数可以定义子组件给父组件传递的内容this.$emit('comment',{name:this.name,content:this.content})this.name = ''this.content = ''} else {window.alert('请输入评论人及评论内容')}}}})

(二)在父组件中怎么拿到这内容

 1.父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到

const vm = new Vue({el: '#app',data: {list:[]},methods: {// 1.在父组件中给引用的子组件注册一个事件(这个事件的名字是自定义的)// 父组件这个方法没有自定参数,在父组件的方法直接加这个参数就可以拿到子组件给父组件传递的数据comment(data){
//data就是子组件传来的数据console.log(data);this.list.push(data)sessionStorage.setItem('list',JSON.stringify(this.list))}},})

2.父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数

  

data即为标签中的$event,也就是子组件传来的值,data为标签中调用方法时传的参 

  const vm = new Vue({el: '#app',data: {list:[]},methods: {//父组件有自定义参数,可以传入$event也可以拿到子组件传递的数据。通过$event只能传递第一个参数。comment(data,data2){
//data即为标签中的$event,也就是子组件传来的值,data为标签中调用方法时传的参console.log(data);console.log(data2);this.list.push(data)sessionStorage.setItem('list',JSON.stringify(this.list))}},})

三、vuex

        1.定义:

        Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储,管理应用中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

        2.vuex解决的问题

                (1)行统一的状态管理,解决不同组件共享数据的问题。

                (2)不同视图需要变更同一状态的问题。

                (3)使用vuex之后,状态变化更加清晰。

        3.uvex的五大核心模块

(1)state

        state是什么? 是一个单一状态树,是vuex中为一个的数据源,我们的数据都是放在state中的。
组件中去取state的值,通过this.$store.state,
(2)getters

对state中的数据进行加工(派生)
取getters中的值,通过this.$store.getters,
(3)mutation

修改state中的值,我们state每次变化,都应该由mutation去修改,方便追踪数据的流转。

        ①this.$store.commit('mutation类型(函数名)',"参数,参数一般是对象形式")

        ②this.$store.commit({type:'mutation类型(函数名)'},...其他参数)

(4)action

        action类似于mutation,不同的是

        action可以包含异步操作

        action不能直接修改state,如果想修改state的话,需要触发mutation

(5)module

        由于使用单一的状态树,项目中的状态会集中在一起,导致难以维护,这个时候可以通过module对store进行拆分。
        使用module之后,每个模块都有自己的state、mutation等内容,方便维护
 

import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {// number:5,visible: false,userInfo:{},},getters: {},mutations: {changeVisible(state,payload){state.visible = payload},changeUserInfo(state,payload){state.userInfo = payload}},actions: {},modules: {}
})

四、ref

 (一)获取dom节点

1.给dom节点记上ref属性,可以理解为给dom节点起了个名字。

   

ref="h11" id="h11">h1标签

2.加上ref之后,在$refs属性中多了这个元素的引用。

3.通过vue实例的$refs属性拿到这个dom元素。

const vm = new Vue({el: '#app',data: {},methods: {changeSon(){this.$refs.myson.sonMsg = '被父组件的按钮改变'}},mounted(){console.log(document.getElementById('h11'));console.log(this.$refs);// 加上ref之后,在$refs属性中多了这个元素的引用。// 通过vue实例的$refs属性拿到这个dom元素,可以对dom元素进行操作this.$refs.h11.style.color = 'red'},})

 (二)获取组件

1.给组件记上ref属性,可以理解为给组件起了个名字。

 

    ref="myson">

2.加上ref之后,在$refs属性中多了这个组件的引用。

3.通过vue实例的$refs属性拿到这个组件的引用,之后可以通过这个引用调用子组件的方法,或者获取子组件的数据。

    const vm = new Vue({el: '#app',data: {},methods: {changeSon(){this.$refs.myson.sonMsg = '被父组件的按钮改变'}},mounted(){// 加上ref之后,在$refs属性中多了这个组件的引用// 通过vue实例的$refs属性拿到这个组件的引用,之后可以通过这个引用调用子组件的方法,或者获取子组件的数据// 获取子组件的数据console.log(this.$refs.myson.sonMsg);//可以通过这个引用调用子组件的方法console.log(this.$refs.myson.log1());},})

五、本地缓存

1.localStorage

(1)保存数据:localStorage.setItem(key,value)

(2)读取数据:localStorage.getItem(key)

(3)删除单个数据:localStorage.removeItem(key)

(4)删除所有数据:localStorage.clear()

(5)得到某个索引的key:localStorage.key(index)

2.sessionStorage

(1)保存数据:sessionStorage.setItem(key,value)

(2)读取数据:sessionStorage.getItem(key)

(3)删除单个数据:sessionStorage.removeItem(key)

(4)删除所有数据:sessionStorage.clear()

(5)得到某个索引的key:sessionStorage.key(index)

六、事件总线

 6.1定义事件总线对象


import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = false//给Vue绑定属性
Vue.prototype.xyz=100;
// Vue.prototype.$EventBus=vmnew Vue({beforeCreate(){//安装事件总线Vue.prototype.abc=900;Vue.prototype.$EventBus=this},render: h => h(App),
}).$mount('#app')

6.2  向总线发送事件

语法:this.$EventBus.$emit(发送的事件名,传递的参数)



6.3接收总线事件

    语法:this.$EventBus.$on(监听的事件名, 回调函数)



 6.3总线事件解绑

   语法:this.$EventBus.$off(要移除事件名)

   在组件离开,也就是被销毁前,要将该监听事件给移除,以免下次再重复创建监听。

  beforeDestory () {//移除事件监听sendthis.$EventBus.off("send")}

相关内容

热门资讯

黑龙江哈尔滨建立住宅物业管理联... 为全面提升住宅小区精细化管理水平,黑龙江省哈尔滨市印发《哈尔滨市住宅物业管理联席会议制度》,通过构建...
长沙市自动驾驶汽车发展条例 长沙市人民代表大会常务委员会公告 (2025年第16号) 《长沙市自动驾驶汽车发展条例》已经2025...
一次性信用修复政策哪些情况能享... 12月22日,中国人民银行发布《关于实施一次性信用修复政策有关安排的通知》,明确央行征信系统(金融信...
苹果与麦斯莫专利纠纷:法官驳回... 【苹果与麦斯莫血氧监测专利纠纷有新进展,苹果可继续美售更新款智能手表】12月27日消息,美国苹果公司...
河南省举行《河南省优化营商环境... 原标题: 我省举行《河南省优化营商环境条例》新闻发布会 以法治护航民营经济高质量发展(新闻发布厅) ...
六“字”解码《河南省优化营商环... 市场壁垒如何破除? 关键堵点怎样打通? 企业权益如何保障? 中小企业怎样融资? 如何做到无事不扰? ...
中国经济“四稳”政策:激活内生... 【12月28日消息,“四稳”政策助力稳增长】自2025年4月25日中央政治局会议首提“着力稳就业、稳...
这里既有产业基础又有政策支持 应聘者正在有序入场。 招聘单位和应聘者进行供需对接。 香港理工大学珠三角校友会为校友提供信息咨询...
关于《长沙市自动驾驶汽车发展条... 记者:请问《条例》的颁布,对于长沙自动驾驶汽车产业发展将有何助力作用? 市工业和信息化局党组成员、副...
构成犯罪!吉林省9人终生禁驾! 为有效震慑严重交通违法行为,不断提升驾驶人安全驾驶意识,切实提高遵守交通法律法规的自觉性,日前,吉林...