价格计划
用法
PricingPlan组件提供了一种灵活的方式来显示定价计划,其中包含可自定义的内容,包括标题、描述、价格、功能等。
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
标题
使用title属性设置PricingPlan的标题。
<template>
<UPricingPlan title="Solo" class="w-96" />
</template>说明
使用description属性设置PricingPlan的描述。
<template>
<UPricingPlan title="Solo" description="For bootstrappers and indie hackers." />
</template>Badge
使用badge道具在PricingPlan标题旁边显示Badge。
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
badge="Most popular"
/>
</template>您可以从Badge组件传递任何属性来对其进行自定义。
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
:badge="{
label: 'Most popular',
color: 'neutral',
variant: 'solid'
}"
/>
</template>价格
使用price属性设置PricingPlan的价格。
<template>
<UPricingPlan title="Solo" description="For bootstrappers and indie hackers." price="$249" />
</template>折扣
使用discount道具设置折扣价格,该价格将与原始价格一起显示(原始价格将以删除线显示)。
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
discount="$199"
/>
</template>计费
使用billing-cycle和/或billing-period道具显示PricingPlan的计费信息。
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$9"
billing-cycle="/month"
billing-period="billed annually"
/>
</template>特点
使用features prop作为字符串数组来显示PricingPlan上的功能列表:
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Unlimited patch & minor updates',
'Lifetime access'
]"
/>
</template>您也可以传递具有下列属性的物件数组:
title: stringicon?: string
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
<script setup lang="ts">
import type { PricingPlanFeature } from '@nuxt/ui'
const features = ref<PricingPlanFeature[]>([
{
title: 'One developer',
icon: 'i-lucide-user'
},
{
title: 'Unlimited projects',
icon: 'i-lucide-infinity'
},
{
title: 'Access to GitHub repository',
icon: 'i-lucide-github'
},
{
title: 'Unlimited patch & minor updates',
icon: 'i-lucide-refresh-cw'
},
{
title: 'Lifetime access',
icon: 'i-lucide-clock'
}
])
</script>
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="features"
/>
</template><script setup lang="ts">
import { ref } from 'vue'
import type { PricingPlanFeature } from '@nuxt/ui'
const features = ref<PricingPlanFeature[]>([
{
title: 'One developer',
icon: 'i-lucide-user'
},
{
title: 'Unlimited projects',
icon: 'i-lucide-infinity'
},
{
title: 'Access to GitHub repository',
icon: 'i-lucide-github'
},
{
title: 'Unlimited patch & minor updates',
icon: 'i-lucide-refresh-cw'
},
{
title: 'Lifetime access',
icon: 'i-lucide-clock'
}
])
</script>
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="features"
/>
</template>Button
将button prop与Button组件中的任何属性一起使用,以在PricingPlan的底部显示一个按钮。
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Unlimited patch & minor updates',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
/>
</template>onClick字段添加点击处理程序以触发计划购买。Variant
使用variant prop更改PricingPlan的变体。
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Unlimited patch & minor updates',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
variant="subtle"
/>
</template>方向
使用orientation属性将PricingPlan.xml的方向更改为vertical。
- One developer
- Unlimited projects
- Access to GitHub repository
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
orientation="horizontal"
variant="outline"
/>
</template>标签
使用tagline prop在价格上方显示标语文本。
- One developer
- Unlimited projects
- Access to GitHub repository
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
orientation="horizontal"
tagline="Pay once, own it forever"
/>
</template>条款
使用terms prop显示价格下面的条款。
- One developer
- Unlimited projects
- Access to GitHub repository
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
orientation="horizontal"
tagline="Pay once, own it forever"
terms="Invoices and receipts available."
/>
</template>亮点
使用highlight道具在PricingPlan周围显示突出显示的边框。
- One developer
- Unlimited projects
- Access to GitHub repository
- Unlimited patch & minor updates
- Lifetime access
<template>
<UPricingPlan
title="Solo"
description="For bootstrappers and indie hackers."
price="$249"
:features="[
'One developer',
'Unlimited projects',
'Access to GitHub repository',
'Unlimited patch & minor updates',
'Lifetime access'
]"
:button="{
label: 'Buy now'
}"
highlight
/>
</template>Scale
使用scale道具使PricingPlan比其他计划更大。
API
Props
| Prop | Default | Type |
|---|---|---|
as | 'div' | anyThe element or component this component should render as. |
title | string | |
description | string | |
badge | string | BadgePropsDisplay a badge next to the title.
Can be a string or an object.
| |
billingCycle | stringThe unit price period that appears next to the price. Typically used to show the recurring interval. | |
billingPeriod | stringAdditional billing context that appears above the billing cycle. Typically used to show the actual billing frequency. | |
price | stringThe current price of the plan.
When used with | |
discount | stringThe discounted price of the plan.
When provided, the | |
features | string[] | PricingPlanFeature[]Display a list of features under the price. Can be an array of strings or an array of objects. | |
button | ButtonPropsDisplay a buy button at the bottom.
| |
tagline | stringDisplay a tagline highlighting the pricing value proposition. | |
terms | stringDisplay terms at the bottom. | |
orientation | 'vertical' | "vertical" | "horizontal"The orientation of the pricing plan. |
variant | 'outline' | "soft" | "solid" | "outline" | "subtle" |
highlight | boolean Display a ring around the pricing plan to highlight it. | |
scale | boolean Enlarge the plan to make it more prominent. | |
ui | { root?: SlotClass; header?: SlotClass; body?: SlotClass; footer?: SlotClass; titleWrapper?: SlotClass; title?: SlotClass; description?: SlotClass; priceWrapper?: SlotClass; price?: SlotClass; discount?: SlotClass; billing?: SlotClass; billingPeriod?: SlotClass; billingCycle?: SlotClass; features?: SlotClass; feature?: SlotClass; featureIcon?: SlotClass; featureTitle?: SlotClass; badge?: SlotClass; button?: SlotClass; tagline?: SlotClass; terms?: SlotClass; } |
Slots
| Slot | Type |
|---|---|
badge | { ui: object; } |
title | {} |
description | {} |
price | {} |
discount | {} |
billing | { ui: object; } |
features | {} |
button | { ui: object; } |
header | {} |
body | {} |
footer | {} |
tagline | {} |
terms | {} |
Theme
export default defineAppConfig({
ui: {
pricingPlan: {
slots: {
root: 'relative grid rounded-lg p-6 lg:p-8 xl:p-10 gap-6',
header: '',
body: 'flex flex-col min-w-0',
footer: 'flex flex-col gap-6 items-center',
titleWrapper: 'flex items-center gap-3',
title: 'text-highlighted truncate text-2xl sm:text-3xl text-pretty font-semibold',
description: 'text-muted text-base text-pretty mt-2',
priceWrapper: 'flex items-center gap-1',
price: 'text-highlighted text-3xl sm:text-4xl font-semibold',
discount: 'text-muted line-through text-xl sm:text-2xl',
billing: 'flex flex-col justify-between min-w-0',
billingPeriod: 'text-toned truncate text-xs font-medium',
billingCycle: 'text-muted truncate text-xs font-medium',
features: 'flex flex-col gap-3 flex-1 mt-6 grow-0',
feature: 'flex items-center gap-2 min-w-0',
featureIcon: 'size-5 shrink-0 text-primary',
featureTitle: 'text-muted text-sm truncate',
badge: '',
button: '',
tagline: 'text-base font-semibold text-default',
terms: 'text-xs/5 text-muted text-center text-balance'
},
variants: {
orientation: {
horizontal: {
root: 'grid-cols-1 lg:grid-cols-3 justify-between divide-y lg:divide-y-0 lg:divide-x divide-default',
body: 'lg:col-span-2 pb-6 lg:pb-0 lg:pe-6 justify-center',
footer: 'lg:justify-center lg:items-center lg:p-6 lg:max-w-xs lg:w-full lg:mx-auto',
features: 'lg:grid lg:grid-cols-2 lg:mt-12'
},
vertical: {
footer: 'justify-end',
priceWrapper: 'mt-6'
}
},
variant: {
solid: {
root: 'bg-inverted',
title: 'text-inverted',
description: 'text-dimmed',
price: 'text-inverted',
discount: 'text-dimmed',
billingCycle: 'text-dimmed',
billingPeriod: 'text-dimmed',
featureTitle: 'text-dimmed'
},
outline: {
root: 'bg-default ring ring-default'
},
soft: {
root: 'bg-elevated/50'
},
subtle: {
root: 'bg-elevated/50 ring ring-default'
}
},
highlight: {
true: {
root: 'ring-2 ring-inset ring-primary'
}
},
scale: {
true: {
root: 'lg:scale-[1.1] lg:z-[1]'
}
}
},
compoundVariants: [
{
orientation: 'horizontal',
variant: 'soft',
class: {
root: 'divide-accented'
}
},
{
orientation: 'horizontal',
variant: 'subtle',
class: {
root: 'divide-accented'
}
}
],
defaultVariants: {
variant: 'outline'
}
}
}
})import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
pricingPlan: {
slots: {
root: 'relative grid rounded-lg p-6 lg:p-8 xl:p-10 gap-6',
header: '',
body: 'flex flex-col min-w-0',
footer: 'flex flex-col gap-6 items-center',
titleWrapper: 'flex items-center gap-3',
title: 'text-highlighted truncate text-2xl sm:text-3xl text-pretty font-semibold',
description: 'text-muted text-base text-pretty mt-2',
priceWrapper: 'flex items-center gap-1',
price: 'text-highlighted text-3xl sm:text-4xl font-semibold',
discount: 'text-muted line-through text-xl sm:text-2xl',
billing: 'flex flex-col justify-between min-w-0',
billingPeriod: 'text-toned truncate text-xs font-medium',
billingCycle: 'text-muted truncate text-xs font-medium',
features: 'flex flex-col gap-3 flex-1 mt-6 grow-0',
feature: 'flex items-center gap-2 min-w-0',
featureIcon: 'size-5 shrink-0 text-primary',
featureTitle: 'text-muted text-sm truncate',
badge: '',
button: '',
tagline: 'text-base font-semibold text-default',
terms: 'text-xs/5 text-muted text-center text-balance'
},
variants: {
orientation: {
horizontal: {
root: 'grid-cols-1 lg:grid-cols-3 justify-between divide-y lg:divide-y-0 lg:divide-x divide-default',
body: 'lg:col-span-2 pb-6 lg:pb-0 lg:pe-6 justify-center',
footer: 'lg:justify-center lg:items-center lg:p-6 lg:max-w-xs lg:w-full lg:mx-auto',
features: 'lg:grid lg:grid-cols-2 lg:mt-12'
},
vertical: {
footer: 'justify-end',
priceWrapper: 'mt-6'
}
},
variant: {
solid: {
root: 'bg-inverted',
title: 'text-inverted',
description: 'text-dimmed',
price: 'text-inverted',
discount: 'text-dimmed',
billingCycle: 'text-dimmed',
billingPeriod: 'text-dimmed',
featureTitle: 'text-dimmed'
},
outline: {
root: 'bg-default ring ring-default'
},
soft: {
root: 'bg-elevated/50'
},
subtle: {
root: 'bg-elevated/50 ring ring-default'
}
},
highlight: {
true: {
root: 'ring-2 ring-inset ring-primary'
}
},
scale: {
true: {
root: 'lg:scale-[1.1] lg:z-[1]'
}
}
},
compoundVariants: [
{
orientation: 'horizontal',
variant: 'soft',
class: {
root: 'divide-accented'
}
},
{
orientation: 'horizontal',
variant: 'subtle',
class: {
root: 'divide-accented'
}
}
],
defaultVariants: {
variant: 'outline'
}
}
}
})
]
})