再浅浅了解一下alova吧 4.0

488 阅读2分钟

在上一篇3.0的文章中,我们了解了一下页面初始化获取数据最常用的方法useRequest,这次4.0的文章中让我们来了解一下useWatcher--状态变化请求,在有一些场景中,有一些数据会变化而需要重新请求,如分页,数据筛选,模糊查询等,就可以使用我们今天所要了解的的useWatcher来监听状态的变化而立即发送乡音的请求。

让我们来看一下官方给出的示例(展示的均是Vue3.2)

1.关键字搜索

<template>
  <!-- keyword随着输入内容变化而变化 -->
  <input v-model="keyword" />

  <!-- 渲染筛选后的todo列表 -->
  <div v-if="loading">Loading...</div>
  <template v-else>
    <div v-for="todo in data">
      <div class="todo-title">{{ todo.title }}</div>
      <div class="todo-time">{{ todo.time }}</div>
    </div>
  </template>
</template>

<script setup>
  // 创建method实例
  const filterTodoList = keyword => {
    return alovaInstance.Get('/todo/list/search', {
      params: {
        keyword
      }
    });
  };
  const keyword = ref('');
  const {
    loading,
    data,
    error

    // 第一个参数必须为返回method实例的函数
  } = useWatcher(
    () => filterTodoList(keyword.value),

    // 被监听的状态数组,这些状态变化将会触发一次请求
    [keyword],
    {
      // 设置500ms防抖,如果keyword频繁变化,只有在停止变化后500ms才发送请求
      debounce: 500
    }
  );
</script>

2.分页

<template>
  <!-- ... -->
</template>

<script setup>
  // method实例创建函数
  const getTodoList = currentPage => {
    return alovaInstance.Get('/todo/list', {
      params: {
        currentPage,
        pageSize: 10
      }
    });
  };

  const currentPage = ref(1);
  const {
    loading,
    data,
    error

    // 第一个参数为返回method实例的函数,而非method实例本身
  } = useWatcher(
    () => getTodoList(currentPage.value),
    // 被监听的状态数组,这些状态变化将会触发一次请求
    [currentPage],
    {
      // ⚠️调用useWatcher默认不触发,注意和useRequest的区别
      // 手动设置immediate为true可以初始获取第1页数据
      immediate: true
    }
  );
</script>

3.手动发送请求

手动发送请求和上一篇中的useRequest发送请求一样,有时候你希望在监听状态未变化时重新发送请求(如服务端数据已更新),你也可以通过send函数手动触发请求。

4.强制发送请求

缓存数据可以提升应用流畅度,以及减小服务器端的压力,但同时存在数据过期的问题弊端,当希望穿透数据缓存获取最新数据时,可以设置force属性达到此效果。

设置静态值

force 默认为 false,设置为 true 时将每次穿透缓存,并发送请求

useWatcher(
  () => alovaInstance.Get('/todo'),
  [
    /* watchingStates */
  ],
  {
    force: true
  }
);

动态设置 force 值

实际情况中,我们经常需要根据不同情况来设置是否需要强制发送请求,此时可以将 force 设置为一个函数,此函数可通过 send 函数传入。

const { send } = useWatcher(
  alovaInstance.Get('/todo'),
  [
    /* watchingStates */
  ],
  {
    force: id => {
      return !!id;
    }
  }
);
send(1);

5.send函数的传递规则

在上面所说的实例中,send函数触发请求,可以接受任意多个参数,这些参数分别被下面四个函数接收

onSuccess、onError、onComplete 回调函数中的event.sendArgs以数组形式接收

const { send, onSuccess, onError, onComplete } = useWatcher(currentPage => getTodoList(currentPage));
onSuccess(event => {
  // sendArgs的值为[1]
  console.log(event.sendArgs);
});
onError(event => {
  // sendArgs的值为[1]
  console.log(event.sendArgs);
});
onComplete(event => {
  // sendArgs的值为[1]
  console.log(event.sendArgs);
});
send(1);

在 force 函数中接收

const { send } = useWatcher(
  alovaInstance.Get('/todo'),
  [
    /* watchingStates */
  ],
  {
    force: id => {
      return !!id;
    }
  }
);
send(1);

这篇文章主要学习了一下有关useWatcher有关如何发送状态变化请求,以及send参数传递规则,主要是依照如上提供的官方示例代码进行学习尝试哈!