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

fix: textarea picker ssr

上级 a9b9b9a5
import { Ref, ref, computed, watch } from 'vue' import { Ref, ref, computed, watch, onMounted } from 'vue'
import { extend } from '@vue/shared' import { extend } from '@vue/shared'
import { defineBuiltInComponent } from '../../helpers/component' import { defineBuiltInComponent } from '../../helpers/component'
import { import {
...@@ -23,6 +23,18 @@ const props = /*#__PURE__*/ extend({}, fieldProps, { ...@@ -23,6 +23,18 @@ const props = /*#__PURE__*/ extend({}, fieldProps, {
}, },
}) })
let fixMargin: Boolean = false
function setFixMargin() {
// iOS 13 以下版本需要修正边距
const DARK_TEST_STRING = '(prefers-color-scheme: dark)'
fixMargin = __NODE_JS__
? false
: String(navigator.platform).indexOf('iP') === 0 &&
String(navigator.vendor).indexOf('Apple') === 0 &&
window.matchMedia(DARK_TEST_STRING).media !== DARK_TEST_STRING
}
export default /*#__PURE__*/ defineBuiltInComponent({ export default /*#__PURE__*/ defineBuiltInComponent({
name: 'Textarea', name: 'Textarea',
props, props,
...@@ -88,12 +100,11 @@ export default /*#__PURE__*/ defineBuiltInComponent({ ...@@ -88,12 +100,11 @@ export default /*#__PURE__*/ defineBuiltInComponent({
} }
} }
// iOS 13 以下版本需要修正边距 if (__NODE_JS__) {
const DARK_TEST_STRING = '(prefers-color-scheme: dark)' onMounted(setFixMargin)
const fixMargin = } else {
String(navigator.platform).indexOf('iP') === 0 && setFixMargin()
String(navigator.vendor).indexOf('Apple') === 0 && }
window.matchMedia(DARK_TEST_STRING).media !== DARK_TEST_STRING
return () => { return () => {
let textareaNode = let textareaNode =
...@@ -120,6 +131,7 @@ export default /*#__PURE__*/ defineBuiltInComponent({ ...@@ -120,6 +131,7 @@ export default /*#__PURE__*/ defineBuiltInComponent({
value={state.value} value={state.value}
disabled={!!props.disabled} disabled={!!props.disabled}
maxlength={state.maxlength} maxlength={state.maxlength}
// @ts-ignore
enterkeyhint={props.confirmType} enterkeyhint={props.confirmType}
class={{ class={{
'uni-textarea-textarea': true, 'uni-textarea-textarea': true,
...@@ -148,6 +160,7 @@ export default /*#__PURE__*/ defineBuiltInComponent({ ...@@ -148,6 +160,7 @@ export default /*#__PURE__*/ defineBuiltInComponent({
{valueCompute.value.map((item) => ( {valueCompute.value.map((item) => (
<div>{item.trim() ? item : '.'}</div> <div>{item.trim() ? item : '.'}</div>
))} ))}
{/* @ts-ignore */}
<ResizeSensor initial onResize={onResize} /> <ResizeSensor initial onResize={onResize} />
</div> </div>
{props.confirmType === 'search' ? ( {props.confirmType === 'search' ? (
......
...@@ -11,6 +11,7 @@ import { ...@@ -11,6 +11,7 @@ import {
Transition, Transition,
Ref, Ref,
ExtractPropTypes, ExtractPropTypes,
onMounted,
} from 'vue' } from 'vue'
import { import {
useBooleanAttr, useBooleanAttr,
...@@ -440,6 +441,43 @@ function usePickerState(props: Props) { ...@@ -440,6 +441,43 @@ function usePickerState(props: Props) {
} }
} }
const getiPadFlag = () =>
String(navigator.vendor).indexOf('Apple') === 0 &&
navigator.maxTouchPoints > 0
function useIsiPad() {
const isiPad = ref(false)
if (__NODE_JS__) {
onMounted(() => (isiPad.value = getiPadFlag()))
} else {
isiPad.value = getiPadFlag()
}
return isiPad
}
const getSystem = () => {
if (/win|mac/i.test(navigator.platform)) {
if (navigator.vendor === 'Google Inc.') {
return 'chrome'
} else if (/Firefox/.test(navigator.userAgent)) {
return 'firefox'
}
}
return ''
}
function useSystem() {
const _system = ref('')
if (__NODE_JS__) {
onMounted(() => (_system.value = getSystem()))
} else {
_system.value = getSystem()
}
return _system
}
let __contentVisibleDelay: number let __contentVisibleDelay: number
function usePickerMethods( function usePickerMethods(
props: Props, props: Props,
...@@ -450,29 +488,24 @@ function usePickerMethods( ...@@ -450,29 +488,24 @@ function usePickerMethods(
selectRef: HTMLRef, selectRef: HTMLRef,
inputRef: HTMLRef inputRef: HTMLRef
) { ) {
const isiPad = useIsiPad()
const _system = useSystem()
const selectorTypeComputed = computed(() => { const selectorTypeComputed = computed(() => {
const type = props.selectorType const type = props.selectorType
if (Object.values(selectorType).includes(type)) { if (Object.values(selectorType).includes(type)) {
return type return type
} }
return String(navigator.vendor).indexOf('Apple') === 0 &&
navigator.maxTouchPoints > 0 return isiPad.value ? selectorType.PICKER : selectorType.SELECT
? selectorType.PICKER
: selectorType.SELECT
}) })
const system = computed(() => { const system = computed(() => {
if (__NODE_JS__) return ''
if ( if (
props.mode === mode.DATE && props.mode === mode.DATE &&
!Object.values(fields).includes(props.fields) && !Object.values(fields).includes(props.fields) &&
state.isDesktop && state.isDesktop
/win|mac/i.test(navigator.platform)
) { ) {
if (navigator.vendor === 'Google Inc.') { return _system.value
return 'chrome'
} else if (/Firefox/.test(navigator.userAgent)) {
return 'firefox'
}
} }
return '' return ''
}) })
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册