VUE组件通信

1.props传参

props让组件接收外部传过来的数据
传递数据

<Demo name="xxx" :age="18"/>

这里age前加:,通过v-bind使得里面的18是数字

接收数据
第一种方式(只接收)props:[‘name’, ‘age’]
第二种方式(限制类型)props:{name:String, age:Number}

备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中,然后去修改data中的数据

例子
父组件

<template>
  <div>
    <Mystu  name='张三' :age="18" />
  </div>
</template>

<script>
import Mystu from './Mystu.vue'
export default {
    name:"Myschool",
    data(){
      return{
      }
    },
    components:{Mystu}
}
</script>

<style>
</style>

子组件

<template>
	<div>
		<div>{{name}}</div>
		<div>{{age}}</div>
	</div>
</template>

<script>
	export default {
		name: 'Mystu',
		props:{name:String,age: Number},
		date(){
			return{
				
			}
		}
		}
</script>

<style>
</style>

适用场景:父组件传递数据给子组件
子组件设置props属性,定义接收父组件传递过来的参数
父组件在使用子组件标签中通过字面量来传递值

$emit 触发自定义事件

适用场景:子组件传递数据给父组件
子组件通过 e m i t 触发自定义事件, emit触发自定义事件, emit触发自定义事件,emit第二个参数为传递的数值
父组件绑定监听器获取到子组件传递过来的参数

父组件

<template>
  <div>
    <Mystu v-on:atname="demo" />
    <p>{{name}}</p>
  </div>
</template>

<script>
import Mystu from './Mystu.vue'
export default {
    name:"Myschool",
    data(){
      return{
       name:""
      }
    },
    methods:{
      demo(name){
        console.log('demo被调用了',name)
        this.name=name
      }
    },
    components:{Mystu}
}
</script>

<style>
</style>

子组件

<template>
	<div>
		<button @click="sendname">触发</button>
	</div>
</template>

<script>
	export default {
		name: 'Mystu',
		
		data(){
			return{
				name:"张三"
			}
		},
		methods:{
			sendname(){
				this.$emit('atname',this.name)
			}
		}
		}
</script>

<style>
</style>

全局事件总线

一种可以在任意组件间通信的方式,本质上就是一个对象,它必须满足以下条件
1.所有的组件对象都必须能看见他
2.这个对象必须能够使用 $on $emit $off方法去绑定、触发和解绑事件

main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  beforeCreate(){
    Vue.prototype.$bus=this// 安装全局事件总线
  }
}).$mount('#app')

父组件

<template>
  <div>
    <Mystu  />
    <p>{{name}}</p>
  </div>
</template>

<script>
import Mystu from './Mystu.vue'
export default {
    name:"Myschool",
    data(){
      return{
       name:""
      }
    },
    methods:{
      
    },
    mounted(){
			this.$bus.$on("atname1",(data)=>{
				console.log("我是父组件,我收到了数据",data)
        this.name=data
			})
		},
		beforeDestroy(){
      this.$bus.$off("atname")
    },
    components:{Mystu}
}
</script>

<style>
</style>

子组件

<template>
	<div>
		<button @click="sendname">触发</button>
	</div>
</template>

<script>
	export default {
		name: 'Mystu',
		
		data(){
			return{
				name:"张三"
			}
		},
		methods:{
			sendname(){
				this.$bus.$emit('atname1',this.name)
			}
		},
		
		}
</script>

<style>
</style>

vuex

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

vuex中一共有五个状态 State Getter Mutation Action Module

在这里插入图片描述
State
提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存,相似与data

Modules
当遇见大型项目时,数据量大,store就会显得很臃肿
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

Vuex的基本使用
1初始化数据state,配置actions、mutations,操作文件store.js
2组件中读取vuex中的数据 s t o r e . s t a t e . 数据 3 组件中修改 v u e x 中的数据 store.state.数据 3组件中修改vuex中的数据 store.state.数据3组件中修改vuex中的数据store.dispatch(‘action中的方法名’,数据)
或$store.commit(‘mutations中的方法名’,数据)
若没有网络请求或其他业务逻辑,组件中也可越过actions,即不写dispatch,直接编写commit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值