Home  >  Article  >  Web Front-end  >  How to implement multi-level linkage menu in Vue?

How to implement multi-level linkage menu in Vue?

PHPz
PHPzOriginal
2023-06-25 19:37:392089browse

Vue.js is a popular front-end framework, and many websites use Vue.js to develop interactive UIs. One common UI component is a multi-level cascading menu (also known as a cascading selector), which allows users to select one option to filter the list of another option, allowing for more granular search or navigation capabilities. In this article, we will introduce how to use Vue.js to implement a multi-level linkage menu.

  1. Preparation

Before we begin, we need to make sure we have Vue.js installed. It can be installed using npm or Vue.js’ official CDN. Suppose we already have a Vue.js application and now need to add a multi-level linkage menu component.

  1. Create a multi-level linkage menu component

We will create a single file component CascadingMenu.vue to implement a simple multi-level linkage menu. In the component's template, we'll use Vue.js's v-for directive to render a list of each option, and v-model to bind the option's value to the user-selected value. When the user selects an option, we need to update the submenu's option list and display it.

<template>
  <div class="cascading-menu">
    <select v-model="selectedOption">
      <option value="">请选择</option>
      <option v-for="option in options" :value="option">{{ option.label }}</option>
    </select>
    <cascading-menu v-if="hasChildren" :options="selectedOption.children" />
  </div>
</template>

<script>
export default {
  name: 'CascadingMenu',
  props: {
    options: {
      type: Array,
      default: () => [],
      required: true
    },
    selectedValue: {
      default: null,
      required: false
    }
  },
  data() {
    return {
      selectedOption: this.selectedValue,
      hasChildren: false
    };
  },
  watch: {
    selectedOption() {
      this.hasChildren = this.selectedOption.children.length > 0;
    }
  }
};
</script>

Now we have created a simple multi-level linkage menu component that can display each option and bind the value selected by the user to selectedOption.

  1. Add data

Before implementing the multi-level linkage menu, we need to prepare some data to simulate the options that the user can choose. We can use a simple array of objects to represent each option and their submenu as shown below.

data() {
    return {
      options: [
        {
          label: '选项1',
          children: [
            {
              label: '选项1-1',
              children: [
                { label: '选项1-1-1', children: [] },
                { label: '选项1-1-2', children: [] },
                { label: '选项1-1-3', children: [] }
              ]
            },
            {
              label: '选项1-2',
              children: [{ label: '选项1-2-1', children: [] }]
            }
          ]
        },
        {
          label: '选项2',
          children: [
            {
              label: '选项2-1',
              children: [
                { label: '选项2-1-1', children: [] },
                { label: '选项2-1-2', children: [] },
                { label: '选项2-1-3', children: [] }
              ]
            },
            {
              label: '选项2-2',
              children: [{ label: '选项2-2-1', children: [] }]
            }
          ]
        }
      ]
    };
  }

Each option has a label attribute and a children attribute. The children attribute represents the option of the submenu (if it exists).

  1. Implementing multi-level linkage menu

We have created a multi-level linkage menu component and prepared the data, now we need to combine them and use recursive components To implement multi-level linkage menu. We can include the cascading-menu component in the App.vue file and pass the options data to it as props. Inside the cascading-menu component, we will display all submenus by calling itself recursively to achieve a multi-level linkage menu.

<template>
  <div class="app">
    <cascading-menu :options="options" />
  </div>
</template>

<script>
import CascadingMenu from './components/CascadingMenu';

export default {
  name: 'App',
  components: {
    CascadingMenu
  },
  data() {
    return {
      options: [
        {
          label: '选项1',
          children: [
            {
              label: '选项1-1',
              children: [
                { label: '选项1-1-1', children: [] },
                { label: '选项1-1-2', children: [] },
                { label: '选项1-1-3', children: [] }
              ]
            },
            {
              label: '选项1-2',
              children: [{ label: '选项1-2-1', children: [] }]
            }
          ]
        },
        {
          label: '选项2',
          children: [
            {
              label: '选项2-1',
              children: [
                { label: '选项2-1-1', children: [] },
                { label: '选项2-1-2', children: [] },
                { label: '选项2-1-3', children: [] }
              ]
            },
            {
              label: '选项2-2',
              children: [{ label: '选项2-2-1', children: [] }]
            }
          ]
        }
      ]
    };
  }
};
</script>

Now we have implemented a simple multi-level linkage menu, the user can click on one of the options to display its submenu. For each submenu, we can display the options of all submenus by calling the cascading-menu component recursively.

  1. Summary

In this article, we learned how to use Vue.js to implement a multi-level linkage menu. We created a simple cascading-menu component and used recursive calls to itself to implement multi-level cascading menus. By preparing and working with the data, we show how to render each option and leverage v-model to bind the option's value to the user-selected value. We hope this article helps you better understand the use of Vue.js and create more powerful UI components.

The above is the detailed content of How to implement multi-level linkage menu in Vue?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn