其他分享
首页 > 其他分享> > 浅谈 Vue 中用于父子组件传递数据的方式:prop 和 slot

浅谈 Vue 中用于父子组件传递数据的方式:prop 和 slot

作者:互联网

简单介绍

开发可复用组件时,经常需要父子组件间相互传递数据。Vue 提供了 prop 和 slot 两种特性用于处理不同的场景:

这里的比喻不一定准确,但是可能有助于理解这两种特性的使用场景和行为。

prop 的定义与使用

在子组件的 props 属性中定义需要暴露到外部的 prop,然后在父组件中通过指定名称传入数据,而且可以指定 prop 的类型、是否必需、默认值等特性,这些特点都与函数参数的用法很像。

简单示例——显示“地区-日期-时间”的组件,<son> 表示子组件:

父组件:

<!-- HTML模板 -->
<son :region="region" :date="date" :time="time"></son>

// Javascript
... // 其他内容省略
  data() {
    return {
      region: { country: "China", province: "Beijing" },
      today: new Date(),
    };
  },
  computed: {
    date() {
      return this.today.getDate();
    },
    time() {
      return {
        hour: this.today.getHours(),
        minute: this.today.getMinutes(),
        second: this.today.getSeconds(),
      };
    },
  },
  components: {
    son,
  },
...

子组件

... // 其他内容省略
  props: {
    region: {
      country: String,
      province: String,
    },
    date: {
      type: Number,
      required: true,
    },
    time: {
      hour: {
        type: [Number, String],
        default: 0,
      },
      minute: {
        type: Number,
        default: 0,
      },
      second: {
        type: Number,
        default: 0,
      },
    },
  },
...

插槽 slot 的类型与使用

插槽使用示例

父组件:

<son>
  这是一句话。
  <template>这是另一句话。</template>
  <!-- 具名插槽 -->
  <template v-slot:header>
    <p>这是头部</p>
  </template>
  <template #content>
    <p>这是主体</p>
  </template>
  <!-- 这里指定了不存在的具名插槽,里面的内容会被忽略 -->
  <template #footer>
    <p>这是底部</p>
  </template>
  <!-- 作用域插槽 -->
  <!-- 这里将作用插槽中的默认内容姓替换为了名 -->
  <template v-slot:person="scope">
    <p>{{scope.user.firstName}}</p>
  </template>
</son>

子组件:

<div class="son">
    <!-- 具名插槽 -->
    <slot name="header"></slot>
    <!-- 相同的具名插槽会重复输出传入的内容 -->
    <slot name="content"></slot>
    <slot name="content"></slot>
    <!-- 默认插槽 -->
    <slot></slot>
    <!-- 作用域插槽 -->
    <slot
      name="person"
      :user="user"
    >{{ user.lastName }}</slot>
  </div>

页面输出结果:

总结

综上,prop 表现得更像数据型函数参数,至于子组件使用这些数据做什么、怎么做,父组件无法干预;而 slot 更像是传入了一个回调函数,使子组件具备了更多功能,甚至可以像回调函数操作 caller 函数内部数据一样,操作子组件的内部数据。

标签:slot,浅谈,default,插槽,prop,组件,传递数据,today
来源: https://www.cnblogs.com/cjc917/p/16180271.html