美文网首页
vue3 hook 下拉框 自用

vue3 hook 下拉框 自用

作者: 很好就这样吧 | 来源:发表于2023-04-11 14:46 被阅读0次
// hook.ts
import { onMounted, reactive, ref } from 'vue';
// 定义下拉框接收的数据格式
export interface SelectOption {
  value: string;
  label: string;
  disabled?: boolean;
  key?: string;
}
// 定义入参格式
interface FetchSelectProps {
  apiFun: () => Promise<any[]>;
}

export function useFetchSelect(props: FetchSelectProps) {
  const { apiFun } = props;

  const options = ref<SelectOption[]>([]);

  const loading = ref(false);

  /* 调用接口请求数据 */
  const loadData = () => {
    loading.value = true;
    options.value = [];
    return apiFun().then(
      (data) => {
        loading.value = false;
        options.value = data;
        return data;
      },
      (err) => {
        // 未知错误,可能是代码抛出的错误,或是网络错误
        loading.value = false;
        options.value = [
          {
            value: '-1',
            label: err.message,
            disabled: true,
          },
        ];
        // 接着抛出错误
        return Promise.reject(err);
      }
    );
  };

  //   onMounted 中调用接口
  onMounted(() => {
    loadData();
  });

  return reactive({
    options,
    loading,
  });
}


// index.vue
<script setup name="DDemo" lang="ts">
  import { useFetchSelect } from './hook';

  //   模拟调用接口
  function getRemoteData() {
    return new Promise<any[]>((resolve, reject) => {
      setTimeout(() => {
        // 模拟接口调用有概率出错
        if (Math.random() > 0.5) {
          resolve([
            {
              key: 1,
              name: '苹果',
              value: 1,
            },
            {
              key: 2,
              name: '香蕉',
              value: 2,
            },
            {
              key: 3,
              name: '橘子',
              value: 3,
            },
          ]);
        } else {
          reject(new Error('不小心出错了!'));
        }
      }, 3000);
    });
  }
   
   // 将之前用的 options,loading,和调用接口的逻辑都抽离到hook中
  const selectBind = useFetchSelect({
    apiFun: getRemoteData,
  });
</script>

<template>
  <div>
    <!-- 将hook返回的接口,通过 v-bind 绑定给组件 -->
    <a-select v-bind="selectBind" />
  </div>
</template>


摘抄来源

作者:背对疾风
链接:https://juejin.cn/post/7181712900094951483
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • Vue3——Hook函数 & 生命周期 & toRef和toRe

    一、Hook函数 Vue3 的hook函数相当于 vue2 的 mixin,不同点在于hooks是函数。Vue3的...

  • Vue3中的Composables组合式函数,Vue3实现min

    Vue3中的Composables是什么Vue3中的Composables 简单理解其实就是类React Hook...

  • vue3 hook函数

    Vue3 的 hook函数 相当于 vue2 的 mixin, 不同在与 hooks 是函数 Vue3 的 hoo...

  • Vue3 Hooks 替代了 Vue2 Mixins

    前言 我们知道,React社区,已经全面拥抱Hook。Vue3的发布也支持了自定义Hook,作为只会Vue2的前端...

  • vue3 hook

    经典的 hook 例子,窗口尺寸发生改变,与其他功能代码无关,可以抽为单独的 hook 。 js文件 文件使用

  • Vue3 学习笔记 (基础)

    Vue3 学习笔记 (基础) 看视频学习的笔记,自用bilibili 尚硅谷禹神 setup 一切的开始 组建中所...

  • Vue3(三)高阶

    好看的网页千篇一律,有趣的代码万里挑一。2022新年好! 关键字: Vue3高阶\Hook函数\ 生命周期\toR...

  • Vue3_28(自定义Hooks)

    Vue3 自定义Hook主要用来处理复用代码逻辑的一些封装这个在vue2 就已经有一个东西是Mixinsmixin...

  • easyui常用方法

    1、下拉框“商品列表”实现 2、下拉框“客户列表”实现 3、下拉框“系统用户”实现 4、下拉框“物流公司”实现

  • Vue3 自定义 hook —— useWindowResize

    useWindowResize 这个一个经典的 hook 例子,窗口尺寸发生改变,与其他功能代码无关,可以抽为单独...

网友评论

      本文标题:vue3 hook 下拉框 自用

      本文链接:https://www.haomeiwen.com/subject/qcmgddtx.html