提交 2cefea24 编写于 作者: D DCloud_LXH

feat: input ignoreCompositionEvent

上级 a6e4fbbe
...@@ -139,6 +139,10 @@ export const props = /*#__PURE__*/ extend( ...@@ -139,6 +139,10 @@ export const props = /*#__PURE__*/ extend(
type: Boolean, type: Boolean,
default: false, default: false,
}, },
ignoreCompositionEvent: {
type: Boolean,
default: true,
},
}, },
keyboardProps keyboardProps
) )
...@@ -150,6 +154,9 @@ export const emit = [ ...@@ -150,6 +154,9 @@ export const emit = [
'update:value', 'update:value',
'update:modelValue', 'update:modelValue',
'update:focus', 'update:focus',
'compositionstart',
'compositionupdate',
'compositionend',
...keyboardEmit, ...keyboardEmit,
] ]
...@@ -309,6 +316,7 @@ function useAutoFocus(props: Props, fieldRef: Ref<HTMLFieldElement | null>) { ...@@ -309,6 +316,7 @@ function useAutoFocus(props: Props, fieldRef: Ref<HTMLFieldElement | null>) {
function useEvent( function useEvent(
fieldRef: Ref<HTMLFieldElement | null>, fieldRef: Ref<HTMLFieldElement | null>,
state: State, state: State,
props: Props,
trigger: CustomEventTrigger, trigger: CustomEventTrigger,
triggerInput: Function, triggerInput: Function,
beforeInput?: (event: Event, state: State) => any beforeInput?: (event: Event, state: State) => any
...@@ -366,7 +374,7 @@ function useEvent( ...@@ -366,7 +374,7 @@ function useEvent(
return return
} }
state.value = field.value state.value = field.value
if (!state.composing) { if (!state.composing || !props.ignoreCompositionEvent) {
triggerInput( triggerInput(
event, event,
{ {
...@@ -397,6 +405,7 @@ function useEvent( ...@@ -397,6 +405,7 @@ function useEvent(
field.addEventListener('compositionstart', (event) => { field.addEventListener('compositionstart', (event) => {
event.stopPropagation() event.stopPropagation()
state.composing = true state.composing = true
_onComposition(event)
}) })
field.addEventListener('compositionend', (event) => { field.addEventListener('compositionend', (event) => {
event.stopPropagation() event.stopPropagation()
...@@ -405,7 +414,16 @@ function useEvent( ...@@ -405,7 +414,16 @@ function useEvent(
// 部分输入法 compositionend 事件可能晚于 input // 部分输入法 compositionend 事件可能晚于 input
onInput(event) onInput(event)
} }
_onComposition(event)
}) })
field.addEventListener('compositionupdate', _onComposition)
function _onComposition(event: Event) {
if (!props.ignoreCompositionEvent) {
trigger((event as InputEvent).type, event, {
value: (event as InputEvent).data,
})
}
}
} }
watch([() => state.selectionStart, () => state.selectionEnd], checkSelection) watch([() => state.selectionStart, () => state.selectionEnd], checkSelection)
watch(() => state.cursor, checkCursor) watch(() => state.cursor, checkCursor)
...@@ -425,7 +443,7 @@ export function useField( ...@@ -425,7 +443,7 @@ export function useField(
useKeyboard(props, fieldRef, trigger) useKeyboard(props, fieldRef, trigger)
const { state: scopedAttrsState } = useScopedAttrs() const { state: scopedAttrsState } = useScopedAttrs()
useFormField('name', state) useFormField('name', state)
useEvent(fieldRef, state, trigger, triggerInput, beforeInput) useEvent(fieldRef, state, props, trigger, triggerInput, beforeInput)
// Safari 14 以上修正禁用状态颜色 // Safari 14 以上修正禁用状态颜色
// TODO fixDisabledColor 可以调整到beforeMount或mounted做修正,确保不影响SSR // TODO fixDisabledColor 可以调整到beforeMount或mounted做修正,确保不影响SSR
......
...@@ -39,7 +39,7 @@ function setFixMargin() { ...@@ -39,7 +39,7 @@ function setFixMargin() {
export default /*#__PURE__*/ defineBuiltInComponent({ export default /*#__PURE__*/ defineBuiltInComponent({
name: 'Textarea', name: 'Textarea',
props, props,
emit: ['confirm', 'linechange', ...fieldEmit], emits: ['confirm', 'linechange', ...fieldEmit],
setup(props, { emit }) { setup(props, { emit }) {
const rootRef: Ref<HTMLElement | null> = ref(null) const rootRef: Ref<HTMLElement | null> = ref(null)
const { fieldRef, state, scopedAttrsState, fixDisabledColor, trigger } = const { fieldRef, state, scopedAttrsState, fixDisabledColor, trigger } =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册