8个你必须掌握的「Vue」实用技巧

1. 利用 v-bind="attrs"和 v−on="listeners" 简化组件通信

在开发复杂组件时,我们经常需要传递大量属性和事件。使用 v-bind=" a t t r s " 和 v − o n = " attrs" 和 v-on=" attrs"和v−on="listeners" 可以避免繁琐的逐个声明:

html 复制代码
<!-- 父组件 -->
<template>
  <child-component :name="name" :age="age" @update="handleUpdate" @delete="handleDelete" />
</template>

<!-- 子组件 -->
<template>
  <grandchild-component v-bind="$attrs" v-on="$listeners" />
</template>

这样,所有属性和事件都会自动传递给孙组件,无需在中间组件中重复声明。

2. 使用 computed 的 setter 实现双向绑定

computed 不仅可以用于计算属性,还可以通过 setter 实现双向绑定:

JavaScript 复制代码
export default {
  data() {
    return {
      firstName: '张',
      lastName: '三'
    }
  },
  computed: {
    fullName: {
      get() {
        return this.firstName + ' ' + this.lastName
      },
      set(value) {
        const [first, last] = value.split(' ')
        this.firstName = first
        this.lastName = last
      }
    }
  }
}

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

对于深层嵌套的组件通信,provide/inject 比 props 和事件更优雅:

JavaScript 复制代码
// 祖先组件
export default {
  provide() {
    return {
      theme: this.theme,
      user: this.user
    }
  }
}

// 深层子组件
export default {
  inject: ['theme', 'user'],
  mounted() {
    console.log(this.theme, this.user)
  }
}

4. 使用 v-once 和 v-memo 优化性能

对于静态内容或不需要频繁更新的内容,使用 v-once 可以避免不必要的重新渲染:

xml 复制代码
<!-- 只渲染一次 -->
<div v-once>{{ staticContent }}</div>

<!-- Vue 3 中的 v-memo -->
<div v-memo="[value]">{{ expensiveOperation(value) }}</div>

5. 使用自定义指令封装 DOM 操作

将常用的 DOM 操作封装成自定义指令,提高代码复用性:

JavaScript 复制代码
// 注册全局指令
Vue.directive('focus', {
  inserted(el) {
    el.focus()
  }
})

// 注册局部指令
export default {
  directives: {
    color: {
      bind(el, binding) {
        el.style.color = binding.value
      },
      update(el, binding) {
        el.style.color = binding.value
      }
    }
  }
}

6. 使用函数式组件优化无状态组件

对于没有状态、没有实例的组件,使用函数式组件可以减少性能开销:

html 复制代码
<template functional>
  <div class="list-item">
    <span>{{ props.item.name }}</span>
    <span>{{ props.item.value }}</span>
  </div>
</template>

7. 使用 watch 的 deep 和 immediate 选项

watch 不仅可以监听数据变化,还可以通过选项实现更复杂的监听:

JavaScript 复制代码
export default {
  watch: {
    // 深度监听对象变化
    user: {
      handler(newVal, oldVal) {
        console.log('用户数据发生变化')
      },
      deep: true,
      immediate: true // 立即执行一次
    }
  }
}

8. 使用 mixin 提取公共逻辑

将多个组件共用的逻辑提取到 mixin 中,避免代码重复:

JavaScript 复制代码
// commonMixin.js
export default {
  data() {
    return {
      loading: false
    }
  },
  methods: {
    async fetchData(api) {
      this.loading = true
      try {
        const res = await this.$http.get(api)
        return res.data
      } finally {
        this.loading = false
      }
    }
  }
}

// 组件中使用
export default {
  mixins: [commonMixin],
  mounted() {
    this.fetchData('/api/users')
  }
}
相关推荐
_阿南_7 小时前
项目中新增给AI制定的代码规范
前端·程序员
名字还没想好☜8 小时前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
自动化监测Learner9 小时前
主流 Web 端地图引擎对比:选型指南与优劣分析
javascript
console.log('npc')9 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
爱学堂IT分享10 小时前
Cesium可视化系统实战课程-Cesium教程学习
前端
糖墨夕11 小时前
理解大语言模型:Agent 的“大脑”
前端·agent
Rain的Java大神之路11 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
cpolar技术支持11 小时前
浏览器也能跑本地 AI:用 Transformers.js + WebGPU 做一个最小推理 Demo,cpolar 给同事远程体验
前端·ai·cpolar·webgpu·transformers.js
计算机毕设定制辅导-无忧学长11 小时前
《基于SpringBoot青年公寓出租管理系统的设计与实现》
java·vue.js·spring boot·青年公寓出租管理系统
计算机魔术师13 小时前
OpenAI 发布 GPT-6 Astra:多项基准刷新纪录, cybersecurity 能力达 Critical 阈值
前端