Skip to content

文本输入 Input

输入文本。

基础使用

你可以在这里输入文本。传入 modelValue 进入受控模式。不传或者为 undefined 则为非受控模式,此时可以传入 defaultValue 属性作为默认值。 x> 建议使用 null 或者数据类型的空值作为空值。

<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input" v-model="input"></px-input>
		<px-input placeholder="Please input D-mail"></px-input>
		<px-input placeholder="Please input" default-value="El Psy Kongroo"></px-input>
	</px-space>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const input = ref('Steins; Gate')
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

密码输入

这个组件也可以是密码输入框,只需要把 password 属性设置为 true

<template>
	<px-input v-model="input" placeholder="Please input password" password></px-input>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const input = ref('')
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

只读 & 禁用

readonly 设置只读,disabled 设置禁用,此时内部 <input> 都会被设置 disabled。它们之间几乎只有样式不一样。

<template>
	<px-space direction="vertical">
		<px-input readonly placeholder="Please input content"></px-input>
		<px-input disabled default-value="Some text..."></px-input>
	</px-space>
</template>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

清除文本

clearabletrue 时,聚焦后展示清除文本的按钮。

<template>
	<px-input placeholder="Please input" v-model="input" clearable></px-input>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const input = ref('Test')
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

加载状态

loading 设置加载状态,和平常没什么不一样,只是多了一个加载图标。

<template>
	<px-input placeholder="Please input" v-model="input" loading></px-input>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const input = ref('You can enter text as usual')
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

输入框尺寸

输入框可以有不同的大小。

<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input" size="small"></px-input>
		<px-input placeholder="Please input"></px-input>
		<px-input placeholder="Please input" size="large"></px-input>
	</px-space>
</template>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

圆角边框

输入框也可以有圆角。

精力和技术力不太充足,自定义圆角还有需要优化的地方,但整体不影响使用。

<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input"></px-input>
		<px-input placeholder="Please input" shape="round"></px-input>
		<px-input placeholder="Please input" :border-radius="[20, 0]"></px-input>
	</px-space>
</template>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

前缀 & 后缀

在前缀后缀添加附加内容。

$
km
<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input">
			<template #prefix>$</template>
		</px-input>
		<px-input placeholder="Please input">
			<template #suffix>km</template>
		</px-input>
	</px-space>
</template>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

复合输入框

借助 InputGroup 组件,我们可以把各种输入控件和按钮组合起来。

.ini
<template>
	<px-space direction="vertical">
		<px-input-group>
			<px-input-group-label>
				<IconSearch></IconSearch>
			</px-input-group-label>
			<px-input placeholder="Please input"> </px-input>
			<px-button>Search</px-button>
		</px-input-group>
		<px-input-group>
			<px-input placeholder="Please input file name"> </px-input>
			<px-input-group-label> .ini </px-input-group-label>
		</px-input-group>
		<px-input-group>
			<px-input placeholder="Please input"> </px-input>
			<px-input-number placeholder="Please input" :default-value="0"> </px-input-number>
		</px-input-group>
	</px-space>
</template>
<script setup lang="ts">
import { IconSearch } from '@pixelium/web-vue/icon-hn/es'
</script>
<style lang="css" scoped>
.px-input,
.px-input-number {
	width: 320px;
}
</style>

字数统计 & 长度限制

showCount 属性设置展示字数统计,maxLength 设置最大长度。

Input 组件默认使用 str.length 计算长度,对于复合字符会存在计数错误的情况。我们推荐使用 grapheme-splitter 来解决这个问题。countGraphemes 属性用于设置统计长度的函数,sliceGraphemes 用于截取限制长度以内的字串,如果只传入 countGraphemes 而没有 sliceGraphemesmaxLength 的长度限制不会生效。

8
8 / 20
4 / 20
<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input" default-value="🎺🎸🎹🥁" show-count></px-input>
		<px-input
			placeholder="Please input"
			default-value="🎺🎸🎹🥁"
			show-count
			:max-length="20"
		></px-input>
		<px-input
			placeholder="Please input"
			default-value="🎺🎸🎹🥁"
			show-count
			:max-length="20"
			:countGraphemes="countGraphemes"
			:sliceGraphemes="sliceGraphemes"
		></px-input>
	</px-space>
</template>

<script setup lang="ts">
import GraphemeSplitter from 'grapheme-splitter'

const splitter = new GraphemeSplitter()
const countGraphemes = (val: string) => {
	return splitter.countGraphemes(val)
}
const sliceGraphemes = (val: string, limit: number) => {
	const arr = splitter.splitGraphemes(val)
	return arr.slice(0, limit).join('')
}
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

手动操作

Input 组件导出了一些操作它本身的函数。

<template>
	<px-space direction="vertical">
		<px-space>
			<px-button theme="info" @click="focusHandler">Focus</px-button>
			<px-button theme="info" @click="blurHandler">Blur</px-button>
			<px-button theme="info" @click="selectHandler">Select</px-button>
			<px-button theme="warning" @click="clearHandler">Clear</px-button>
		</px-space>
		<px-input placeholder="Please input" ref="inputRef"></px-input>
	</px-space>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { Input } from '@pixelium/web-vue'

// If on-demand import
// import { Input } from '@pixelium/web-vue/es'

const inputRef = ref<InstanceType<typeof Input>>(null)

const focusHandler = () => {
	inputRef.value?.focus()
}
const blurHandler = () => {
	inputRef.value?.blur()
}
const clearHandler = () => {
	inputRef.value?.clear()
}
const selectHandler = () => {
	inputRef.value?.select()
}
</script>

<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

表单验证状态

输入框支持四种表单验证状态:'normal'(默认)、'success''warning''error'

<template>
	<px-space direction="vertical">
		<px-input placeholder="Please input"> </px-input>
		<px-input placeholder="Please input" status="success"> </px-input>
		<px-input placeholder="Please input" status="warning"> </px-input>
		<px-input placeholder="Please input" status="error"> </px-input>
	</px-space>
</template>
<style lang="css" scoped>
.px-input {
	width: 320px;
}
</style>

API

InputProps

属性类型可选默认值描述版本
modelValuestring | null文本输入框的值(受控模式),支持 v-model0.0.2
defaultValuestring | null文本输入框的默认值(非受控模式)。0.0.2
placeholderstring占位符文本。0.0.2
passwordbooleanfalse是否为密码输入框。0.0.2
disabledbooleanfalse是否禁用。0.0.2
readonlybooleanfalse是否只读。0.0.2
clearablebooleanfalse是否显示清除按钮。0.0.2
loadingbooleanfalse是否显示加载状态。0.0.2
size'medium' | 'large' | 'small''medium'输入框尺寸。0.0.2
shape'default' | 'round''default'输入框形状。0.0.2
borderRadiusNumberOrPercentage | NumberOrPercentage[]圆角半径,优先级高于 shape,与 CSS border-radius 行为一致;单值或长度为 1 的数组 → 四角同时生效;长度为 2 的数组 → [左上 & 右下, 右上 & 左下];长度为 3 的数组 → [左上, 右上 & 左下, 右下];长度为 4 的数组 → 按顺时针顺序依次作用于四角。0.0.2
maxLengthnumber最大输入长度。0.0.2
showCountbooleanfalse是否展示字数统计。0.0.2
countGraphemes(value: string) => number自定义字数统计函数,如果只传入 countGraphemes 而没有 sliceGraphemesmaxLength 的长度限制不会生效。0.0.2
sliceGraphemes(value: string, limit: number) => string自定义截取长度函数。0.0.2
status'success' | 'warning' | 'error' | 'normal''normal'表单验证状态。0.0.2
autofocusbooleanfalse原生 <input>autofocus 属性。0.0.2
nativeType'text' | 'password' | 'email' | 'tel' | 'url' | 'search''text'原生 <input>type 属性。0.0.2

InputEvents

事件参数描述版本
inputvalue: string, e: Event输入框输入时的回调。0.0.2
update:modelValuevalue: string更新 modelValue 的回调。0.0.2
changevalue: string, e: Event | undefined输入内容变化时的回调。0.0.2
clearvalue: string点击清除文本按钮,清除内容时的回调。0.0.2
blure: FocusEvent输入框失焦时的回调。0.0.2
focuse: FocusEvent输入框聚焦时的回调。0.0.2

InputSlots

插槽参数描述版本
prefix前缀内容。0.0.2
suffix后缀内容。0.0.2
countinputValue: number, currentLength: number, maxLength: number展示字数统计的插槽。0.0.2

InputExpose

属性类型可选默认值描述版本
focus() => void聚焦到当前输入框。0.0.2
blur() => void取消聚焦当前输入框。0.0.2
clear() => void清空当前输入框。0.0.2
select() => void选中当前输入框内容。0.0.2

NumberOrPercentage

ts
export type NumberOrPercentage = number | `${number}%`