Вопрос или проблема
Я хочу использовать Shadcn/vue для своего веб-сайта и я следовал (надеюсь, правильно) инструкциям здесь, чтобы настроить проект.
Теперь я установил компонент Button и Select с помощью команд npx shadcn-vue@latest add button
и npx shadcn-vue@latest add select
соответственно.
Я создал небольшой тестовый компонент UseSelectTest.vue, код которого выглядит так:
//UseSelectTest.vue
<script setup lang="ts">
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { Button } from '@/components/ui/button';
</script>
<template>
<Select>
<SelectTrigger>
<SelectValue placeholder="Выберите фрукт" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Фрукты</SelectLabel>
<SelectItem value="apple">
Яблоко
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
<Button>Эта кнопка красивая</Button>
</template>
Если я включу этот компонент где-то на веб-странице, кнопка выглядит очень красиво и так, как и ожидалось, но компонент Select просто пустой!
Сообщение об ошибке, которое я получаю:
vue-mc-gaps.vue:1 [Vue warn]: Не удалось разрешить компонент: SelectValue
Если это родной пользовательский элемент, убедитесь, что он исключен из разрешения компонентов через compilerOptions.isCustomElement.
Если я включу
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag : string) => ['Select', 'FormControl', 'SelectTrigger', 'SelectContent', 'SelectGroup', 'SelectItem','SelectLabel','SelectTrigger','SelectValue'].includes(tag), //
}
}
})
]
в vite.config.ts
,
это сообщение об ошибке исчезает, но компонент Select по-прежнему отображается неверно.
Мои конфигурационные файлы выглядят следующим образом:
//vite.config.ts
import path from 'node:path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import tailwind from 'tailwindcss'
import autoprefixer from 'autoprefixer'
export default defineConfig({
css: {
postcss: {
plugins: [tailwind(), autoprefixer()],
},
},
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag : string) => ['Select', 'FormControl', 'SelectTrigger', 'SelectContent', 'SelectGroup', 'SelectItem','SelectLabel','SelectTrigger','SelectValue'].includes(tag), //
}
}
})
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
});
и другой конфигурационный файл
//tsconfig.app.json
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"allowImportingTsExtensions": true,
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}
Когда я запускаю npm run build
или npm run dev
, ошибок не возникает.
Что я делаю не так?
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что компонент Select и его дочерние элементы, такие как SelectValue, не могут быть корректно отрисованы. Есть несколько причин, по которым это может происходить. Давайте рассмотрим наиболее вероятные причины и пути их решения.
1. Проверка импорта
Убедитесь, что все компоненты Select, включая SelectValue и другие, импортируются правильно. В вашем коде вы импортируете следующие компоненты:
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
Проверьте, что путь @/components/ui/select
действительно указывает на файл, где определены эти компоненты. Возможно, у вас есть опечатка или файл не существует.
2. Проверка установки зависимостей
Убедитесь, что все необходимые зависимости установлены. Если вы используете Vite, выполните следующую команду для установки всех зависимостей:
npm install
Также можно проверить, есть ли дополнительные зависимости, которые могут быть необходимы для Shadcn/vue.
3. Настройка Vite
Ваши настройки Vite выглядят в целом правильно, однако убедитесь, что все элементы, входящие в список isCustomElement
, корректны и соответствуют тому, что ожидается от библиотеки.
Ваш код выглядит следующим образом:
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag: string) => ['Select', 'FormControl', 'SelectTrigger', 'SelectContent', 'SelectGroup', 'SelectItem', 'SelectLabel', 'SelectValue'].includes(tag),
}
}
})
]
Убедитесь, что все названия компонентов совпадают с теми, что у вас в библиотеке (например, FormControl
), и что они действительно нужны.
4. Стиль и отображение
Если у вас не возникает никаких ошибок, но компонент по-прежнему не отображается, возможно, проблема связана со стилями. Проверьте, применяются ли стили к вашему компоненту Select. Если вы используете Tailwind CSS, убедитесь, что классы, необходимые для функциональности вашего Select-компонента, правильно применяются.
Если компонент не отображается должным образом без ошибок в консоли, попробуйте добавить временные стили (например, border
или bg-gray
), чтобы проверить, отрисовывается ли он вообще.
5. Использование компонентов
Попробуйте упростить ваш компонент UseSelectTest.vue. Например, уберите дополнительные элементы и оставьте только Select, чтобы изолировать проблему:
<template>
<Select>
<SelectTrigger>
<SelectValue placeholder="Select a fruit" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Fruits</SelectLabel>
<SelectItem value="apple">Apple</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</template>
Запустите проект, чтобы увидеть, работает ли Select в упрощенном виде.
6. Проверка документации
Поскольку вы используете Shadcn/vue, рекомендую ещё раз тщательно просмотреть документацию к библиотеке. Возможно, есть дополнительные шаги, которые вы пропустили при установке или настройке компонентов.
Заключение
Если, после выполнения всех вышеуказанных шагов, проблема не решается, вам может понадобиться создать минимальный пример кода и поделиться им на ресурсах (например, GitHub), где другие разработчики смогут посмотреть и помочь вам с проблемой.
Надеюсь, это поможет вам решить вашу проблему. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!