首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vue组合Api呈现函数sync emit不起作用

Vue组合Api呈现函数sync emit不起作用
EN

Stack Overflow用户
提问于 2020-12-29 19:08:07
回答 1查看 1.3K关注 0票数 0

我想重构this教程中关于渲染函数的代码,以使用组合API。除了onClick函数中的context.emit("update:activeTabId", tab.props.tabId);行之外,其他一切都运行正常。控制台记录tab.props.tabId显示onClick函数可以正常工作并正确读取tabId,但update:activeTabId不更新activeTabId值。有没有其他方法可以在组合API中使用sync修饰符来发出事件,或者我做错了什么?

下面是我的代码:

- App.vue

代码语言:javascript
运行
复制
<template>
<!-- eslint-disable-next-line -->
  <tab-container v-model:activeTabId="activeTabId">
    <tab tabId="1">Tab #1</tab>
    <tab tabId="2">Tab #2</tab>
    <tab tabId="3">Tab #3</tab>

    <tab-content tabId="1">Content #1</tab-content>
    <tab-content tabId="2">Content #2</tab-content>
    <tab-content tabId="3">Content #3</tab-content>
  </tab-container>
</template>

<script>
import {ref} from 'vue'
import {Tab, TabContent, TabContainer} from './components/tabs.js';

export default {
  components: {
    Tab, 
    TabContent,
    TabContainer
  },
  setup() {
    const activeTabId = ref('1');

    return {
      activeTabId,
    };
  },
};
</script>

- tabs.js

代码语言:javascript
运行
复制
import { h } from "vue";

export const TabContainer = {
  props: {
    activeTabId: {
      type: String,
      required: true,
    },
  },
  emits: ['update:activeTabId'],
  setup(props, context) {
    const $slots = context.slots.default();
    const tabs = $slots
      .filter((x) => x.type === Tab)
      .map((tab) =>
        h(tab, {
          class: {
            tab: true,
            active: props.activeTabId === tab.props.tabId,
          },
          onClick: () => {
            console.log(tab.props.tabId)
            context.emit("update:activeTabId", tab.props.tabId);
          },
        })
      );

    const content = $slots.find(
      (slot) =>
        slot.props.tabId === props.activeTabId && slot.type === TabContent
    );

    return () => [
      h(() => h("div", { class: "tabs" }, tabs)), 
      h(() => h("div", content))
    ];
  },
};

const tabItem = (content) => ({
  ...content,
  props: {
    tabId: {
      type: String,
      required: true,
    },
  },
  setup(_, context) {
    return () => h("div", context.slots.default())
  }
});

export const Tab = tabItem({ name: "Tab" });
export const TabContent = tabItem({ name: "TabContent" });
EN

回答 1

Stack Overflow用户

发布于 2020-12-30 00:32:31

经过一些研究后,我发现activeTabId正在更新,但TabContainer不知何故没有考虑它的反应性价值,所以它没有变化。我已经用watchEffect封装了所有的TabContainer逻辑,监视activeTabid的变化,现在它可以正常工作了!

https://codesandbox.io/s/solitary-currying-50ick?file=/src/App.vue

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65491163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档