reactjs - NativeBase InputGroup 中的多个图标

标签 reactjs react-native native-base

我正在尝试制作一个具有两个图标或一个图标和一个按钮的 InputGroup

应使用一个图标来检查输入字段是否为空(使其正常工作)。另一个图标或按钮应该用于将一些文本“注入(inject)”到Input字段中。

目前我的代码如下所示:

import React, { Component } from 'react'
import { Content, List, InputGroup, Input, Icon, Button } from 'native-base'
export default class AddEquipment extends Component {
  constructor(props) {
    super(props)

    this.state = {
      parameters:  {
        one: {value:"", hint: "One"},
        two: {value:"", hint: "Two"},
        three: {value:"Valid", hint: "Three"}
      }
    }

    this.updateParameter = this.updateParameter.bind(this)
    this.validationStyle = this.validationStyle.bind(this)
  }

  componentDidMount() {

  }

  updateParameter(key, value) {
    newState = {...this.state}
    newState.parameters[key].value = value
    this.setState = newState;
  }

  validationStyle(text) {
    color = text === "" ? "#b03939" : "#649370"
    return (
      { marginRight:25, color
      }
    )
  }

  render () {
    return (
      <Content>
        { Object
          .keys(this.state.parameters)
          .map( key =>
            <InputGroup
              key={`${key}_InputGroup`}
              iconRight
              borderType='regular'
              style={{margin:5}}
              >

              <Input
                placeholder={this.state.parameters[key].hint}
                onChangeText={(text) => {
                  console.log(this.state.parameters)
                  this.updateParameter(key, text)} }
                value={key.value}
              />

              <Icon
                key={`${key}_validIcon`}
                name={ this.state.parameters[key].value === "" ? 'ios-alert' : 'ios-checkmark-circle'}
                style={ this.validationStyle(this.state.parameters[key].value) }
              />

              <Icon
                key={`${key}_injectNA`}
                name='ios-beer'
                onPress={() => this.updateParameter(key, "Cheers!") }/>

            </InputGroup>
          )
        }
      </Content>
    )
  }
}

这给了我以下结果

output

第一期

如您所见,我无法显示另一个图标 - 它似乎并不位于第一个图标后面。

一个按钮也不错,但它总是落在Input下方,而不是在它旁边。样式不是我最擅长的风格 - 这就是为什么我使用很棒的框架 NativeBase

第二期

我遇到的另一个问题是,在更新 state 后,验证似乎没有更改图标和颜色。似乎 style 仅加载一次。

最佳答案

关于第一期,您会考虑前面的有效性图标吗? InputGroup最多可以在文本输入之前和之后显示两个图标,请参见下面的代码。

第二个问题上,这是因为你给状态赋值了,而在React中你应该调用this.setState(newState),参见reference

另一个问题是通过key.value来访问对象key的value,而key只是一个字符串(键名),而通过this.state.parameters[key]访问真实的对象

以下代码修复了所有提到的问题(但有效性图标位于左侧):

import React, { Component } from 'react'
import { Content, List, InputGroup, Input, Icon, Button } from 'native-base'

const errorStyle = {color: "#b03939"}
const validStyle = {color: "#649370"}

export default class AddEquipment extends Component {
  constructor(props) {
    super(props)

    this.state = {
      parameters:  {
        one: {value:"", hint: "One"},
        two: {value:"", hint: "Two"},
        three: {value:"Valid", hint: "Three"}
      }
    }

    this.updateParameter = this.updateParameter.bind(this)
  }

  componentDidMount() {

  }

  updateParameter(key, value) {
    let newState = {...this.state}
    newState.parameters[key].value = value
    this.setState(newState);
  }

  static validationStyle(text) {
    return text === "" ? errorStyle : validStyle;
  }

  render () {
    return (
      <Content>
        { Object
          .keys(this.state.parameters)
          .map( key =>
            <InputGroup
              key={`${key}_InputGroup`}
              borderType='regular'
              style={{margin:5}}
              >

              <Icon
                  key={`${key}_validIcon`}
                  name={ this.state.parameters[key].value === "" ? 'ios-alert' : 'ios-checkmark-circle'}
                  style={ AddEquipment.validationStyle(this.state.parameters[key].value) }
                />

              <Input
                placeholder={this.state.parameters[key].hint}
                onChangeText={(text) => {
                  console.log(this.state.parameters)
                  this.updateParameter(key, text)} }
                value={this.state.parameters[key].value}
              />

              <Icon
                key={`${key}_injectNA`}
                name='ios-beer'
                onPress={() => this.updateParameter(key, "Cheers!") }/>

            </InputGroup>

          )
        }
      </Content>
    )
  }
}

关于reactjs - NativeBase InputGroup 中的多个图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200747/

相关文章:

javascript - 模块构建失败(来自 ./node_modules/babel-loader/lib/index.js): Error: Cannot find module 'babel-preset-react'

reactjs - 原生应用中的 ffmpeg、ffmpeg wasm 和 ffmpeg 有什么区别?

android - zIndex 不适用于 android

react native + native 基础。让MapView填充<Content>区域

android - React Native Android 应用程序在启动时崩溃

javascript - Reactjs:为什么子组件不在数据更改时重新呈现?

html -::选择仅在使用 - Chrome + ReactJs 在检查器中强制重新渲染后才有效

javascript - 在将图像发送到 S3 之前,在前端调整图像大小,javascript

react-native - React Native语法错误: Unexpected token '.' when not debugging in Chrome

react-native - 为什么 react native pickerIOS 没有下拉图标?