Vue2混入(Mixins)高阶应用:构建可复用业务逻辑库
一、技术优势
混入使业务逻辑复用率提升300%,重复代码减少80%
{{ permissionMessage }}
二、核心实现
1. 基础混入定义
// permissionMixin.js
export default {
data() {
return {
userRoles: ['editor']
}
},
methods: {
hasPermission(requiredRole) {
return this.userRoles.includes(requiredRole);
}
}
}
// 组件中使用
import permissionMixin from './permissionMixin';
export default {
mixins: [permissionMixin],
methods: {
checkPermission() {
if(this.hasPermission('admin')) {
alert('有权限访问');
}
}
}
}
2. 全局混入注册
// main.js
import Vue from 'vue';
import loggingMixin from './mixins/loggingMixin';
Vue.mixin(loggingMixin);
// loggingMixin.js
export default {
created() {
console.log(`组件 ${this.$options.name} 已创建`);
},
destroyed() {
console.log(`组件 ${this.$options.name} 已销毁`);
}
}
三、高级模式
1. 表单验证混入
// validationMixin.js
export default {
data() {
return {
errors: {}
}
},
methods: {
validateField(field, rules) {
// 验证逻辑
if(!rules.required && !this[field]) {
this.errors[field] = '必填字段';
return false;
}
return true;
},
resetValidation() {
this.errors = {};
}
}
}
2. 数据获取混入
// fetchDataMixin.js
export default {
data() {
return {
isLoading: false,
fetchError: null
}
},
methods: {
async fetchData(url) {
this.isLoading = true;
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
this.fetchError = error;
} finally {
this.isLoading = false;
}
}
}
}
四、完整案例
用户表单系统
{{ errors.name }}
{{ errors.email }}
// userForm.vue
import validationMixin from '@/mixins/validationMixin';
import apiMixin from '@/mixins/apiMixin';
export default {
mixins: [validationMixin, apiMixin],
data() {
return {
user: {
name: '',
email: ''
},
isSubmitting: false
}
},
methods: {
async submitForm() {
if(this.validateForm()) {
this.isSubmitting = true;
await this.postData('/api/users', this.user);
this.isSubmitting = false;
}
},
validateForm() {
let isValid = true;
isValid &= this.validateField('name', {required: true});
isValid &= this.validateField('email', {required: true, email: true});
return isValid;
}
}
}
// 定义权限混入
const permissionMixin = {
data() {
return {
userRoles: [‘editor’],
permissionMessage: ”
}
},
methods: {
hasPermission(requiredRole) {
return this.userRoles.includes(requiredRole);
},
checkPermission() {
this.permissionMessage = this.hasPermission(‘admin’)
? ‘当前用户有管理员权限’
: ‘权限不足’;
}
}
};
// 主Vue实例
new Vue({
el: ‘#app’,
mixins: [permissionMixin],
methods: {
demoValidation() {
alert(‘表单验证混入演示’);
}
}
});