这里有一些实用的 Vue.js 高级示例,涵盖了前面提到的高级知识点,适合在实际项目中应用:
1. 自定义响应式数据
使用 Vue 3 的 customRef
API 创建一个自定义的响应式输入框,带有防抖功能。
import { customRef } from 'vue';
function useDebouncedRef(value, delay = 300) {
let timeout;
return customRef((track, trigger) => {
return {
get() {
track(); // 追踪依赖
return value;
},
set(newValue) {
clearTimeout(timeout);
timeout = setTimeout(() => {
value = newValue;
trigger(); // 触发更新
}, delay);
}
};
});
}
export default {
setup() {
const debouncedInput = useDebouncedRef('', 500);
return { debouncedInput };
}
};
2. Renderless Component(无渲染组件)
创建一个 Renderless 组件,用于管理表单验证逻辑,而无需关注具体的表单 UI。
// FormValidator.vue
<template>
<slot :validate="validate" :errors="errors"></slot>
</template>
<script>
import { reactive } from 'vue';
export default {
setup(_, { slots }) {
const errors = reactive({});
function validate(rules) {
Object.keys(rules).forEach(field => {
const rule = rules[field];
if (!rule.validator(rule.value)) {
errors[field] = rule.message;
} else {
delete errors[field];
}
});
}
return { validate, errors };
}
};
</script>
<!-- 使用示例 -->
<FormValidator v-slot="{ validate, errors }">
<input v-model="form.username" @blur="validate({ username: { value: form.username, validator: v => !!v, message: '用户名不能为空' }})" />
<p v-if="errors.username">{{ errors.username }}</p>
</FormValidator>
3. 动态导入与懒加载
结合 Vue Router 和 Webpack 的动态导入功能,实现组件的懒加载。
import { createRouter, createWebHistory } from 'vue-router';
const routes = [
{
path: '/dashboard',
component: () => import(/* webpackChunkName: "dashboard" */ './components/Dashboard.vue'),
},
{
path: '/profile',
component: () => import(/* webpackChunkName: "profile" */ './components/Profile.vue'),
}
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
4. 权限控制与路由守卫
在 Vue Router 中使用全局守卫来实现用户权限控制。
import { createRouter, createWebHistory } from 'vue-router';
import store from './store'; // 假设 Vuex 或 Pinia 管理用户状态
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', component: Home },
{ path: '/admin', component: Admin, meta: { requiresAuth: true } },
],
});
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !store.state.isAuthenticated) {
next('/login');
} else {
next();
}
});
export default router;
5. Apollo Client 与 GraphQL 集成
使用 Vue 结合 Apollo Client 查询 GraphQL 数据,并管理全局状态。
import { ref } from 'vue';
import { useQuery, gql } from '@apollo/client';
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
export default {
setup() {
const userId = ref(1);
const { loading, error, data } = useQuery(GET_USER, {
variables: { id: userId.value },
});
return { loading, error, data };
}
};
6. 自定义 Vue CLI 插件
创建一个简单的 Vue CLI 插件,用于为新项目生成标准化的目录结构和配置。
module.exports = (api, options) => {
api.render('./template');
api.extendPackage({
scripts: {
lint: 'eslint --ext .js,.vue src/',
},
dependencies: {
axios: '^0.21.1',
},
devDependencies: {
'eslint-plugin-vue': '^7.0.0',
}
});
api.onCreateComplete(() => {
console.log('Custom Vue CLI plugin installed!');
});
};
这些示例展示了 Vue.js 在不同领域的高级用法,可以直接应用于实际项目中,并根据需求进行定制和扩展。
标签:vue,const,js,return,Vue,router,组件,import From: https://blog.csdn.net/Hellc007/article/details/140847606