Vue2.0开发之——组件数据共享-父向子传值(38)

一 概述

  • 组件之间的关系
  • 父向子传值
  • 子向父传值

二 组件之间的关系

2.1 组件之间的关系

在项目开发中,组件之间的最常见的关系分为如下两种

  • 父子关系
  • 兄弟关系

2.2 父子组件之间的数据共享

父子组件之间的数据共享又分为:

  • 父 -> 子共享数据
  • 子 -> 父共享数据

三 父向子传值

3.1 父向子传值过程

父组件App.vue

1
2
3
4
5
6
7
8
export default {
data() {
return {
message: 'hello 132 的宝们!',
userinfo: { name: 'wsc', age: 18 },
}
},
}

子控件Left.vue

1
2
3
export default {
props: ['msg', 'user'],
}

子控件Left.vue注册父控件App.vue

导入

1
import Left from '@/components/Left.vue'

注册

1
2
3
4
5
6
export default {
components: {
Left,
Right
}
}

使用

1
2
3
4
<div class="box">
<!-- 渲染 Left 组件和 Right 组件 -->
<Left :msg="message" :user="userinfo"></Left>
</div>

效果图

3.2 不要修改props的值

Left.vue中值修改

1
2
3
4
5
6
7
8
9
10
<template>
<div class="left-container">
<h3>Left 组件</h3>
<p>msg 的值是:{{ msg }}</p>
<p>user 的值是:{{ user }}</p>
<button @click="msg = 'abc'">修改 msg</button>
<button @click="user.name = 'zs'">修改 user</button>
<hr />
</div>
</template>

App.vue中内容

1
2
3
4
5
6
7
8
9
<template>
<div class="app-container">
<p>{{ userinfo }}</p>
<hr />
<div class="box">
<Left :msg="message" :user="userinfo"></Left>
</div>
</div>
</template>

效果图

四 子向父传值

3.1 子组件Right.vue

布局文件

1
2
3
4
5
6
<template>
<div class="right-container">
<h3>Right 组件 --- {{ count }}</h3>
<button @click="add">+1</button>
</div>
</template>

逻辑文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export default {
data() {
return {
// 子组件自己的数据,将来希望把 count 值传给父组件
count: 0,
}
},
methods: {
add() {
// 让子组件的 count 值自增 +1
this.count += 1
// 把自增的结果,传给父组件
this.$emit('numchange', this.count)
}
}
}

3.2 父组件App.vue

布局文件

1
2
3
<div class="box">
<Right @numchange="getNewCount"></Right>
</div>

逻辑处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
export default {
data() {
return {
// 定义 countFromSon 来接收子组件传递过来的数据
countFromSon: 0
}
},
methods: {
// 获取子组件传递过来的数据
getNewCount(val) {
console.log('numchange 事件被触发了!', val)
this.countFromSon = val
}
},
components: {
Left,
Right
}
}

3.3 效果图