【译】Vue实用笔记(二十四):Vue中的提供数据组件

当我们使用组件式编程技术时,例如Vue,并不意味这每个组件都要有UI的内容。

实际上,在大型应用中,我最喜欢的提升重用性的方法是 组件积木

使用 scoped slots,假设你已经看了上一个实用笔记【译】Vue实用笔记(二十三):如何使用scoped solts,你可以通过传递一个props的方式,在一个父组件中实用子组件的数据。这允许我们通过合并他们的方式把一个组成一个新的UI和行为组件。

今天我们会展示一个Data provider Component的例子

数据提供层是一个 无UI组件,这意味着,他不要渲染任何内容。

创建一个无UI组件的基础是在一个render方法中创建一个scoped slot并且传递给它一些props:

render() {
  return this.$scopedSlots.default({
    loading: !this.loaded,
    data: this.data
  });
}

因为inconsistency on scoped slots (fixed by version 2.6),你还可以这样做:

render() {
  const slot = this.$scopedSlots.default({
    loading: !this.loaded,
    data: this.data
  });

  return Array.isArray(slot) ? slot[0] : slot;
}

了解了上面的知识,创建一个数据提供组件的时候,我们最好在它的生命周期crated执行一个ajax,然后把这个数据通过prop传递给scoped slot。

一个DataProvider.js 的最终版本可能是这样:

import axios from "axios";

export default {
  props: ["url"],
  data: () => ({
    data: null,
    loaded: false
  }),
  created() {
    axios.get(this.url).then(({ data }) => {
      this.data = data;
      this.loaded = true;
    });
  },
  render() {
    const slot = this.$scopedSlots.default({
      loading: !this.loaded,
      data: this.data
    });

    return Array.isArray(slot) ? slot[0] : slot;
  }
};

注意,他是一个 .js文件,因为这个组件只有script部分,不需要用一个.vue 文件。

数据提供组件也控制加载状态,所以你可以根据不同的状态,加载不同的组件。一个简单的例子如下:

<template>
  <DataProvider url="https://jsonplaceholder.typicode.com/users">
    <div v-slot="{ data, loading }">
      <div v-if="loading">Loading...</div>
      <div v-else>
        <h2>Result: {{ data.length }} users</h2>
        <p v-for="user in data" :key="user.id">{{ user.name }}</p>
      </div>
    </div>
  </DataProvider>
</template>

以上就是今天的全部内容了。

如果你想自己写代码,请点击 CodeSandbox!

Don’t forget to share VueDose with your colleagues, so they also know about these tips as well!

See you next week.

Alex

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一直以来很想写我的妈妈,今天终于动笔了,缘于晚上给她打电话,她跟我说,打算过年不回老家了。她今年跟我弟一起...
    兰花芳香阅读 432评论 3赞 0
  • 哈哈,这是一个有意思的话题。 有哲学家说过,人不可能两次踏进同一条河流。 其实也就是,每一天的我们都不同。 所以其...
    小二火火阅读 576评论 0赞 1
  • 刘婷网中11期坚持分享第353天 2019.07.27 昨天晚上洗好澡,和女儿一起在房间里读书。我完成我的读书打卡...
    天然去雕饰_ab82阅读 159评论 0赞 0
  • 文/L君 你们感受到小L的热情了嘛~ 感恩季 你们有要感恩的人么?不妨对小L说说。有礼物赠送哟~记住每一份用心都会...
    L君有话说阅读 3,122评论 39赞 132
  • 窗外,下着雨。晚上6点多,天色已暗,此时,一杯茶,一台电脑,看着朋友圈自己的步数,已满一万。自从参加“万步有...
    陈妈阅读 652评论 0赞 1

友情链接更多精彩内容