Props

用 Props 进行组件间数据传递(类似于 React 中的 Props)

父组件向子组件传递数据

每个组件都有作用域的限制,所以不能在子组件内直接用父组件的数据

要让子组件使用父组件的数据,我们需要通过子组件的props选项

静态 Props

子组件要显式地用 props 选项声明它期待获得的数据:

在父组件中,将数据传入

  1. <child message="hello"></child>

在子组件中,通过声明 props 接受传入的数据

  1. Vue.component('child', {
  2. // 声明 props
  3. props: ['message'],
  4. // 就像 data 一样,prop 可以用在模板内
  5. // 同样也可以在 vm 实例中像“this.message”这样使用
  6. template: '<span>{{ message }}</span>'
  7. })

注意:在声明 props 和插入节点的时候用驼峰命名,在HTML内用-连接

小贴士

  • props 可以是数组或对象,用于接收来自父组件的数据
  • props 可以是简单的数组
  • props 可以使用对象作为替代,对象允许配置高级选项,如类型检测、自定义校验和设置默认值

动态 Props

父组件 中,将数据通过 v-bind:msg 传入子组件

  1. <template>
  2. <div id="post">
  3. <post-body :msg="msg"></post-body>
  4. //v-bind:msg 简写形式,将 msg数据传入
  5. </div>
  6. </template>
  7. <script>
  8. import PostBody from './PostBody'
  9. export default {
  10. name: 'post',
  11. data: () => ({
  12. msg: '哈哈'
  13. }),
  14. components: { PostBody }
  15. }
  16. </script>

在 props 中添加了元素之后,就不需要在 data 中再添加变量了

子组件 中,怎样拿到 传入的数据?

首先声明 Props,将得到的数据赋给 Props ,就可以直接渲染了

  1. <template>
  2. <div class="post-body">
  3. {{ msg }}
  4. //渲染到页面上
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'post-body',
  10. props: ['msg']
  11. // 声明 props
  12. }
  13. </script>

子组件向父组件传递数据

子组件主要通过事件传递数据给父组件

子组件

首先声明一个了方法 setnum,使用$emit来遍历父组件传过来的 addnum 事件,并返回字符串数量:

  1. <script>
  2. export default {
  3. name: 'post-body',
  4. methods: {
  5. setnum: function () {
  6. this.$emit('addnum', '数量:')
  7. }
  8. }
  9. }
  10. </script>

当按钮被点击时,触发v-on:click事件,调用绑定的 setnum 方法,将数据传递给父组件

  1. <template>
  2. <div class="post-body">
  3. <input type='button' value='+1' @click='setnum'/>
  4. </div>
  5. </template>
父组件

在父组件中,用 addnum 事件调用 getnum 方法,获取到从子组件传递过来的参数 string

  1. <template>
  2. <div id="post">
  3. <p>{{ str }}{{ num }}</p>
  4. <post-body @addnum='getnum'></post-body>
  5. </div>
  6. </template>

getnum 方法中的参数 str 就是从子组件传递过来的参数 string

  1. <script>
  2. import PostBody from './PostBody'
  3. export default {
  4. name: 'post',
  5. data: () => ({
  6. num: 0,
  7. str:
  8. }),
  9. methods: {
  10. getnum: function (str) {
  11. this.str = str
  12. this.num ++
  13. }
  14. },
  15. components: { PostBody }
  16. }
  17. </script>

这样点击子组件的+1按钮,父组件显示的值就会改变,并且完成一个 +1 的操作

子组件向子组件传递数据

Vue 没有直接子对子传参的方法,建议将需要传递数据的子组件,都合并为一个组件。如果一定需要子对子传参,可以先从传到父组件,再传到子组件。

为了便于开发,Vue 推出了一个状态管理工具 Vuex,可以很方便实现组件之间的参数传递,我们将在下面的章节说到