React Nativeを学び始めました。プロジェクトでは、プロジェクトで再利用するための単純なButtonコンポーネントを作成しました。ただし、変数 'disabled'に従って不透明度の値を動的に設定しました。ボタンの外観は不透明度変数の値によって変化しません。検索しましたが、説明が見つかりませんでした。
どんな助けでもありがたいです。
これが私のソースコードです:
import React from 'react'
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
import PropTypes from 'prop-types'
//TODO: arrumar o problema com a opacidade
export default function Button({text, onPress, style, disabled, textStyle}) {
let opacity = disabled === true ? 0.5 : 1
// console.log('opacity', opacity)
return (
<TouchableOpacity onPress={onPress} style={[defaultStyles.button, style, {opacity: opacity}]}
disabled={disabled}>
<Text style={[defaultStyles.text, textStyle]}>{text}</Text>
</TouchableOpacity>
)
}
const defaultStyles = StyleSheet.create({
text: {
color: 'white'
},
button: {
backgroundColor: 'black',
margin: 15,
padding: 15,
borderRadius: 10
},
})
Button.propTypes = {
text: PropTypes.string,
onPress: PropTypes.func,
style: PropTypes.oneOfType([
PropTypes.string,
PropTypes.array,
PropTypes.object
]),
disabled: PropTypes.bool,
textStyle: PropTypes.oneOfType([
PropTypes.string,
PropTypes.array,
PropTypes.object
])
}
編集:これはボタンを呼び出すコードです
class NewDeck extends Component {
state={
title: null
}
submit = () => {
const { add, goBack } = this.props
let deck = {...this.state}
if(!deck['deckId']){
deck['deckId'] = Date.now()
deck['logs'] = []
}
!deck['cardsId'] && (deck['cardsId'] = [])
add(deck).then(() => {
this.props.navigation.navigate('Deck', {deckId: deck.deckId, title: deck.title})
this.setState({title: null})
}
)
}
render(){
const disabled = this.state.title === null || this.state.title.length === 0
return (
<KeyboardAwareScrollView resetScrollToCoords={{ x: 0, y: 0 }}
contentContainerStyle={styles.container}>
<Text style={textStyles.title2}>Whats the title of your deck?</Text>
<TextInput editable={true} style={[styles.input, textStyles.body]}
placeholder='Type title here'
maxLength={25}
value={this.state.title}
onChangeText={(text) => {
this.setState({title: text})
}}
/>
<Button
onPress={this.submit}
text='Submit'
style={{backgroundColor: colors.pink}}
textStyle={textStyles.body}
disabled={!this.state.title}
/>
</KeyboardAwareScrollView>
)
}
}
NewDeckコンポーネントのタイトルが空またはnullの場合、無効な変数はtrueです。この変数がtrueの場合、ボタンの不透明度は0.5だけである必要があります。値がfalseになると、不透明度は再び1に変わります。コンポーネントの不透明度の値をログに記録すると、0.5から1になっていることがわかりますが、コンポーネントの外観は変わりません。
TouchableOpacityコンポーネントのバグかどうかはわかりませんが、コンポーネントがクリックされるまで、再レンダリング時に不透明度は更新されません。
問題を解決するには、タッチ可能オブジェクトのコンテンツをViewでラップし、タッチ可能オブジェクトの代わりにopacityをビューに適用します。
export default function Button({text, onPress, style, disabled, textStyle}) {
const opacity = disabled === true ? 0.5 : 1
// console.log('opacity', opacity)
return (
<TouchableOpacity onPress={onPress} disabled={disabled}
style={[defaultStyles.button, style]}>
<View style={{opacity}}>
<Text style={[defaultStyles.text, textStyle]}>{text}</Text>
</View>
</TouchableOpacity>
)
}
私の意見では、正しい解決策は setOpacityTo メソッドを使用することです。
あなたのrender
:
render() {
const opacityValue = this.props.disabled ? 0.5 : 1;
return (
<TouchableOpacity style={{ opacity: opacityValue }} ref={(btn) => { this.btn = btn; }} onPress={this.onPress}>
<Text>{this.props.text}</Text>
</TouchableOpacity>
);
}
次に、setOpacityTo
小道具の変更でcomponentDidUpdate
のdisabled
メソッドを使用できます。
componentDidUpdate(prevProps) {
const { disabled } = this.props;
if (disabled !== prevProps.disabled) {
const opacityValue = disabled ? 0.5 : 1;
this.btn.setOpacityTo(opacityValue);
}
}