Vue 2中实现父子组件无限循环的方法:使用插槽
P粉128563140
P粉128563140 2023-09-03 15:13:47
[Vue.js讨论组]
<p>我需要从父组件中调用子组件的一个方法。然而,我在子组件中做的一些事情似乎导致了一个无限循环。我尝试过查看其他问题,虽然它们似乎是在解决类似的问题,但我无法将它们的确切模式应用到我面临的问题上,它似乎是不同的。我只是不确定我在看什么。</p> <p>我有两个组件,一个叫做ToggleButtons,另一个被简化为一个按钮。这是ToggleButtons:</p> <pre class="brush:php;toolbar:false;">&lt;template&gt; &lt;div role=&quot;list&quot;&gt; &lt;div role=&quot;listitem&quot;&gt; &lt;slot name=&quot;left&quot; :is-selected=&quot;leftSelected&quot; :toggleLeft=&quot;toggle('left')&quot; /&gt; &lt;/div&gt; &lt;div role=&quot;listitem&quot;&gt; &lt;slot name=&quot;right&quot; :is-selected=&quot;rightSelected&quot; :toggleRight=&quot;toggle('right')&quot; /&gt; &lt;/div&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; 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'; } } } &lt;/script&gt;</pre> <p>这是它与按钮的实现:</p> <pre class="brush:php;toolbar:false;">&lt;ToggleButtons ref=&quot;tb&quot;&gt; &lt;template v-slot:left=&quot;{ isSelected, }&quot;&gt; &lt;button class=&quot;button&quot; :class=&quot;{ secondary: !isSelected }&quot; :aria-pressed=&quot;isSelected&quot; :togglable=&quot;true&quot; v-text=&quot;'left'&quot; @click=&quot;toggle('left')&quot; /&gt; &lt;/template&gt; &lt;template v-slot:right=&quot;{ isSelected, }&quot;&gt; &lt;button class=&quot;button&quot; :class=&quot;{ secondary: !isSelected }&quot; :aria-pressed=&quot;isSelected&quot; :togglable=&quot;true&quot; v-text=&quot;'right'&quot; @click=&quot;toggle('right')&quot; /&gt; &lt;/template&gt; &lt;/ToggleButtons&gt;</pre> <p>其中toggle方法为:</p> <pre class="brush:php;toolbar:false;">toggle(direction) { this.$refs.tb.toggle(direction); },</pre> <p>正如你可能已经从代码中看到的残留物,我之前尝试过各种模式,包括通过v-slot传递toggle方法。所有这些都导致了相同的“你创建了一个无限循环”的消息。</p> <p>我想知道是否因为该方法在尝试渲染时调用了toggle。我不确定这是否会导致无限循环。我在这里的主要问题是我不明白这个循环是从哪里来的。我目前的主要目标是理解出了什么问题,这样如果再次发生,我就能看到它,即使修复方法只是找到一个更简单的方法。</p>
P粉128563140
P粉128563140

全部回复(1)
P粉727531237

以下对toggle函数的绑定对我来说没有任何意义:

:toggleLeft="toggle('left')"
:toggleRight="toggle('right')

由于该函数不返回任何值,所以这是错误的。

这两个绑定会导致函数无限调用toggle('left')toggle('right')

只需在toggle函数中添加console.log(direction)以查看发生了什么。

如果您想获得关于正确解决方案的建议,请描述您想要实现的目标。

Vue.component('toggle-buttons',{
  props: {
    leftSelectedInitially: {
        type: Boolean,
        default: true,
    }
  },
  data() {
      return {
          leftSelected: true,
          rightSelected: false,
      }
  },
  beforeMount() {
      //this.leftSelected = this.leftSelectedInitially;
      //this.rightSelected = !this.leftSelectedInitially;
  },
  methods: {
      toggle(override) {
          console.log(`override: ${override}`)
          this.leftSelected = override == 'left';
          this.rightSelected = override == 'right';
      }
  },
  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>
`
});

new Vue({
  el:'#app',
  methods: {
  toggle(direction) {
    console.log(`direction: ${direction}`)
    this.$refs.tb.toggle(direction);
    }
  }
})
#app { line-height: 2; }
[v-cloak] { display: none; }
<div id="app">
<toggle-buttons 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>
</toggle-buttons>
</div>
<script src="https://unpkg.com/vue@2/dist/vue.min.js"></script>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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