vue实用小方法

www.jswusn.com Other 2025-04-28 09:48:14 6次浏览

1. 用 Suspense 实现丝滑的异步组件加载

在前端开发中,异步组件加载是个常见的需求。要是加载过程处理不好,用户体验可就大打折扣了。Vue3 的 Suspense 组件就能帮我们解决这个问题,让异步组件加载变得丝滑无比。

// 引入 defineAsyncComponent 和 Suspense 组件
import { defineAsyncComponent, Suspense } from 'vue';
// 定义一个异步组件,使用 import 动态导入组件
const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));
export default { 
  setup() {   
    // 这里可以写一些 setup 函数的逻辑    
    return {}; 
    }, 
  template: `    
    <!-- 使用 Suspense 组件包裹异步组件 -->    
    <Suspense>     
     <!-- 当异步组件加载成功时显示该组件 --> 
          <template #default>   
               <AsyncComponent />  
           </template>    
           <!-- 当异步组件加载中时显示加载提示 -->    
           <template #fallback>        
            <div>加载中,请稍候...</div>      
           </template>    
       </Suspense>  
     `
};

这里的 Suspense 组件就像是一个智能的加载管理器。当异步组件还在加载的时候,它会显示我们设置的加载提示,等组件加载完成后,就会自动显示组件内容。这样一来,用户就不会因为长时间的白屏而感到烦躁,大大提升了用户体验。

2. Teleport 让组件渲染到任意位置

有时候,我们会遇到这样的需求:一个组件的逻辑在某个地方,但它的渲染位置却要在其他地方,比如模态框、下拉菜单等。Vue3 的 Teleport 组件就能轻松实现这个功能。

// 引入 Teleport 组件
import { Teleport } from 'vue';
export default {  
  setup() {    
    // 这里可以写一些 setup 函数的逻辑    
    return {}; 
  },  
  template: `    
    <!-- 使用 Teleport 组件将内容渲染到指定位置 -->    
    <Teleport to="body">      
      <!-- 这里是要渲染的内容 -->      
      <div class="modal">        
        <h2>这是一个模态框</h2>        
        <button>关闭</button>      
      </div>    
    </Teleport>  
  `
};

Teleport 组件就像是一个传送门,它可以把组件的内容传送到指定的 DOM 节点下。在这个例子中,我们把模态框传送到了 body 标签下,这样就能避免一些样式和布局的问题。

3. 使用 provide 和 inject 实现跨层级组件通信

在大型项目中,组件之间的层级关系可能会很复杂,要是通过传统的父子组件通信方式,代码会变得很混乱。Vue的 provide 和 inject 就可以解决这个问题,让跨层级组件通信变得简单直接。

// 父组件
import { provide } from 'vue';
export default {  
  setup() {    
    // 定义要提供的数据    
    const userInfo = {    
      name: '菜鸡一号',   
      age: 30  
    };  
    // 使用 provide 提供数据,第一个参数是数据的键,第二个参数是数据的值    
    provide('userInfo', userInfo);    
    return {};  
  }
};
// 子组件(可能是隔了很多层的子组件)
import { inject } from 'vue';
export default {  
  setup() {    
    // 使用 inject 注入数据,参数是要注入的数据的键    
    const userInfo = inject('userInfo');   
    return {    
      userInfo 
    };
  },  
  template: `    
    <div>      
      <!-- 显示注入的数据 -->      
      <p>姓名: {{ userInfo.name }}</p>      
      <p>年龄: {{ userInfo.age }}</p>    
    </div>  
  `
};


provide 和 inject 就像是一个数据管道,父组件通过 provide 把数据放进去,子组件通过 inject 从管道里取出数据。这样,不管组件之间隔了多少层,都能轻松实现数据共享。

4. 用 v-memo 缓存组件部分内容

在一些场景下,组件的部分内容可能不会频繁变化,但每次组件更新时都会重新渲染,这就会造成性能浪费。Vue3 的 v-memo 指令就能帮我们缓存这些内容,避免不必要的重新渲染。

export default {  
  setup() {    
    // 定义一个数组    
    const list = [   
      { id: 1, name: '项目一' },   
      { id: 2, name: '项目二' },  
      { id: 3, name: '项目三' }   
    ];    
    return {      
      list    
    };  
  },  
  template: `    
    <ul>      
      <!-- 使用 v-memo 缓存列表项,只有当 item.id 变化时才会重新渲染 -->      
      <li v-for="item in list" :key="item.id" v-memo="[item.id]">        
        {{ item.name }}      
      </li>    
    </ul>  
  `
};

在这个例子中,只有当列表项的 id 发生变化时,对应的列表项才会重新渲染,当然缓存项可以是多个;如 item.iditem.name

5. 自定义渲染函数打造独特组件

虽然 Vue 的模板语法已经很强大了,但在某些特殊场景下,我们可能需要更灵活的渲染方式。这时候,自定义渲染函数就派上用场了。

import { h } from 'vue';
export default {  
  setup() {    
    return () => {      
      // 使用 h 函数创建虚拟节点      
      return h('div', { class: 'custom-component' }, [        
        h('h2', '这是一个自定义渲染的组件'),        
        h('p', '通过自定义渲染函数,我们可以实现更灵活的渲染逻辑')      
      ]);    
    };  
  }
};


6. 用 VueUse 库提升开发效率

VueUse 是一个非常强大的 Vue 组合式函数库,它提供了很多实用的组合式函数,可以帮助我们快速实现各种功能,大大提升开发效率。

// 引入 VueUse 中的 useIntersectionObserver 函数
import { useIntersectionObserver } from '@vueuse/core';
import { ref } from 'vue';
export default {  
  setup() {    
    // 定义一个 ref 来引用 DOM 元素    
    const target = ref(null);    
    // 定义一个 ref 来保存元素是否可见的状态    
    const isVisible = ref(false);    
    // 使用 useIntersectionObserver 函数监听元素的可见性    
    const { stop } = useIntersectionObserver(      
        target,      
        ([{ isIntersecting }]) => {
          // 当元素可见时,更新 isVisible 的值        
          isVisible.value = isIntersecting;        
          if (isIntersecting) {          
            // 当元素可见时,可以执行一些操作,比如加载数据          
            console.log('元素可见了');          
            // 停止监听          
            stop();        
          }      
        },      
        {        
          // 配置项,threshold 表示元素可见的比例        
          threshold: 0.5      
        }    
    );    
    return {      
      target,      
      isVisible    
    };  
  },  
  template: `    
    <div ref="target">      
      <!-- 根据元素的可见状态显示不同的内容 -->      
      <p v-if="isVisible">元素现在可见啦</p>      
      <p v-else>元素还没进入可视区域哦</p>    
    </div>  
  `
};

在这个例子中,我们使用了 useIntersectionObserver 函数来监听元素的可见性,当元素进入可视区域时,就可以执行一些操作,比如加载数据。这对于实现懒加载、无限滚动等功能非常有用。

7. 利用 Vue3 的响应式原理优化数据处理

Vue3 的响应式原理是其核心优势之一,我们可以充分利用这个原理来优化数据处理。

import { reactive, watchEffect } from 'vue';
export default {  
  setup() {    
    // 使用 reactive 创建一个响应式对象    
    const state = reactive({      
      num1: 10,     
      num2: 20,  
      sum: 0 
    });  
    // 使用 watchEffect 监听数据变化并自动更新 sum 的值    
    watchEffect(() => {    
      // 当 num1 或 num2 变化时,自动更新 sum 的值      
      state.sum = state.num1 + state.num2;    
    });   
    return {    
      state  
    }; 
  },  
  template: `    
    <div>      
      <p>num1: {{ state.num1 }}</p>      
      <p>num2: {{ state.num2 }}</p>      
      <p>sum: {{ state.sum }}</p>      
      <button @click="state.num1++">增加 num1</button>      
      <button @click="state.num2++">增加 num2</button>    
    </div>  
  `
};

Vue3 的响应式原理就像是一个智能的观察者,当数据发生变化时,它会自动更新相关的内容。其实也类似vue2的watch

8. 使用 Vue Router 的路由元信息进行权限控制

在项目中,权限控制是一个很重要的功能。可使用前置守卫beforeEach轻松实现这个功能。

import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import Admin from './views/Admin.vue';
const routes = [ 
  {   
    path: '/',   
    name: 'Home', 
    component: Home
  },  
  {    
    path: '/admin',  
    name: 'Admin',  
    component: Admin,  
    meta: {      
      // 设置路由元信息,标记该路由需要管理员权限      
      requiresAdmin: true    
    }  
  }
];
const router = createRouter({  
  history: createWebHistory(),  
  routes
});
// 全局前置守卫,在路由跳转前进行权限验证
router.beforeEach((to, from, next) => {  
  if (to.meta.requiresAdmin) {    
    // 这里可以根据实际情况判断用户是否具有管理员权限    
    const isAdmin = false;    
    if (isAdmin) {      
      next(); 
      // 如果具有管理员权限,允许跳转    
    } else {      
      next('/');// 如果没有管理员权限,重定向到首页
    }  
  } else { 
    next(); // 如果不需要管理员权限,直接跳转  
  }
});
export default router;

9. 用 CSS Modules 解决样式冲突问题

在多人协作的项目中,样式冲突是一个很常见的问题。Vue的 CSS Modules,它可以帮助我们解决这个问题。

<template>  
  <div :class="$style.container">  
    <h2 :class="$style.title">这是一个使用 CSS Modules 的组件</h2>
    <p :class="$style.content">通过 CSS Modules,我们可以避免样式冲突问题</p>
  </div>
</template>
<script>
export default {  
  setup() {    
    return {};  
  }
};
</script>
<style module>
.container { 
  padding: 20px;  
  border: 1px solid #ccc;
}
.title { 
  color: blue;
  font-size: 24px;
}
.content { 
  color: gray; 
  font-size: 16px;
}
</style>

CSS Modules 就像是一个样式隔离器,它会给每个类名生成一个唯一的哈希值,这样就可以避免不同组件之间的类名冲突

10. Vue3 与 TypeScript 结合,让代码更健壮

TypeScript 可以为 JavaScript 代码添加静态类型检查,让我们的代码更加健壮和易于维护。在 Vue3 中,我们可以很好地结合 TypeScript 来开发项目。

// 引入 Vue 和相关类型
import { defineComponent, ref } from 'vue';
// 定义一个接口来描述数据的类型
interface User {  
  name: string;  
  age: number;
}
// 使用 defineComponent 定义组件,并使用 TypeScript 进行类型标注
const MyComponent = defineComponent({  
  setup() {    
    // 使用 ref 创建一个响应式数据,并指定其类型
    const user = ref<User>({      
      name: '前端小将',    
      age: 22   
    }); 
    return {    
      user  
    };  
  }, 
  template: `    
    <div>      
      <p>姓名: {{ user.name }}</p>      
      <p>年龄: {{ user.age }}</p>    
    </div>  
  `
});
export default MyComponent;

在这个例子中,我们使用接口来定义数据的类型,然后在 ref 中指定数据的类型,这样在使用数据时,TypeScript 会自动进行类型检查。

技术分享

苏南名片

  • 联系人:吴经理
  • 电话:152-1887-1916
  • 邮箱:message@jswusn.com
  • 地址:江苏省苏州市相城区

热门文章

Copyright © 2018-2025 jswusn.com 版权所有

技术支持:苏州网站建设  苏ICP备18036849号