1,父传子
父组件通过props向下传递数据给子组件
//App.vue父组件
<template>
<div id="app">
<users v-bind:users="users"></users>//前者自定义名称便于子组件调用,后者要传递数据名
</div>
</template>
<script>
import Users from "./components/Users"
export default {
name: 'App',
data(){
return{
users:["Henry","Bucky","Emily"]
}
},
components:{
"users":Users
}
}
//users子组件
<template>
<div class="hello">
<ul>
<li v-for="user in users">{{user}}</li>//遍历传递过来的值,然后呈现到页面
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props:{
users:{ //这个就是父组件中子标签自定义名字
type:Array,
required:true
}
}
}
</script>
2,子传父
#ref传值
#通过事件形式:子组件通过$emit()给父组件发消息,父组件通过v-on绑定事件接收数据
//zi zujian
<template>
<p @click="change">{{title}}//绑定点击事件
</p>
</tempalte>
<script>
export default{
name:"app-header"
data:{
return {
title:"vue"
}
},
methods:{
change(){
this.$emit("zichaunfu","传值")//自定义事件,穿的值是”传值
}
}
}
</script>
//父组件
<template>
//与子组件自定义事件名字保持一致,data表示从子组件传过来的数据
<app-header v-on:zichaunfu="data" ></app-header>
<p>{{title}} </p>
</template>
<script>
import app-header from "./compents"
export default{
name:"app",
data(){
return{
title:"传递过来是一个值"
}
},
methods:{
data(e){//声明这个函数
this.title=e
}
},
compents:{
"app-heander":header,
}
}
</script>
子组件通过events给父组件发送消息,实际上就是子组件把自己的数据发送到父组件
3,兄弟组件传值
原理:
var event =new vue()
event.$emit(事件名,数据)
event.$on(事件名,data=》{})//箭头函数内部不会产生新的this,这边如果不用=》,this指代event
从c组件获取a和b组件的值
<div id="itany">
<my-a></my-a>
<my-b></my-b>
<my-c></my-c>
</div>
<template id="a">
<div>
<h3>A组件:{{name}}</h3>
<button @click="send">将数据发送给C组件</button>
</div>
</template>
<template id="b">
<div>
<h3>B组件:{{age}}</h3>
<button @click="send">将数组发送给C组件</button>
</div>
</template>
<template id="c">
<div>
<h3>C组件:{{name}},{{age}}</h3>
</div>
</template>
<script>
var Event = new Vue();//定义一个空的Vue实例
var A = {
template: '#a',
data() {
return {
name: 'tom'
}
},
methods: {
send() {
Event.$emit('data-a', this.name);
}
}
}
var B = {
template: '#b',
data() {
return {
age: 20
}
},
methods: {
send() {
Event.$emit('data-b', this.age);
}
}
}
var C = {
template: '#c',
data() {
return {
name: '',
age: ""
}
},
mounted() {//在模板编译完成后执行
Event.$on('data-a',name => {
this.name = name;//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event
})
Event.$on('data-b',age => {
this.age = age;
})
}
}
var vm = new Vue({
el: '#itany',
components: {
'my-a': A,
'my-b': B,
'my-c': C
}
});
</script>
4,任意组件传值(vuex)
Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。
###vuex和localstorage关系
vuex是vue的状态管理器,储存的数据是响应式的。但是不会保存起来,一刷新就会丢失,所以可以把vuex的数据保存一份到localstorage里面,刷新之后,如果localstorage里面有保存的数据,取出来替换store里的state
let defaultCity = "上海"
try { // 用户关闭了本地存储功能,此时在外层加个try...catch
if (!defaultCity){
defaultCity = JSON.parse(window.localStorage.getItem('defaultCity'))
}
}catch(e){}
export default new Vuex.Store({
state: {
city: defaultCity
},
mutations: {
changeCity(state, city) {
state.city = city
try {
window.localStorage.setItem('defaultCity', JSON.stringify(state.city));
// 数据改变的时候把数据拷贝一份保存到localStorage里面
} catch (e) {}
}
}
})
再vuex中,保存的状态都是数组,而localstorage只支持字符串,所以需要转化一下
Json.parse(localstorage.getitem("")) string---->array
json.stringify(state.sub) array=====>string
5,祖孙组件传值(provide/inject)
以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。一言而蔽之:祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
//a.vue
export default{
provide:{name:"haha "}
}
//b.vue
export default{
inject:["name"]
mounted:{
log("this.name")//haha
}
}
需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的
本文介绍了Vue中组件间的通信方式,包括父传子(props)、子传父($emit和事件)、兄弟组件传值、使用Vuex进行任意组件传值以及祖孙组件间的provide/inject通信。Vuex作为状态管理器,提供响应式数据,可结合localstorage持久化数据。提供/注入API用于解决跨级组件通信问题。
6385





