在 Focus React Native 上更改 TextInput 样式
Change TextInput Style on Focus React Native
首先,我研究了其他 post 并找到了这个
post中解决方案的问题是一旦fontStyle
设置为斜体,它就不会恢复到正常字体(我猜它不能被覆盖除非组件更新)。这是我的代码示例
<TextInput
style={
this.state.value.length === 0
? {fontStyle: 'italic', color: 'white'} // font changed to white and italic
: {fontStyle: 'normal', color: 'black'} // font changed to black but stays italic
}
value={this.state.value}
/>
我通过强制 TextInput
使用 forceUpdate()
更新或为组件设置一个键来想出一些 hack,但这导致键盘 UI 在用户关闭时关闭打字不利于用户体验。
我只想对链接的 post 发表评论,但我的声誉不够。
这是故意的行为还是我犯了什么错误?
如果有人能提供一些解释/解决方案,将不胜感激。
P.S。使用最新的 React Native
在 Android 上测试
在示例用法中使用 onFocus for the text input to handle your case. Because whenever you focus text input and start typing it will update the state and component will re-render. Look at this expo snack。
state = { isFocused: false };
onFocusChange = () => {
this.setState({ isFocused: true });
}
<TextInput
onFocus={this.onFocusChange}
placeholder='Enter Input Here'
style={(this.state.isFocused) ? {fontStyle: 'normal', color: 'black'} : {fontStyle: 'italic', color: 'white'}}
/>
因此,了解有关组件生命周期的更多信息,然后您将知道如何处理更多此类案例,并且在使用组件之前始终阅读文档,然后您将轻松找到适合您的特定案例的解决方案。
通常 TextInput 有一些 public 样式,因此您可以使用 Stylesheet.compose 来减少代码,如下所示:
const styles = StyleSheet.create({
input: {
borderRadius: 5,
},
inputOnFocus: {
borderBottomWidth: 2,
borderBottomColor: 'green'
}
});
const inputOnFocus = StyleSheet.compose(styles.input, styles.inputOnFocus);
那么你可以使用setState
或useState
来改变样式。
这是使用钩子的另一种方式(顺便说一句,我正在使用 expo.io)
import React, { useState } from 'react'
import { View, StyleSheet, TextInput } from 'react-native'
const TextInput = () => {
const [isHighlighted, setIsHighlighted] = useState(false)
return (
<View>
<TextInput
style={[styles.textInput, isHighlighted && styles.isHighlighted]}
onFocus={() => { setIsHighlighted(true)}
onBlur={() => {setIsHighlighted(false)} />
</View>
)
}
const styles = StyleSheet.create({
textInput: {
borderColor: 'grey',
borderWidth: StyleSheet.hairlineWidth,
borderRadius: 8,
height: 43,
},
isHighlighted: {
borderColor: 'green',
}
})
首先,我研究了其他 post 并找到了这个
post中解决方案的问题是一旦fontStyle
设置为斜体,它就不会恢复到正常字体(我猜它不能被覆盖除非组件更新)。这是我的代码示例
<TextInput
style={
this.state.value.length === 0
? {fontStyle: 'italic', color: 'white'} // font changed to white and italic
: {fontStyle: 'normal', color: 'black'} // font changed to black but stays italic
}
value={this.state.value}
/>
我通过强制 TextInput
使用 forceUpdate()
更新或为组件设置一个键来想出一些 hack,但这导致键盘 UI 在用户关闭时关闭打字不利于用户体验。
我只想对链接的 post 发表评论,但我的声誉不够。
这是故意的行为还是我犯了什么错误? 如果有人能提供一些解释/解决方案,将不胜感激。
P.S。使用最新的 React Native
在 Android 上测试在示例用法中使用 onFocus for the text input to handle your case. Because whenever you focus text input and start typing it will update the state and component will re-render. Look at this expo snack。
state = { isFocused: false };
onFocusChange = () => {
this.setState({ isFocused: true });
}
<TextInput
onFocus={this.onFocusChange}
placeholder='Enter Input Here'
style={(this.state.isFocused) ? {fontStyle: 'normal', color: 'black'} : {fontStyle: 'italic', color: 'white'}}
/>
因此,了解有关组件生命周期的更多信息,然后您将知道如何处理更多此类案例,并且在使用组件之前始终阅读文档,然后您将轻松找到适合您的特定案例的解决方案。
通常 TextInput 有一些 public 样式,因此您可以使用 Stylesheet.compose 来减少代码,如下所示:
const styles = StyleSheet.create({
input: {
borderRadius: 5,
},
inputOnFocus: {
borderBottomWidth: 2,
borderBottomColor: 'green'
}
});
const inputOnFocus = StyleSheet.compose(styles.input, styles.inputOnFocus);
那么你可以使用setState
或useState
来改变样式。
这是使用钩子的另一种方式(顺便说一句,我正在使用 expo.io)
import React, { useState } from 'react'
import { View, StyleSheet, TextInput } from 'react-native'
const TextInput = () => {
const [isHighlighted, setIsHighlighted] = useState(false)
return (
<View>
<TextInput
style={[styles.textInput, isHighlighted && styles.isHighlighted]}
onFocus={() => { setIsHighlighted(true)}
onBlur={() => {setIsHighlighted(false)} />
</View>
)
}
const styles = StyleSheet.create({
textInput: {
borderColor: 'grey',
borderWidth: StyleSheet.hairlineWidth,
borderRadius: 8,
height: 43,
},
isHighlighted: {
borderColor: 'green',
}
})