返回

简洁封装:单多选组件实践经验谈

前端

引言
单多选组件是一种常见的交互元素,它允许用户在多个选项中进行选择。在实际开发中,我们经常会遇到需要使用单多选组件的情况,例如:

  • 表单中的单选框和复选框
  • 下拉列表中的单选和多选
  • 标签云中的单选和多选
  • 筛选器中的单选和多选

如果每次都需要从头开始编写单多选组件的代码,不仅会浪费时间,而且还会导致代码重复和维护困难。因此,将单多选组件进行封装是一个非常好的做法。

封装思路

单多选组件的封装主要包括以下几个方面:

  • 结构封装: 将组件的结构代码封装成一个单独的模块,方便复用。
  • 样式封装: 将组件的样式代码封装成一个单独的模块,便于维护。
  • 交互封装: 将组件的交互代码封装成一个单独的模块,提高代码的可读性和可维护性。

封装实现

下面以一个简单的单多选组件为例,来说明如何进行封装。

结构封装

<div class="single-choice">
  <input type="radio" name="single-choice" value="option1" id="option1">
  <label for="option1">选项1</label>

  <input type="radio" name="single-choice" value="option2" id="option2">
  <label for="option2">选项2</label>

  <input type="radio" name="single-choice" value="option3" id="option3">
  <label for="option3">选项3</label>
</div>

<div class="multi-choice">
  <input type="checkbox" name="multi-choice" value="option1" id="option1">
  <label for="option1">选项1</label>

  <input type="checkbox" name="multi-choice" value="option2" id="option2">
  <label for="option2">选项2</label>

  <input type="checkbox" name="multi-choice" value="option3" id="option3">
  <label for="option3">选项3</label>
</div>

上面的代码是一个简单的单多选组件,它包含了一个单选组件和一个多选组件。我们可以将这个组件的结构代码封装成一个单独的模块,如下所示:

import { SingleChoice, MultiChoice } from './single-choice.js';

const singleChoice = new SingleChoice({
  el: document.querySelector('.single-choice')
});

const multiChoice = new MultiChoice({
  el: document.querySelector('.multi-choice')
});

这样,我们就将单多选组件的结构代码封装成了一个单独的模块,便于复用。

样式封装

.single-choice {
  display: flex;
  align-items: center;
}

.single-choice input[type="radio"] {
  margin-right: 5px;
}

.multi-choice {
  display: flex;
  align-items: center;
}

.multi-choice input[type="checkbox"] {
  margin-right: 5px;
}

上面的代码是单多选组件的样式代码,我们可以将它封装成一个单独的模块,如下所示:

import './single-choice.css';

这样,我们就将单多选组件的样式代码封装成了一个单独的模块,便于维护。

交互封装

class SingleChoice {
  constructor({ el }) {
    this.el = el;

    this.radios = this.el.querySelectorAll('input[type="radio"]');
    this.labels = this.el.querySelectorAll('label');

    this.radios.forEach((radio, index) => {
      radio.addEventListener('change', () => {
        this.radios.forEach((radio, index) => {
          radio.checked = false;
        });

        radio.checked = true;
      });
    });
  }
}

class MultiChoice {
  constructor({ el }) {
    this.el = el;

    this.checkboxes = this.el.querySelectorAll('input[type="checkbox"]');
    this.labels = this.el.querySelectorAll('label');

    this.checkboxes.forEach((checkbox, index) => {
      checkbox.addEventListener('change', () => {
        this.checkboxes[index].checked = !this.checkboxes[index].checked;
      });
    });
  }
}

上面的代码是单多选组件的交互代码,我们可以将它封装成一个单独的模块,如下所示:

export { SingleChoice, MultiChoice };

这样,我们就将单多选组件的交互代码封装成了一个单独的模块,提高了代码的可读性和可维护性。

使用封装后的组件

我们可以在其他地方使用封装后的单多选组件,如下所示:

<div id="app"></div>

<script src="./single-choice.js"></script>

<script>
  const app = document.querySelector('#app');

  const singleChoice = new SingleChoice({
    el: app.querySelector('.single-choice')
  });

  const multiChoice = new MultiChoice({
    el: app.querySelector('.multi-choice')
  });
</script>

这样,我们就使用了封装后的单多选组件。

结语

本文分享了作者在开发单多选组件时封装的实践经验,包括了组件的结构、样式、交互等方面的封装,以及在使用组件时如何快速集成和扩展。希望对大家有所帮助。