Vue3 Hooks 模塊化抽離示例詳解

正文

Vue3中的Hooks 其實就是業務邏輯的抽離,跟Vue2mixin 本質上是一樣的:將當前組件的業務邏輯抽離到一個公共的文件中,提高邏輯復用性,讓當前組件看起來更加清爽,不太一樣的地方是我們封裝hooks 的時候一般是返回一個函數。

todoList demo

先來看一個簡單的例子:todoList demo。

新建一個Vue3+Ts的項目: npm init vite@latest 項目名稱:vue3-hooks, 使用TS,然後cd vue3-hooks -> npm install -> npm run dev 然後刪除不必要的內容,新建一個type 文件夾存放所有的類型,新建一個TodoList.vue編寫我們的業務和視圖代碼:

目錄結構

TodoList.vue代碼如下

<template>
  <h1>To do List</h1>
  添加一條記錄: <input type="text" v-model="data.toAddData.title" />
  <button @click="onAdd">添加</button>
  <br />
  <br />
  <table>
    <thead>
      <tr>
        <td>id</td>
        <td>名稱</td>
        <td>是否完成</td>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in data.list" :key="item.id">
        <td>{{ item.id }}</td>
        <td>{{ item.title }}</td>
        <td>{{ item.isFinished }}</td>
      </tr>
    </tbody>
  </table>
</template>
<script setup lang="ts">
import { reactive } from "vue";
import { IntTodoList } from "../type/todoList";
type DataType = {
  list: IntTodoList[];
  toAddData: IntTodoList;
};
const data = reactive<DataType>({
  list: [],
  toAddData: {
    id: 0,
    title: "",
    isFinished: false,
  },
});
const onAdd = () => {
  data.list.push({ ...data.toAddData, id: data.list.length + 1 });
};
</script>

定義的類型文件

interface IntTodoList {
  id: number;
  title: string;
  isFinished: boolean;
}
export type { IntTodoList };

邏輯抽離

 

  • 新建一個hooks 文件夾,在hooks 文件夾中新建一個todoList.ts 文件,將TodoList.vue 中的data 數據 和onAdd 方法 抽離到hooks文件中,並導出:
import { reactive } from "vue";
import { IntTodoList } from "../../type/todoList";
export default () => {
  type DataType = {
    list: IntTodoList[];
    toAddData: IntTodoList;
  };
  const data = reactive<DataType>({
    list: [],
    toAddData: {
      id: 0,
      title: "",
      isFinished: false,
    },
  });
  const onAdd = () => {
    data.list.push({ ...data.toAddData, id: data.list.length + 1 });
  };
  return { data, onAdd}
};

TodoList.vue 中導入:

<template>
  <h1>To do List</h1>
  添加一條記錄: <input type="text" v-model="data.toAddData.title" />
  <button @click="onAdd">添加</button>
  <br />
  <br />
  <table>
    <thead>
      <tr>
        <td>id</td>
        <td>名稱</td>
        <td>是否完成</td>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in data.list" :key="item.id">
        <td>{{ item.id }}</td>
        <td>{{ item.title }}</td>
        <td>{{ item.isFinished }}</td>
      </tr>
    </tbody>
  </table>
</template>
<script setup lang="ts">
import TodoListHooks from './hooks/todoList'
const {data, onAdd} = TodoListHooks()
</script>

如果其他組件需要data 數據 和 onAdd 方法,也可以導入hooks 文件使用,而且現在再來看TodoList.vue 文件看上去是不是非常清爽。 功能跟未抽離前是一樣的:

完整代碼

以上就是Vue3 Hooks 模塊化抽離示例詳解的詳細內容,更多關於Vue3 Hooks 模塊化抽離的資料請關註WalkonNet其它相關文章!

推薦閱讀: