如何通过可组合项重用 Vue.js 中的逻辑

在软件开发过程中,构建一个可以有效复用代码的库至关重要。重复复制代码会导致代码库臃肿,增加调试难度,尤其是在大型应用中。

Vue 通过可组合函数简化了代码的复用。可组合函数是封装特定逻辑的函数,可以在项目中重复使用以处理类似的功能。

曾经只有可组合函数吗?

在 Vue 3 引入可组合函数之前,可以通过混入 (mixins) 来捕获代码并在应用程序的不同部分复用。混入包含了 Vue.js 的选项,如数据、方法和生命周期钩子,从而实现跨多个组件的代码复用。

要创建混入,可以将其构建在单独的文件中,然后通过将混入添加到组件的选项对象中的 mixins 属性来应用于组件。例如:

 
export const formValidationMixin = {
  data() {
    return {
      formData: {
        username: '',
        password: '',
      },
      formErrors: {
        username: '',
        password: '',
      },
    };
  },
  methods: {
    validateForm() {
      this.formErrors = {};

      if (!this.formData.username.trim()) {
        this.formErrors.username="用户名是必填的。";
      }

      if (!this.formData.password.trim()) {
        this.formErrors.password = '密码是必填的。';
      }
      
      return Object.keys(this.formErrors).length === 0;
    },
  },
};

这段代码展示了一个用于表单验证的混入。该混入包含两个数据属性:formDataformErrors,初始值都为空。

formData 存储表单的输入数据,包括初始化为空的用户名和密码字段。formErrors 镜像此结构,用于保存潜在的错误消息,初始值也为空。

混入还包含一个方法 validateForm(),用于检查用户名和密码字段是否为空。如果任何一个字段为空,将使用相应的错误消息填充 formErrors 数据属性。

formErrors 为空时,该方法返回 true,表示表单有效。可以通过将混入导入到 Vue 组件并将其添加到选项对象的 mixins 属性来使用混入:

 <template>
  <div>
    <form @submit.prevent="submitForm">
      <div>
        <label for="username">用户名:</label>
        <input type="text" id="username" v-model="formData.username" />
        <span class="error">{{ formErrors.username }}</span>
      </div>
      <div>
        <label for="password">密码:</label>
        <input type="password" id="password" v-model="formData.password" />
        <span class="error">{{ formErrors.password }}</span>
      </div>
      <button type="submit">提交</button>
    </form>
  </div>
</template>

<script>
import { formValidation } from "./formValidation.js";

export default {
  mixins: [formValidation],
  methods: {
    submitForm() {
      if (this.validateForm()) {
        alert("表单提交成功!");
      } else {
        alert("请修正表单中的错误。");
      }
    },
  },
};
</script>

<style>
.error {
  color: red;
}
</style>

这个示例展示了一个使用选项对象方法编写的 Vue 组件。mixins 属性包含所有导入的混入。在这种情况下,组件使用 formValidation 混入中的 validateForm 方法来通知用户表单是否提交成功。

如何使用可组合函数

可组合函数是一个独立的 JavaScript 文件,它具有根据特定问题或需求定制的功能。可以在可组合函数中利用 Vue 的组合 API,使用诸如 refcomputed 等功能。

通过对组合 API 的访问,可以创建集成到各种组件中的函数。这些函数返回一个对象,可以通过组合 API 的 setup 函数轻松导入并合并到 Vue 组件中。

在项目的 src 目录中创建一个新的 JavaScript 文件来使用可组合函数。对于较大的项目,请考虑在 src 中组织一个文件夹,并为不同的可组合函数创建单独的 JavaScript 文件,确保每个可组合函数的名称反映其用途。

在 JavaScript 文件中,定义需要的函数。下面是将 formValidation 混入重构为可组合函数的示例:

 
import { reactive } from 'vue';

export function useFormValidation() {
  const state = reactive({
    formData: {
      username: '',
      password: '',
    },
    formErrors: {
      username: '',
      password: '',
    },
  });

  function validateForm() {
    state.formErrors = {};

    if (!state.formData.username.trim()) {
      state.formErrors.username="用户名是必填的。";
    }

    if (!state.formData.password.trim()) {
      state.formErrors.password = '密码是必填的。';
    }

    return Object.keys(state.formErrors).length === 0;
  }

  return {
    state,
    validateForm,
  };
}

这段代码首先从 vue 包中导入 reactive 函数。然后它创建一个可导出的函数 useFormValidation()

接下来创建一个响应式变量 state,其中包含 formDataformErrors 属性。然后,这段代码使用与混入非常相似的方法来处理表单验证。最后,它以对象的形式返回 state 变量和 validateForm 函数。

可以通过从组件中的文件导入 JavaScript 函数来使用此可组合函数:

 <template>
  <div>
    <form @submit.prevent="submitForm">
      <div>
        <label for="username">用户名:</label>
        <input type="text" id="username" v-model="state.formData.username" />
        <span class="error">{{ state.formErrors.username }}</span>
      </div>
      <div>
        <label for="password">密码:</label>
        <input type="password" id="password" v-model="state.formData.password" />
        <span class="error">{{ state.formErrors.password }}</span>
      </div>
      <button type="submit">提交</button>
    </form>
  </div>
</template>

<script setup>
import { useFormValidation } from "./formValidation.js";
import { ref } from "vue";
const { state, validateForm } = useFormValidation();

const submitForm = () => {
  if (validateForm()) {
    alert("表单提交成功!");
  } else {
    alert("请修正表单中的错误。");
  }
};
</script>

<style>
.error {
  color: red;
}
</style>

导入 useFormValidation 可组合函数后,这段代码会解构它返回的 JavaScript 对象并继续进行表单验证。它会提醒提交的表单是否成功或有错误。

可组合函数是新的混入

虽然混入在 Vue 2 中对于代码复用很有用,但在 Vue 3 中可组合函数已经取代了它们。可组合函数提供了一种更加结构化和可维护的方法来复用 Vue.js 应用程序中的逻辑,从而更容易使用 Vue 构建可扩展的 Web 应用程序。