Vue中的Prop使用$emit让父组件监听事件执行方法

131 阅读1分钟

在写Vue组件的时候,我发现,props是个很有意思的东西。他可以传递父组件里面的属性的值给子组件。

例如有两个组件,父组件:Parent.vue,子组件:Child.vue。

Parent.vue:

  <div>
    <Child :props-name="names"/>
  </div>
</template>

<script lang="js">


import Child from '@/components/Child.vue';

export default {
  name: 'Parent',
  components: {Child},
  data() {
    return {
      names: ['张三', '李四']
    }
  }

}
</script>
Child.vue:


<template>
  <div>
    <span>{{ propsName }}</span>
  </div>
</template>

<script>

export default {
  name: 'Child',
  props: {
    propsName: {
      type: Array,
      default(){
      return['王五']
      },
      
    id:[String,Number]

      required: true

    }
  }
}
</script>

可以看到,我在子组件里声明了props,里面有一个Prop,名字叫propsName,类型限制为数组,并且是必要的。初始值为数组['王五']。还声明了一个叫做id的prop,没有初始值,但可以传入StringNumber类型的参数。

这时候我在父组件里的html结构里引入了子组件<Child/>,这个位置就是子组件显示存在的位置。并且使用v-bind动态绑定了propsName,并传入父组件的data里的names数组。

子组件的<span>标签里我们要显示{{ propsName }},最后就会显示从父组件传进来的datanames的内容。

最后在Router显示Parent.vue的页面时,呈现在页面上的就是

image.png

成功地动态引入了父组件的参数。


props是一个下行绑定,也就是我们并不方便从子组件去改变父组件,也就是外部传进来的值。就要声明一个函数去改变他。

子组件:
this.$emit('update:data', [...this.propsName,'王五'])

父组件:

 <Child :props-name="names"
 @update:data="names = $event"
 />

这样就可以将子组件的propsName拆开,加入王五接着传进父组件的names里。

通常情况下this.$emit也可以让父组件v-on或者我写的@监听事件的内容。

另外,父组件可以用.sync简写为

 <Child :props-name.sync="names"
 />