¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="u-textarea" :class="textareaClass" :style="[textareaStyle]"> |
| | | <textarea |
| | | class="u-textarea__field" |
| | | :value="innerValue" |
| | | :style="{ height: $u.addUnit(height) }" |
| | | :placeholder="placeholder" |
| | | :placeholder-style="$u.addStyle(placeholderStyle, 'string')" |
| | | :placeholder-class="placeholderClass" |
| | | :disabled="disabled" |
| | | :focus="focus" |
| | | :autoHeight="autoHeight" |
| | | :fixed="fixed" |
| | | :cursorSpacing="cursorSpacing" |
| | | :cursor="cursor" |
| | | :showConfirmBar="showConfirmBar" |
| | | :selectionStart="selectionStart" |
| | | :selectionEnd="selectionEnd" |
| | | :adjustPosition="adjustPosition" |
| | | :disableDefaultPadding="disableDefaultPadding" |
| | | :holdKeyboard="holdKeyboard" |
| | | :maxlength="maxlength" |
| | | :confirmType="confirmType" |
| | | :ignoreCompositionEvent="ignoreCompositionEvent" |
| | | @focus="onFocus" |
| | | @blur="onBlur" |
| | | @linechange="onLinechange" |
| | | @input="onInput" |
| | | @confirm="onConfirm" |
| | | @keyboardheightchange="onKeyboardheightchange" |
| | | ></textarea> |
| | | <text |
| | | class="u-textarea__count" |
| | | :style="{ |
| | | 'background-color': disabled ? 'transparent' : '#fff', |
| | | }" |
| | | v-if="count" |
| | | >{{ innerValue.length }}/{{ maxlength }}</text |
| | | > |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import props from "./props.js"; |
| | | /** |
| | | * Textarea ææ¬å |
| | | * @description ææ¬åæ¤ç»ä»¶æ»¡è¶³äºå¯è½åºç°ç表åä¿¡æ¯è¡¥å
ï¼ç¼è¾çå®é
é»è¾çåè½ï¼å
ç½®äºåæ°æ ¡éªç |
| | | * @tutorial https://www.uviewui.com/components/textarea.html |
| | | * |
| | | * @property {String | Number} value è¾å
¥æ¡çå
容 |
| | | * @property {String | Number} placeholder è¾å
¥æ¡ä¸ºç©ºæ¶å ä½ç¬¦ |
| | | * @property {String} placeholderClass æå®placeholderçæ ·å¼ç±»ï¼æ³¨æé¡µé¢æç»ä»¶çstyleä¸åäºscopedæ¶ï¼éè¦å¨ç±»ååå/deep/ ï¼ é»è®¤ 'input-placeholder' ï¼ |
| | | * @property {String | Object} placeholderStyle æå®placeholderçæ ·å¼ï¼å符串/对象形å¼ï¼å¦"color: red;" |
| | | * @property {String | Number} height è¾å
¥æ¡é«åº¦ï¼é»è®¤ 70 ï¼ |
| | | * @property {String} confirmType 设置é®çå³ä¸è§æé®çæåï¼ä»
微信å°ç¨åºï¼App-vueåH5ææï¼é»è®¤ 'done' ï¼ |
| | | * @property {Boolean} disabled æ¯å¦ç¦ç¨ï¼é»è®¤ false ï¼ |
| | | * @property {Boolean} count æ¯å¦æ¾ç¤ºç»è®¡åæ°ï¼é»è®¤ false ï¼ |
| | | * @property {Boolean} focus æ¯å¦èªå¨è·åç¦ç¹ï¼nvue䏿¯æï¼H5åå³äºæµè§å¨çå®ç°ï¼é»è®¤ false ï¼ |
| | | * @property {Boolean | Function} autoHeight æ¯å¦èªå¨å¢å é«åº¦ï¼é»è®¤ false ï¼ |
| | | * @property {Boolean} fixed 妿textareaæ¯å¨ä¸ä¸ªposition:fixedçåºåï¼éè¦æ¾ç¤ºæå®å±æ§fixed为trueï¼é»è®¤ false ï¼ |
| | | * @property {Number} cursorSpacing æå®å
æ ä¸é®ççè·ç¦»ï¼é»è®¤ 0 ï¼ |
| | | * @property {String | Number} cursor æå®focusæ¶çå
æ ä½ç½® |
| | | * @property {Function} formatter å
容å¼å彿° |
| | | * @property {Boolean} showConfirmBar æ¯å¦æ¾ç¤ºé®ç䏿¹å¸¦æâ宿âæé®é£ä¸æ ï¼ï¼é»è®¤ true ï¼ |
| | | * @property {Number} selectionStart å
æ èµ·å§ä½ç½®ï¼èªå¨èç¦æ¶ææï¼éä¸selection-endæé
使ç¨ï¼ï¼é»è®¤ -1 ï¼ |
| | | * @property {Number | Number} selectionEnd å
æ ç»æä½ç½®ï¼èªå¨èç¦æ¶ææï¼éä¸selection-startæé
使ç¨ï¼é»è®¤ -1 ï¼ |
| | | * @property {Boolean} adjustPosition é®ç弹起æ¶ï¼æ¯å¦èªå¨ä¸æ¨é¡µé¢ï¼é»è®¤ true ï¼ |
| | | * @property {Boolean | Number} disableDefaultPadding æ¯å¦å»æ iOS ä¸çé»è®¤å
è¾¹è·ï¼åªå¾®ä¿¡å°ç¨åºææï¼é»è®¤ false ï¼ |
| | | * @property {Boolean} holdKeyboard focusæ¶ï¼ç¹å»é¡µé¢çæ¶å䏿¶èµ·é®çï¼åªå¾®ä¿¡å°ç¨åºææï¼é»è®¤ false ï¼ |
| | | * @property {String | Number} maxlength æå¤§è¾å
¥é¿åº¦ï¼è®¾ç½®ä¸º -1 çæ¶åä¸é嶿大é¿åº¦ï¼é»è®¤ 140 ï¼ |
| | | * @property {String} border è¾¹æ¡ç±»åï¼surround-åå¨è¾¹æ¡ï¼none-æ è¾¹æ¡ï¼bottom-åºé¨è¾¹æ¡ï¼é»è®¤ 'surround' ï¼ |
| | | * @property {Boolean} ignoreCompositionEvent æ¯å¦å¿½ç¥ç»ä»¶å
å¯¹ææ¬åæç³»ç»äºä»¶çå¤ç |
| | | * |
| | | * @event {Function(e)} focus è¾å
¥æ¡èç¦æ¶è§¦åï¼event.detail = { value, height }ï¼height 为é®çé«åº¦ |
| | | * @event {Function(e)} blur è¾å
¥æ¡å¤±å»ç¦ç¹æ¶è§¦åï¼event.detail = {value, cursor} |
| | | * @event {Function(e)} linechange è¾å
¥æ¡è¡æ°ååæ¶è°ç¨ï¼event.detail = {height: 0, heightRpx: 0, lineCount: 0} |
| | | * @event {Function(e)} input å½é®çè¾å
¥æ¶ï¼è§¦å input äºä»¶ |
| | | * @event {Function(e)} confirm ç¹å»å®ææ¶ï¼ 触å confirm äºä»¶ |
| | | * @event {Function(e)} keyboardheightchange é®çé«åº¦åçååçæ¶åè§¦åæ¤äºä»¶ |
| | | * @example <u--textarea v-model="value1" placeholder="请è¾å
¥å
容" ></u--textarea> |
| | | */ |
| | | export default { |
| | | name: "u-textarea", |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin, props], |
| | | data() { |
| | | return { |
| | | // è¾å
¥æ¡çå¼ |
| | | innerValue: "", |
| | | // æ¯å¦å¤äºè·å¾ç¦ç¹ç¶æ |
| | | focused: false, |
| | | // valueæ¯å¦ç¬¬ä¸æ¬¡ååï¼å¨watchä¸ï¼ç±äºå å
¥immediate屿§ï¼ä¼å¨ç¬¬ä¸æ¬¡è§¦åï¼æ¤æ¶ä¸åºè¯¥è®¤ä¸ºvalueåçäºåå |
| | | firstChange: true, |
| | | // valueç»å®å¼çå忝ç±å
é¨è¿æ¯å¤é¨å¼èµ·ç |
| | | changeFromInner: false, |
| | | // è¿æ»¤å¤çæ¹æ³ |
| | | innerFormatter: value => value |
| | | } |
| | | }, |
| | | watch: { |
| | | value: { |
| | | immediate: true, |
| | | handler(newVal, oldVal) { |
| | | this.innerValue = newVal; |
| | | /* #ifdef H5 */ |
| | | // å¨H5ä¸ï¼å¤é¨valueåååï¼ä¿®æ¹inputä¸çå¼ï¼ä¸ä¼è§¦å@inputäºä»¶ï¼æ¤æ¶æå¨è°ç¨å¼ååæ¹æ³ |
| | | if ( |
| | | this.firstChange === false && |
| | | this.changeFromInner === false |
| | | ) { |
| | | this.valueChange(); |
| | | } |
| | | /* #endif */ |
| | | this.firstChange = false; |
| | | // éç½®changeFromInnerçå¼ä¸ºfalseï¼æ è¯ä¸ä¸æ¬¡å¼èµ·é»è®¤ä¸ºå¤é¨å¼èµ·ç |
| | | this.changeFromInner = false; |
| | | }, |
| | | }, |
| | | }, |
| | | computed: { |
| | | // ç»ä»¶çç±»å |
| | | textareaClass() { |
| | | let classes = [], |
| | | { border, disabled, shape } = this; |
| | | border === "surround" && |
| | | (classes = classes.concat(["u-border", "u-textarea--radius"])); |
| | | border === "bottom" && |
| | | (classes = classes.concat([ |
| | | "u-border-bottom", |
| | | "u-textarea--no-radius", |
| | | ])); |
| | | disabled && classes.push("u-textarea--disabled"); |
| | | return classes.join(" "); |
| | | }, |
| | | // ç»ä»¶çæ ·å¼ |
| | | textareaStyle() { |
| | | const style = {}; |
| | | // #ifdef APP-NVUE |
| | | // ç±äºtextareaå¨å®ånvueä¸ç差弿§ï¼éè¦é¢å¤åè°æ´å
¶å
è¾¹è· |
| | | if (uni.$u.os() === "android") { |
| | | style.paddingTop = "6px"; |
| | | style.paddingLeft = "9px"; |
| | | style.paddingBottom = "3px"; |
| | | style.paddingRight = "6px"; |
| | | } |
| | | // #endif |
| | | return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle)); |
| | | }, |
| | | }, |
| | | methods: { |
| | | // å¨å¾®ä¿¡å°ç¨åºä¸ï¼ä¸æ¯æå°å½æ°å½åpropsåæ°ï¼æ
åªè½éè¿refå½¢å¼è°ç¨ |
| | | setFormatter(e) { |
| | | this.innerFormatter = e |
| | | }, |
| | | onFocus(e) { |
| | | this.$emit("focus", e); |
| | | }, |
| | | onBlur(e) { |
| | | this.$emit("blur", e); |
| | | // å°è¯è°ç¨u-formçéªè¯æ¹æ³ |
| | | uni.$u.formValidate(this, "blur"); |
| | | }, |
| | | onLinechange(e) { |
| | | this.$emit("linechange", e); |
| | | }, |
| | | onInput(e) { |
| | | let { value = "" } = e.detail || {}; |
| | | // æ ¼å¼åè¿æ»¤æ¹æ³ |
| | | const formatter = this.formatter || this.innerFormatter |
| | | const formatValue = formatter(value) |
| | | // 为äºé¿å
propsçååæ°æ®æµç¹æ§ï¼éè¦å
å°innerValueå¼è®¾ç½®ä¸ºå½åå¼ï¼åå¨$nextTickä¸éæ°èµäºè®¾ç½®åçå¼æææ |
| | | this.innerValue = value |
| | | this.$nextTick(() => { |
| | | this.innerValue = formatValue; |
| | | this.valueChange(); |
| | | }) |
| | | }, |
| | | // å
容åçååï¼è¿è¡å¤ç |
| | | valueChange() { |
| | | const value = this.innerValue; |
| | | this.$nextTick(() => { |
| | | this.$emit("input", value); |
| | | // æ è¯valueå¼çå忝ç±å
é¨å¼èµ·ç |
| | | this.changeFromInner = true; |
| | | this.$emit("change", value); |
| | | // å°è¯è°ç¨u-formçéªè¯æ¹æ³ |
| | | uni.$u.formValidate(this, "change"); |
| | | }); |
| | | }, |
| | | onConfirm(e) { |
| | | this.$emit("confirm", e); |
| | | }, |
| | | onKeyboardheightchange(e) { |
| | | this.$emit("keyboardheightchange", e); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "../../libs/css/components.scss"; |
| | | |
| | | .u-textarea { |
| | | border-radius: 4px; |
| | | background-color: #fff; |
| | | position: relative; |
| | | @include flex; |
| | | flex: 1; |
| | | padding: 9px; |
| | | |
| | | &--radius { |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | &--no-radius { |
| | | border-radius: 0; |
| | | } |
| | | |
| | | &--disabled { |
| | | background-color: #f5f7fa; |
| | | } |
| | | |
| | | &__field { |
| | | flex: 1; |
| | | font-size: 15px; |
| | | color: $u-content-color; |
| | | width: 100%; |
| | | } |
| | | |
| | | &__count { |
| | | position: absolute; |
| | | right: 5px; |
| | | bottom: 2px; |
| | | font-size: 12px; |
| | | color: $u-tips-color; |
| | | background-color: #ffffff; |
| | | padding: 1px 4px; |
| | | } |
| | | } |
| | | </style> |