Vue 2中实现父子组件无限循环的方法:使用插槽
P粉128563140
P粉128563140 2023-09-03 15:13:47
[Vue.js讨论组]

我需要从父组件中调用子组件的一个方法。然而,我在子组件中做的一些事情似乎导致了一个无限循环。我尝试过查看其他问题,虽然它们似乎是在解决类似的问题,但我无法将它们的确切模式应用到我面临的问题上,它似乎是不同的。我只是不确定我在看什么。

我有两个组件,一个叫做ToggleButtons,另一个被简化为一个按钮。这是ToggleButtons:

<template>
    <div role="list">
        <div role="listitem">
            <slot name="left" :is-selected="leftSelected" :toggleLeft="toggle('left')" />
        </div>
        <div role="listitem">
            <slot name="right" :is-selected="rightSelected" :toggleRight="toggle('right')" />
        </div>
    </div>
</template>

<script>

    export default {
        props: {
            leftSelectedInitially: {
                type: Boolean,
                default: true,
            }
        },

        data() {
            return {
                leftSelected: true,
                rightSelected: false,
            }
        },

        beforeMount() {
            this.leftSelected = this.leftSelectedInitially;
            this.rightSelected = !this.leftSelectedInitially;
        },

        methods: {
            toggle(override) {
                this.leftSelected = override == 'left';
                this.rightSelected = override == 'right';
            }
        }

    }
</script>

这是它与按钮的实现:

<ToggleButtons ref="tb">
    <template v-slot:left="{
        isSelected,
    }">
        <button
            class="button"
            :class="{ secondary: !isSelected }"
            :aria-pressed="isSelected"
            :togglable="true"
            v-text="'left'"
            @click="toggle('left')"
        />
    </template>
    <template v-slot:right="{
        isSelected,
    }">
        <button
            class="button"
            :class="{ secondary: !isSelected }"
            :aria-pressed="isSelected"
            :togglable="true"
            v-text="'right'"
            @click="toggle('right')"
        />
    </template>
</ToggleButtons>

其中toggle方法为:

toggle(direction) {
    this.$refs.tb.toggle(direction);
},

正如你可能已经从代码中看到的残留物,我之前尝试过各种模式,包括通过v-slot传递toggle方法。所有这些都导致了相同的“你创建了一个无限循环”的消息。

我想知道是否因为该方法在尝试渲染时调用了toggle。我不确定这是否会导致无限循环。我在这里的主要问题是我不明白这个循环是从哪里来的。我目前的主要目标是理解出了什么问题,这样如果再次发生,我就能看到它,即使修复方法只是找到一个更简单的方法。

P粉128563140
P粉128563140

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号