| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { use } from '../utils';
- import { emit, inherit } from '../utils/functional';
- // Types
- import { CreateElement, RenderContext } from 'vue/types';
- import { DefaultSlots } from '../utils/use/sfc';
- export type PasswordInputProps = {
- mask: boolean;
- info?: string;
- value: string;
- length: number;
- errorInfo?: string;
- };
- const [sfc, bem] = use('password-input');
- function PasswordInput(
- h: CreateElement,
- props: PasswordInputProps,
- slots: DefaultSlots,
- ctx: RenderContext<PasswordInputProps>
- ) {
- const info = props.errorInfo || props.info;
- const Points = [];
- for (let i = 0; i < props.length; i++) {
- const char = props.value[i];
- Points.push(
- <li class="van-hairline">
- {props.mask ? (
- <i style={{ visibility: char ? 'visible' : 'hidden' }} />
- ) : (
- char
- )}
- </li>
- );
- }
- return (
- <div class={bem()}>
- <ul
- class={[bem('security'), 'van-hairline--surround']}
- onTouchstart={(event: TouchEvent) => {
- event.stopPropagation();
- emit(ctx, 'focus', event);
- }}
- {...inherit(ctx, true)}
- >
- {Points}
- </ul>
- {info && (
- <div class={bem(props.errorInfo ? 'error-info' : 'info')}>{info}</div>
- )}
- </div>
- );
- }
- PasswordInput.props = {
- info: String,
- errorInfo: String,
- mask: {
- type: Boolean,
- default: true
- },
- value: {
- type: String,
- default: ''
- },
- length: {
- type: Number,
- default: 6
- }
- };
- export default sfc<PasswordInputProps>(PasswordInput);
|