1、父组件向子组件传值

(1)第一个就是要明白怎么在父页面中向子组件中传值?

  • 你可以给子组件传入一个静态的值:

父子组件的传值 - 图1

图片来自vue官网

  • 但我们一般都是需要传动态的值,所以需要v-bind绑定:

父子组件的传值 - 图2

图片来自vue官网

当然,你传的值可以是数字、对象、数组等

(2)第二个就是要知道如何在子组件中接受父页面传过来的值,有几点需要了解:

  • 组件实例的作用域是孤立的;
  • 子组件要显式的用props选项声明它预期的数据,如:
  1. // 某个子组件中:
  2. export default {
  3. props: {
  4. title: {
  5. type: String,
  6. default: 'hello world'
  7. }
  8. }
  9. }

然后就可以在页面中使用了,具体我们在项目中体现。

以上就是单向数据流的一般表现了: 父级 prop 的更新会向下流动到子组件中,但是反过来则不行。

2、子组件向父组件传值

那么我们延伸一下,子组件怎么向父组件传值?
(1)基本概念

  • 在Vue中,父子组件的关系可以总结为prop向下传递,事件向上传递。父组件通过prop给子组件下发数据,子组件通过事件给父组件发送信息。

父子组件的传值 - 图3

props down , events up

  • 每个Vue实例都实现了事件接口:使用$on(evntName)监听事件;使用$emit(eventName,optionalPayload)触发事件。另外,父组件可以在使用子组件的地方直接用v-on来监听子组件触发的事件。

(2)举例说明

  • 父组件在组件上定义了一个自定义事件childFn,事件名为parentFn用于接受子组件传过来的message值。
  1. <!-- 父组件 -->
  2. <template>
  3. <div class="test">
  4. <test-com @childFn="parentFn"></test-com>
  5. <br/>
  6. 子组件传来的值 : {{message}}
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. // ...
  12. data: {
  13. message: ''
  14. },
  15. methods: {
  16. parentFn(payload) {
  17. this.message = payload;
  18. }
  19. }
  20. }
  21. </script>
  • 子组件是一个buttton按钮,并为其添加了一个click事件,当点击的时候使用$emit()触发事件,把message传给父组件。
  1. <!-- 子组件 -->
  2. <template>
  3. <div class="testCom">
  4. <input type="text" v-model="message" />
  5. <button @click="click">Send</button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. // ...
  11. data() {
  12. return {
  13. // 默认
  14. message: '我是来自子组件的消息'
  15. }
  16. },
  17. methods: {
  18. click() {
  19. this.$emit('childFn', this.message);
  20. }
  21. }
  22. }
  23. </script>
  • 这样我们就基本实现了子组件向父组件发送值了。
    大家可以在git仓库(chapter23)中于test.vuetestCom.vue这两个组件查看具体的代码。

父子组件的传值 - 图4

点击send发送

父子组件的传值 - 图5

父组件接收组件传过来的值