InputGroup 中的 NativeBase 多个图标
NativeBase multiple icons in InputGroup
我正在尝试制作一个具有两个图标或一个图标和一个按钮的 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>
)
}
}
这给了我以下结果
第一期
如您所见,我很难让另一个图标出现 - 它似乎不在第一个图标后面。
一个按钮就好了,但它总是落在 Input
下面而不是旁边。样式不是我最擅长的风格 - 因此我使用很棒的框架 NativeBase
第二期
我遇到的另一个问题是,在 state
更新后,验证似乎没有改变图标和颜色。似乎 style
只加载了一次。
在第一期你会考虑前面的有效性图标吗? InputGroup 最多可以显示两个图标:文本输入之前和之后,请参见下面的代码。
在第二期是因为你给状态赋值,而在React中你应该调用this.setState(newState),见reference
另一个问题是通过 key.value 访问对象键的值,而键只是一个字符串(键名),而真实对象通过 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>
)
}
}
我正在尝试制作一个具有两个图标或一个图标和一个按钮的 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>
)
}
}
这给了我以下结果
第一期
如您所见,我很难让另一个图标出现 - 它似乎不在第一个图标后面。
一个按钮就好了,但它总是落在 Input
下面而不是旁边。样式不是我最擅长的风格 - 因此我使用很棒的框架 NativeBase
第二期
我遇到的另一个问题是,在 state
更新后,验证似乎没有改变图标和颜色。似乎 style
只加载了一次。
在第一期你会考虑前面的有效性图标吗? InputGroup 最多可以显示两个图标:文本输入之前和之后,请参见下面的代码。
在第二期是因为你给状态赋值,而在React中你应该调用this.setState(newState),见reference
另一个问题是通过 key.value 访问对象键的值,而键只是一个字符串(键名),而真实对象通过 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>
)
}
}