首页 > 其他分享 >vue 暴露组件方法

vue 暴露组件方法

时间:2023-09-25 15:45:50浏览次数:33  
标签:vue const 暴露 value router 组件 import speed

loadingbar

<template>
  <div class="wrapper">
    <div ref="bar" class="bar"></div>
  </div>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
let speed = ref<number>(1);
let bar = ref<HTMLDivElement>();
let timer = ref<number>(0);
const startLoading = () => {
  let dom = bar.value as HTMLDivElement;
  speed.value = 1;
  timer.value = window.requestAnimationFrame(function fn() {
    if (speed.value < 90) {
      speed.value += 1;
      dom.style.width = speed.value + '%';
      timer.value = window.requestAnimationFrame(fn);
    } else {
      speed.value = 1;
      window.cancelAnimationFrame(timer.value);
    }
  });
};
const endLoading = () => {
  window.requestAnimationFrame(() => {
    let dom = bar.value as HTMLDivElement;
    setTimeout(() => {
      speed.value = 100;
      dom.style.width = '100%';
    }, 1000);
  });
};


onMounted(() => {
  // startLoading();
  // endLoading();
});

// 给组件暴露出去方法,可以让组件在外部被调用方法
defineExpose({
  startLoading,
  endLoading,
});
</script>

<style scoped lang="scss">
.wrapper {
  position: fixed;
  top: 0;
  width: 100%;
  left: 0;
  height: 10px;
  .bar {
    height: inherit;
    width: 0%;
    background: red;
  }
}
</style>

在路由守卫中使其每次都能被自动加载

import { RouteRecordRaw, createRouter, createWebHistory } from 'vue-router';
import { ElMessage } from 'element-plus';
import LoadingBar from '@/components/LoadingBar.vue';
import { createVNode, render } from 'vue';

// 把组件转成虚拟dom
const vLoadingBar = createVNode(LoadingBar);
render(vLoadingBar, document.body);

const routes: RouteRecordRaw[] = [
  {
    path: '/',
    alias: ['/login'],
    component: () => import('@/views/Login.vue'),
  },
  {
    path: '/index',
    meta: {
      requireAuth: true,
      transition: 'animate__fadeInDownBig',
    },
    component: () => import('@/views/Index.vue'),
  },
];

const router = createRouter({
  // createRouter返回一个router实例
  history: createWebHistory(),
  routes,
});

//const whiteList = ['/'];

router.beforeEach((to, from, next) => {
  vLoadingBar.component?.exposed?.startLoading();
  if (to.meta.requireAuth) {
    if (localStorage.getItem('token')) {
      next();
    } else {
      ElMessage.error('您没有权限访问');
      next('/');
    }
  } else {
    next();
  }
  // if (whiteList.includes(to.path) || localStorage.getItem('token')) {
  //   next();
  // } else {
  //   next('/');
  // }
});

router.afterEach((to, from) => {
  vLoadingBar.component?.exposed?.endLoading();
});

export default router;

标签:vue,const,暴露,value,router,组件,import,speed
From: https://www.cnblogs.com/luckstart/p/17728049.html

相关文章

  • 使用SpringBoot+Vue3的形式实现管理系统的添加功能
    1、查看页面形式2、使用element-plus组件为添加页面引入form表单成功引入form表单组件:3、更改成自己需要的形式4、测试是否可以拿到文本框的数据拿到数据啦!!(记得vue3这里:console.log(form)//不要写this```)#5、vue界面的添加代码<el-form-item>......
  • OPPO主题组件开发 - 调试与预览
    本篇作为OPPO主题组件调试与预览文档的补充,因为它真的很简单而且太老,一些命令已发生变化......
  • vue安装路由
    一、安装命令:npminstallvue-router--save或者cnpminstallvue-router--save二、新建一个router.js router.js大致内容1import{createRouter,createWebHistory}from'vue-router'23constroutes=[4{5path:'/',//主页6......
  • 08_Electron与vue环境搭建
      首先在Vscode控制台输入:npmintall-g@vue/clioryarnglobaladd@vue/cli。  然后再输入npmi-g@vue/cli-init,这时候输入vue-V来看vue是否安装成功。  安装成功后输入vueinitsimulatedgreg/electron-vueeletron-vue,如果出现:     这是网络不稳......
  • 关于时间太长忘记vue如何启动的问题
    1、开启SpringBootApplication项目2、在vue项目的Teminal处,输入相关命令vue2----npmrundevvue3----npmrunserve咳咳,写一遍我就不会忘记啦~......
  • React Hooks中父组件中调用子组件方法
    import {useState,useImperativeHandle,forwardRef}from 'react';//props子组件中需要接受reflet ChildComp=(props,ref)=>{    //此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用    useImperativeHandle(ref,()=>({      ......
  • vue实现大文件切片上传、断点续传、并发数控制等
     一、上传按钮和进度条等<div><h2>上传文件</h2><divref="drag"class="drag"><inputclass="file"type="file"@change="handlerChange"/></div><el-progressstyle="......
  • PySide2如何使加载耗时组件
    QTherad方式#!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/9/2510:12#@Software:PyCharm__author__="JentZhang"fromPySide2.QtWidgetsimportQApplication,QWidget,QVBoxLayout,QPushButton,QLabelfromPySide2.QtCoreimportQThread......
  • vue2兼容ie10
    1.找到ie浏览器。可以下载,一般windows自带2.启动项目,可能会出现再ie中输入本地地址后直接跳转到MicrosoftEdge的情况,需要配置后正常使用ie10配置过程:控制面板--网络和Internet--Internet选项--更改主页--高级--勾选跟InternetExplorer相关的某项。3.解决:babel分为预设和单......
  • 03_Bootstrap基础组件03
    7表单7.1基本实例设置了.form-control类的表单元素,默认设置宽度属性为width:100%;。将label元素和表单元素包裹在.form-group中可以按照排好的样式进行展示。<formaction="#"method="post"><divclass="form-group"><labelfor="email1">邮箱......