共计 1311 个字符,预计需要花费 4 分钟才能阅读完成。
组件通信方案选择
在 Vue2 开发中,组件通信是新手最容易混淆的部分。根据不同的场景,我们需要选择合适的通信方式:

- 父子组件通信 :使用 props 和 $emit 是最直接的方式
- 跨层级组件 :Vuex 适合全局状态管理,provide/inject 适合深层嵌套组件
- 非父子关系组件 :Event Bus 适合简单场景,复杂场景建议使用 Vuex
电商购物车案例实战
下面通过一个电商购物车案例,演示如何合理组织代码结构:
// Cart.vue
<template>
<div>
<CartList :items="cartItems" @remove="handleRemove" />
<CartTotal :total="total" />
</div>
</template>
<script>
export default {data() {
return {cartItems: []
}
},
computed: {total() {return this.cartItems.reduce((sum, item) => sum + item.price, 0)
}
},
methods: {handleRemove(id) {this.cartItems = this.cartItems.filter(item => item.id !== id)
}
}
}
</script>
Vuex 模块化配置
对于大型应用,建议将 Vuex 拆分为模块:
// store/modules/cart.js
export default {
namespaced: true,
state: {items: []
},
mutations: {ADD_ITEM(state, item) {state.items.push(item)
},
REMOVE_ITEM(state, id) {state.items = state.items.filter(item => item.id !== id)
}
},
getters: {itemCount: state => state.items.length}
}
自定义指令实战
实现一个防抖指令,优化频繁触发的事件:
// directives/debounce.js
export default {inserted(el, binding) {
let timer = null
el.addEventListener('input', () => {if (timer) clearTimeout(timer)
timer = setTimeout(() => {binding.value()
}, 500)
})
}
}
常见问题与解决方案
- v-for 必须绑定 key:
- key 帮助 Vue 识别节点身份,提高渲染效率
-
避免使用索引作为 key,应该使用唯一标识
-
避免直接修改 props:
- 在子组件中使用 data 或 computed 属性接收 props
-
通过 $emit 通知父组件修改
-
组件销毁时的事件监听 :
- 在 beforeDestroy 钩子中移除事件监听
- 避免内存泄漏
性能优化思考
当商品列表超过 1000 条时,可以考虑以下优化方案:
- 使用虚拟滚动技术
- 实现分页加载
- 使用函数式组件减少开销
- 合理使用 v-show 和 v-if
总结
通过本次实战,我们系统梳理了 Vue2 的核心技能点。在实际开发中,要根据项目规模选择合适的架构方案,并注意性能优化和安全问题。
正文完
