# Vue3教程 - 16 Hooks

我们先实现一个简单的功能,然后抛出问题。

实现一个简单的功能:

  • 点击按钮,让 count 值+1 ;
  • 点击按钮,发起网络请求,每次请求接口随机获取一段名言。(网络请求后面再讲,这里先简单使用)。

# 16.1 编写简单的功能

首先安装 axios 用来发送网络请求:

# 使用npm
npm install axios

# 或者使用yarn
yarn add axios
1
2
3
4
5

为了方便,我直接在 App.vue 中编写组件内容如下,也可以在子组件中实现:

在下面面的代码中,每次点击 count++ 按钮,count++,每次点击 获取名言 按钮,获取名言,并添加到列表中展示。

<template>
  <div>{{ count }}</div>
  <div>
    <button @click="plus">count++</button>
  </div>
  <br/>
  
  <div>
    <div>
      <button @click="getQuote">获取名言</button>
    </div>
    <ul>
      <li v-for="(quote, index) in quoteList" :key="index">
        {{ quote }}
      </li>
    </ul>
  </div>
</template>

<!-- setup -->
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import axios from 'axios';

let count = ref(0);
let quoteList: string[] = reactive([]);

function plus() {
  count.value++;
}

function getQuote() {
  axios.get('https://api.quotable.io/random').then(
    (response) => {
      // 确保 response.data.content 存在并且是字符串  
      if (typeof response.data.content === 'string') {
        quoteList.push(response.data.content);
      } else {
        console.error('Invalid quote content');
      }
    },
    (error) => {
      alert('获取名言出错');
    }
  )
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

显示效果:

在前面介绍说 Vue3 使用组合式 API ,将同一个功能的数据和逻辑放到一起,但是在前面并没有体现,在上面的代码中,可以看到所有的功能都混合到一起了。

下面就介绍 Hooks,实现各个功能的拆分和封装,体验组合式 API。

# 16.2 Hooks使用

# 1 封装代码到单独的TS文件

可以在 src 下新建 hooks 文件夹,在其中创建单独的 .js.ts 文件,将功能拆分到单独的文件中。

但是需要注意:文件名需要以 use 作为前缀


创建 src/hooks/useCount.ts ,内容如下:

内容未完......