动态组件与数据穿透_vue3选项api

简介: 动态组件与数据穿透_vue3选项api

动态组件与数据穿透_vue3选项api

动态组件

有的需求会想要在两个组件间来回切换,比如 Tab 界面:

上面的例子是通过 Vue 的 <component> 元素和特殊的 is attribute 实现的:

<!-- currentTab 改变时组件也改变 -->
<component :is="currentTab"></component>

在上面的例子中,被传给 :is 的值可以是以下几种:

  • 被注册的组件名
  • 导入的组件对象

你也可以使用 is attribute 来创建一般的 HTML 元素。

当使用 <component :is="..."> 来在多个组件间作切换时,组件会在被切换掉后卸载。我们可以通过 <KeepAlive>组件强制不活跃的组件仍然保持“存活”的状态。

数据穿透

父组件使用provide,任意层级的子组件使用inject。可以实现数据穿透,从而不需要一级一级的使用prop传参。

如果要实现响应式:

  • 传递的参数为一个对象,利用对象传递为传址的js特性
  • 传递一个计算属性(computed)

父组件

<script>
//....
export default {
  provide() {
    return {
      siteTitle: this.db[0].title,
    };
  },
//....
};
</script>

<!--
......
-->

子组件

<script>
export default {
//....
  inject: ["siteTitle"],
  data() {
    return {
      inputKey: this.siteTitle,
    };
  },
//....
};
</script>

<!--
......
-->

ref

我们可以通过ref来使父组件调用子组件的属性和方法

父组件

<script>
export default {
//......
  methods: {
    callShow() {
      this.$refs.component.show();
    },
  },
//......
};
</script>

<!-- .... -->
<button @click="callShow">App调用子组件的方法</button>
<component :is="curComponent" ref="component" />
<!-- .... -->

子组件

<script>
export default {
//....
  methods: {
    show() {
      alert(`${this.inputValue}组件的show方法`);
    },
  },
//....
};
</script>
<!-- ....  -->

实例演示

文件结构为App.vue根组件,component文件夹里面的子组件,data文件夹里面的db.js

App.vue

<script>
import WeChat from "./components/WeChat.vue";
import Site from "./components/Site.vue";
import db from "./data/db";
export default {
  components: { Site, WeChat },
  provide() {
    return {
      siteTitle: this.db[0].title,
    };
  },
  data() {
    return {
      curComponent: "we-chat",
      db,
      components: [
        { title: "微信管理", name: "we-chat" },
        { title: "站点管理", name: "site" },
      ],
    };
  },
  methods: {
    callShow() {
      this.$refs.component.show();
    },
  },
};
</script>

<template>
  <div class="m-4">
    <button
      v-for="(component, index) of components"
      :key="index"
      @click="curComponent = component.name"
      :class="{ 'bg-green-700 text-white': component.name === curComponent }"
    >
      {{ component.title }}
    </button>
    <button @click="callShow">App调用子组件的方法</button>
    <KeepAlive>
      <component :is="curComponent" ref="component" />
    </KeepAlive>
  </div>
</template>

<style scoped>
button {
  @apply m-4 p-2 border-gray-200 border-2 shadow-md hover:shadow-lg;
}
</style>

Card.vue

<script setup></script>

<template>
  <div>
    <header>
      <slot name="header" />
    </header>
    <main>
      <slot />
    </main>
  </div>
</template>

<style scoped lang="scss">
div {
  @apply border-2 border-slate-200 mt-4 rounded-md;
  header {
    @apply border-b-2 border-slate-200 p-3 bg-slate-200;
  }
  main {
    @apply p-3;
  }
}
</style>

Site.vue

<script>
export default {
  inject: ["siteTitle"],
  data() {
    return {
      inputValue: "www.kk.com",
      inputKey: this.siteTitle,
    };
  },
  methods: {
    show() {
      alert(`Site组件的show方法`);
    },
  },
};
</script>

<template>
  <div class="">
    <card>
      <template #header>站点管理</template>
      <x-input title="站点网址" v-model="inputValue" />
      <x-textarea title="站点说明" v-model="inputKey" />
    </card>
  </div>
</template>

<style scoped></style>

WeChat.vue

<script>
export default {
  data() {
    return {
      inputValue: "wechat",
      inputKey: "abcd",
    };
  },
  methods: {
    show() {
      alert(`${this.inputValue}组件的show方法`);
    },
  },
};
</script>

<template>
  <div class="">
    <card>
      <template #header>微信管理</template>
      <x-input title="微信号" v-model="inputValue" />
      <x-input title="密钥" v-model="inputKey" />
    </card>
  </div>
</template>

<style scoped></style>

XInput.vue

<script>
export default {
  props: ["title", "modelValue"],
  // emits: ["update:modelValue"],
  data() {
    return {
      content: this.modelValue,
    };
  },
  watch: {
    content(v) {
      this.$emit("update:modelValue", v);
    },
  },
};
</script>

<template>
  <div class="">
    <label>
      <div>{{ title }}</div>
      <input type="text" v-model="content" />
    </label>
  </div>
</template>

<style scoped lang="scss">
label {
  @apply flex mt-2;
  div {
    @apply mr-4 text-gray-500 w-20;
  }
  input {
    @apply border-2 rounded-md pl-1 pr-1;
  }
}
</style>

XTextarea.vue

<script>
export default {
  props: ["title", "modelValue"],
  data() {
    return {
      key: this.modelValue,
    };
  },
  watch: {
    key(v) {
      this.$emit("update:modelValue", v);
    },
  },
};
</script>

<template>
  <label>
    <div>{{ title }}</div>
    <textarea cols="30" rows="5" v-model="key"></textarea>
  </label>
</template>

<style scoped lang="scss">
label {
  @apply flex mt-2;
  div {
    @apply mr-4 text-gray-500 w-20;
  }
  textarea {
    @apply border-2 rounded-md pl-1 pr-1;
  }
}
</style>

db.js

export default [
  { id: 1, title: 'vue3', preview: '/images/vue.jpg', price: 129 },
  { id: 2, title: 'typescript', preview: '/images/ts.jpg', price: 79 },
  { id: 1, title: 'javascript', preview: '/images/js.png', price: 88 },
]
相关文章
|
1月前
|
存储 数据挖掘 BI
API数据源:轻松接入各类业务系统数据
在数字化转型中,企业面临多样化的数据需求。Quick BI推出API数据源功能,支持广泛的数据接入,包括实时天气、电商交易及内部业务数据,极大丰富了可分析数据范围。该功能提供灵活的连接方式(抽取和直连模式)、多元授权机制(基础认证、前置请求)和自动化数据解析,降低了操作门槛,提升了配置效率。通过动态Token获取等最佳实践,确保数据安全与实时性,满足企业具体业务需求。了解更多,请访问Quick BI官方文档或瓴羊官网。
159 77
|
4天前
|
XML 数据挖掘 API
1688商品详情数据示例参考,1688API接口系列
在成长的路上,我们都是同行者。这篇关于详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
1天前
|
JSON Shell API
如何通过API获取淘宝商品月销售数据
淘宝开放平台提供了丰富的API接口,允许开发者获取商品的详细信息,包括月销售数据。
|
1天前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
11天前
|
数据采集 监控 搜索推荐
深度解析淘宝商品详情API接口:解锁电商数据新维度,驱动业务增长
淘宝商品详情API接口,是淘宝开放平台为第三方开发者提供的一套用于获取淘宝、天猫等电商平台商品详细信息的应用程序接口。该接口涵盖了商品的基本信息(如标题、价格、图片)、属性参数、库存状况、销量评价、物流信息等,是电商企业实现商品管理、市场分析、营销策略制定等功能的得力助手。
|
1月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
6天前
|
人工智能 数据挖掘 API
淘宝评论与商品详情数据API接口的使用与应用
商品详情数据API:获取商品的基本信息(如标题、价格、库存、描述等)。 评论数据API:获取商品的用户评价数据(如评分、评论内容、用户昵称、购买时间等)。
|
22天前
|
搜索推荐 数据挖掘 API
怎么利用商品详情 API 接口实现数据获取与应用?
在电商蓬勃发展的时代,数据成为驱动业务增长的关键。商品详情API接口为电商从业者、开发者和数据分析爱好者提供了获取海量商品数据的途径,助力精准营销、优化用户体验和提升运营效率。本文深入探讨如何利用商品详情API接口进行数据获取与应用,涵盖接口概念、工作原理、不同平台特点、准备工作、数据获取及处理、错误处理,并通过代码示例展示其在电商平台展示、数据分析、竞品分析和个性化推荐等场景中的应用。
38 12
|
28天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
39 12
|
21天前
|
搜索推荐 API 开发者
深度解析:利用商品详情 API 接口实现数据获取与应用
在电商蓬勃发展的今天,数据成为驱动业务增长的核心。商品详情API接口作为连接海量商品数据的桥梁,帮助运营者、商家和开发者获取精准的商品信息(如价格、描述、图片、评价等),优化策略、提升用户体验。通过理解API概念、工作原理及不同平台特点,掌握获取权限、构建请求、处理响应和错误的方法,可以将数据应用于商品展示、数据分析、竞品分析和个性化推荐等场景,助力电商创新与发展。未来,随着技术进步,API接口将与人工智能、大数据深度融合,带来更多变革。
62 3

热门文章

最新文章