鸿蒙5.0开发进阶:UI框架-文本输入 (TextInput/TextArea)

文本输入 (TextInput/TextArea)

TextInput、TextArea是输入框组件,通常用于响应用户的输入操作,比如评论区的输入、聊天框的输入、表格的输入等,也可以结合其它组件构建功能页面,例如登录注册页面。

创建输入框

TextInput为单行输入框、TextArea为多行输入框。通过以下接口来创建。

TextInput(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextInputController})
TextArea(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextAreaController})
  • 单行输入框

    TextInput()

  • 多行输入框

    TextArea()

    多行输入框文字超出一行时会自动折行。

    TextArea({text:"我是TextArea我是TextArea我是TextArea我是TextArea"}).width(300)

设置输入框类型

TextInput有9种可选类型,分别为Normal基本输入模式、Password密码输入模式、Email邮箱地址输入模式、Number纯数字输入模式、PhoneNumber电话号码输入模式、USER_NAME用户名输入模式、NEW_PASSWORD新密码输入模式、NUMBER_PASSWORD纯数字密码输入模式、NUMBER_DECIMAL带小数点的数字输入模式。通过type属性进行设置:

  • 基本输入模式(默认类型)

    TextInput()
      .type(InputType.Normal)

  • 密码输入模式

    TextInput()
      .type(InputType.Password)

自定义样式

  • 设置无输入时的提示文本。

    TextInput({placeholder:'我是提示文本'})

  • 设置输入框当前的文本内容。

    TextInput({placeholder:'我是提示文本',text:'我是当前文本内容'})

  • 添加backgroundColor改变输入框的背景颜色。

    TextInput({placeholder:'我是提示文本',text:'我是当前文本内容'})
      .backgroundColor(Color.Pink)

添加事件

文本框主要用于获取用户输入的信息,把信息处理成数据进行上传,绑定onChange事件可以获取输入框内改变的内容。用户也可以使用通用事件来进行相应的交互操作。

TextInput()
  .onChange((value: string) => {
    console.info(value);
  })
  .onFocus(() => {
    console.info('获取焦点');
  })

场景示例

在登录/注册页面,用户进行登录或注册。

@Entry
@Component
struct TextInputSample {
  build() {
    Column() {
      TextInput({ placeholder: 'input your username' }).margin({ top: 20 })
        .onSubmit((EnterKeyType)=>{
          console.info(EnterKeyType+'输入法回车键的类型值')
        })
      TextInput({ placeholder: 'input your password' }).type(InputType.Password).margin({ top: 20 })
        .onSubmit((EnterKeyType)=>{
          console.info(EnterKeyType+'输入法回车键的类型值')
        })
      Button('Sign in').width(150).margin({ top: 20 })
    }.padding(20)
  }
}

键盘避让

键盘抬起后,具有滚动能力的容器组件在横竖屏切换时,才会生效键盘避让,若希望无滚动能力的容器组件也生效键盘避让,建议在组件外嵌套一层具有滚动能力的容器组件,比如ScrollListGrid

// xxx.ets
@Entry
@Component
struct Index {
  placeHolderArr: string[] = ['1', '2', '3', '4', '5', '6', '7']

  build() {
    Scroll() {
      Column() {
        ForEach(this.placeHolderArr, (placeholder: string) => {
          TextInput({ placeholder: 'TextInput ' + placeholder })
            .margin(30)
        })
      }
    }
    .height('100%')
    .width('100%')
  }
}

<template> <div class="custom-textarea-container"> <textarea v-bind="attrs" @input="onInput" :class="attrs.resize === 'none' ? 'resizeNone' : ''" :maxlength="500" ></textarea> </div> </template> <script setup lang="ts"> import { useAttrs } from 'vue' const attrs = useAttrs() const emit = defineEmits(['update:modelValue']); const onInput = (event) => { emit('update:modelValue', event.target.value); }; </script> <style scoped lang="less"> .custom-textarea-container { --el-input-width: 100%; position: relative; display: inline-block; width: 100%; min-height: 64px; vertical-align: bottom; font-size: var(--el-font-size-base); .resizeNone { resize: none; } } .custom-textarea-container textarea { &::placeholder { color: var(--el-input-placeholder-color) } &::-webkit-input-placeholder { color: var(--el-input-placeholder-color) } &::-moz-placeholder { color: var(--el-input-placeholder-color) } &:-ms-input-placeholder { color: var(--el-input-placeholder-color) } &::-ms-input-placeholder { color: var(--el-input-placeholder-color) } touch-action: manipulation; --el-input-text-color: var(--el-text-color-regular); --el-input-border: var(--el-border); --el-input-hover-border: var(--el-border-color-hover); --el-input-focus-border: var(--el-color-primary); --el-input-transparent-border: 0 0 0 1px transparent inset; --el-input-border-color: var(--el-border-color); --el-input-border-radius: var(--el-border-radius-base); --el-input-bg-color: var(--el-fill-color-blank); --el-input-icon-color: var(--el-text-color-placeholder); --el-input-placeholder-color: var(--el-text-color-placeholder); --el-input-hover-border-color: var(--el-border-color-hover); --el-input-clear-hover-color: var(--el-text-color-secondary); --el-input-focus-border-color: var(--el-color-primary); --el-input-width: 100%; position: relative; display: block; resize: vertical; padding: 5px 11px; line-height: 1.5; box-sizing: border-box; width: 100%; font-size: inherit; outline: none; /* 移除默认的焦点轮廓 */ color: var(--el-input-text-color, var(--el-text-color-regular)); background-color: var(--el-input-bg-color, var(--el-fill-color-blank)); background-image: none; -webkit-appearance: none; overflow: auto; box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset; border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); transition: var(--el-transition-box-shadow); border: none; min-height: 64px; &:hover { box-shadow: 0 0 0 1px var(--el-border-color-hover) inset; } &:focus { box-shadow: 0 0 0 1px var(--el-color-primary) inset; } } .word-limit { color: var(--el-color-info); background: var(--el-fill-color-blank); position: absolute; font-size: 12px; line-height: 14px; bottom: 5px; right: 10px; } </style> 这是封装的组件 , <Textarea v-if="!type" v-model="faultForm.earlyIncident.symptom" placeholder="请输入..." :rows="4" /> 这是父组件引用的代码, 为啥初始化这个值没有变动
最新发布
11-20
在Vue中,封装的textarea组件在父组件引用时使用v-model初始化值未变动,可能有以下原因: ### 组件v-model实现问题 组件的v-model会在patch阶段组件Vue实例创建时触发`updateComponentListeners`来实现事件注册等操作,而表单元素的v-model直接在构建render函数阶段就已经注册了input或textarea value [^1]。如果组件内对v-model的实现不符合规范,可能导致初始化值无法正确更新。在Vue 3中,默认的prop名变为`modelValue`,默认事件名变为`update:modelValue`,若组件没有正确设置这些,会影响值的传递。例如: ```vue <template> <textarea :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"></textarea> </template> <script> export default { props: ['modelValue'], emits: ['update:modelValue'] } </script> ``` 如果组件代码没有按上述方式实现,初始化值可能无法正常更新 [^3]。 ### 父组件数据更新问题 父组件中绑定的数据可能没有正确更新。若父组件数据是异步获取的,而组件在数据还未获取到就已经渲染,可能导致初始化值没有变动。比如: ```vue <template> <div> <MyTextarea v-model="formData.textareaValue"></MyTextarea> </div> </template> <script> export default { data() { return { formData: { textareaValue: '' } }; }, created() { // 模拟异步获取数据 setTimeout(() => { this.formData.textareaValue = 'new value'; }, 1000); } } </script> ``` 如果异步数据更新时,组件没有正确响应,就会出现初始化值未变动的情况。 ### 组件props更新响应问题 组件可能没有正确响应props的更新。组件内部可能没有对传入的props进行监听和处理,导致即使父组件数据更新,组件内的值也不会更新。可以在组件内使用`watch`来监听`modelValue`的变化: ```vue <template> <textarea :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"></textarea> </template> <script> export default { props: ['modelValue'], emits: ['update:modelValue'], watch: { modelValue(newValue) { // 处理值的更新 } } } </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值