Skip to content

编写一个vue组件,组件内部使用插槽接收外部内容,v-model双向绑定,实现折叠展开的功能

Posted on:2023年12月17日 at 18:31

下面是示例代码:

<template>
  <div>
    <button @click="toggleCollapse">{{ collapsed ? '展开' : '折叠' }}</button>
    <div v-show="!collapsed">
      <slot></slot>
    </div>
  </div>
</template>

<script>
  export default {
    model: {
      prop: "collapsed",
      event: "toggle",
    },
    props: {
      collapsed: {
        type: Boolean,
        default: true,
      },
    },
    methods: {
      toggleCollapse() {
        this.$emit("toggle", !this.collapsed);
      },
    },
  };
</script>

此组件包含一个按钮,根据collapsed属性的值显示”折叠”或”展开”文本。在按钮的click事件中,调用toggleCollapse方法来切换collapsed的状态,并通过自定义事件toggle将新的状态传递给父组件。

组件内部有一个v-show指令,根据collapsed属性的值决定是否显示插槽内容。当collapsedtrue时,插槽内容将被隐藏;当collapsedfalse时,插槽内容将显示出来。

在使用该组件时,可以使用v-model来进行双向绑定:

<template>
  <div>
    <collapse-panel v-model="isCollapsed">
      <!-- 插入要折叠展开的内容 -->
      <p>这是要折叠展开的内容</p>
    </collapse-panel>
  </div>
</template>

<script>
  import CollapsePanel from "@/components/CollapsePanel.vue";

  export default {
    components: {
      CollapsePanel,
    },
    data() {
      return {
        isCollapsed: true,
      };
    },
  };
</script>

此外,将isCollapsed属性绑定到v-model指令上,以实现双向绑定。通过控制isCollapsed的值,可以折叠或展开插槽内的内容。

原文转自:https://fe.ecool.fun/topic/a4905b6d-283a-48ee-8c19-6f390f7fd9bc