返回

Vue.js 中仅折叠一个组件,不再纠结

vue.js

解决 Vue.js 中仅折叠一个组件的难题

引言

在构建 Vue.js 应用程序时,可折叠组件是一种方便的功能,允许用户根据需要显示或隐藏内容。然而,当您希望仅折叠一个组件,而不是所有组件时,您可能会遇到一个问题。

问题

当使用全局 collapsed 数据属性时,点击任何可折叠组件的标题都会导致所有组件同时折叠。这与我们仅想折叠特定组件的意图相矛盾。

解决方法:局部作用域 collapsed 数据属性

为了解决这个问题,我们需要将 collapsed 数据属性移动到每个 <collapsible> 组件的局部作用域中。这将使每个组件可以独立控制其折叠状态。

<collapsible> 组件的 <script> 部分添加以下代码:

export default {
  data() {
    return {
      collapsed: false, // 每个组件局部 collapsed 数据属性
    };
  },
};

改进后的代码

使用局部 collapsed 数据属性的改进代码如下:

<!-- Vue.js 代码 -->

<div id="foo"></div>

<script type="text/x-template" id="collapsible">
  <script>
    export default {
      data() {
        return {
          collapsed: false, // 每个组件局部 collapsed 数据属性
        };
      },
    };
  </script>

  <div class="wrapper">
    <div class="header" v-on:click="collapsed = !collapsed">
      <p>original: ""</p>
    </div>

    <div class="collapsible" v-show="!collapsed">1111</div>
  </div>
</script>

<script type="text/x-template" id="app">
  <div>
    <button v-on:click="collapseAll">Collapse All</button>
    <button v-on:click="expandAll">Expand All</button>

    <div class="wrapper">
      <collapsible ref="collapsible"></collapsible>

      <div v-for="question in questions" v-bind:key="question">
        <p
          :class="question.is_answered ? 'header_answered' : 'header'"
          v-on:click="collapsed = !collapsed"
        >
          {{ question.question_id}} - {{ question.question_title}}
        </p>
        <div
          class="collapsible"
          v-show="!collapsed"
          v-bind:key="question"
          v-for="answer in question.answers"
        >
          <p>{{answer.answer_title}}</p>
        </div>
      </div>
      <!-- .questions -->
    </div>
    <!-- .wrapper -->
  </div>
  <!-- .main -->
</script>

结论

通过使用局部 collapsed 数据属性,我们成功解决了仅折叠一个 Vue.js 组件的问题,从而提高了应用程序的可用性和灵活性。

常见问题解答

1. 为什么全局 collapsed 数据属性会导致所有组件折叠?

因为全局数据属性在所有组件之间共享,所以修改一个组件的 collapsed 状态也会影响其他组件。

2. 如何自定义可折叠组件的标题?

可以通过在 <div class="header"> 中放置所需的 HTML 来自定义标题。

3. 我可以在不同的 <collapsible> 组件中使用不同的标题吗?

是的,你可以通过使用插槽或绑定动态标题内容来实现这一点。

4. 如何在初始化时折叠所有组件?

可以在 data 函数中将 collapsed 属性设置为 true 来实现。

5. 我可以使用什么其他方法来实现可折叠组件?

可以使用 CSS 转换、动画或第三方库,例如 Vuetify 或 Bootstrap Vue。