У меня есть следующий компонент
class LanguageScreen extends Component {
_onPressButton() {
}
render() {
var enButton = <RoundButton
buttonStyle={'black-bordered'}
text={'EN'}
locale={'en'}
selected={true}
style={styles.roundButtonStyle}
onPress={this._onPressButton}
/>
var arButton = <RoundButton
buttonStyle={'golden-gradient'}
text={'ع'}
locale={'ar'}
selected={false}
style={styles.roundButtonStyle}
onPress={this._onPressButton}
/>
return(
<View style={styles.rootViewStyle}>
<View style={styles.buttonContainerRootViewStyle}>
<View style={styles.buttonContainerViewStyle}>
{enButton}
{arButton}
</View>
</View>
<View style={styles.submitButtonContainerViewStyle}>
<Button style={styles.submitButtonStyle}/>
</View>
</View>
);
}
}
Когда пользователь нажимает на enButton, я хочу изменить стиль arButton и наоборот, чтобы дать вам изображение PFA ниже скриншота.
В принципе, я хочу выделить одну кнопку за раз, скажем, пользователь нажимает EN, я хочу выделить выделенный элемент и удалить выделение из другого.
Это мой класс компонентов RoundButton
class RoundButton extends Component {
constructor(props) {
super(props);
this.state = { isSelected: true === props.selected };
}
onClickListen = () => {
this.setState({
isSelected: !this.state.isSelected
});
this.forceUpdate();
}
render() {
if (this.state.isSelected) {
return this.goldenGradient(this.props);
} else {
return this.blackBordered(this.props)
}
}
goldenGradient(props) {
return(
<TouchableOpacity
style={styles.buttonStyle}
onPress={this.props.onPress}
onPressOut={this.onClickListen}
>
<LinearGradient
colors={['#E9E2B0', '#977743']}
start={{x: 1.0, y: 0.0}}
end={{x: 0.0, y: 1.0}}
style={styles.linearGradient}
>
<Text style={this.props.locale == 'ar' ? styles.goldenGradientTextStyleAr : styles.goldenGradientTextStyle}>
{props.text}
</Text>
</LinearGradient>
</TouchableOpacity>
);
}
blackBordered(props) {
return(
<TouchableOpacity
style={
styles.buttonStyle,
styles.blackBorderedStyle
}
onPress={this.props.onPress}
onPressOut={this.onClickListen}
>
<Text style={this.props.locale == 'ar' ? styles.blackBorderedTextStyleAr : styles.blackBorderedTextStyle}>
{props.text}
</Text>
</TouchableOpacity>
);
}
}
Решение, которое я искал, было: если пользователь нажимает кнопку EN, тогда я хочу, чтобы другая кнопка также вызывала нажатие, это приведет к изменению состояния и переключению состояния подсветки. Никакое решение, похоже, не работает. Как мне это сделать?
Спасибо.
Лучшее решение для этого - позволить компоненту отца управлять подсветкой кнопок. Таким образом, вы должны включить состояние компонента-отправителя в текущую выбранную кнопку и передать кнопку boolean prop на кнопку, которая указывает, выбрана она или нет. Как я вижу, вы уже передали "выбранную" опору, эту опору следует обрабатывать в компоненте отца, а не в одной кнопке.
Если вы поступите так, как вы сказали, вы прервите поток данных сверху вниз, на основании которого
Добавить конструктор:
constructor(props) {
super(props);
this.state = {
selectedButton: 'en'
};
this._onPressButton = this._onPressButton.bind(this);
}
На кнопке нажмите:
_onPressButton(button) {
this.setState({
selectedButton: button
});
}
Кнопки init:
const arButton = <RoundButton
buttonStyle={'golden-gradient'}
text={'ع'}
locale={'ar'}
selected={this.checkButtonSelect('ar')}
style={styles.roundButtonStyle}
onPress={this._onPressButton}/>
const enButton = <RoundButton
buttonStyle={'black-bordered'}
text={'EN'}
locale={'en'}
selected={this.checkButtonSelect('en')}
style={styles.roundButtonStyle}
onPress={this._onPressButton}
Проверьте, выбрана ли кнопка
checkButtonSelect(button) {
return this.state.selectedButton === button;
}
Это довольно понятное объяснение
class RoundButton extends Component {
constructor(props) {
super(props);
this.state = { isSelected: true === props.selected };
}
onClickListen = () => {
this.props.onPress(this.props.locale);
/*
* You dont need this, the component is already updated on setState()
* call
*/
//this.forceUpdate();
}
render() {
if (this.state.isSelected) {
return this.goldenGradient(this.props);
} else {
return this.blackBordered(this.props)
}
}
goldenGradient(props) {
return(
<TouchableOpacity
style={styles.buttonStyle}
onPress={this.onClickListen}
>
<LinearGradient
colors={['#E9E2B0', '#977743']}
start={{x: 1.0, y: 0.0}}
end={{x: 0.0, y: 1.0}}
style={styles.linearGradient}
>
<Text style={this.props.locale == 'ar' ? styles.goldenGradientTextStyleAr : styles.goldenGradientTextStyle}>
{props.text}
</Text>
</LinearGradient>
</TouchableOpacity>
);
}
blackBordered(props) {
return(
<TouchableOpacity
style={
styles.buttonStyle,
styles.blackBorderedStyle
}
onPress={this.props.onPress}
onPressOut={this.onClickListen}
>
<Text style={this.props.locale == 'ar' ? styles.blackBorderedTextStyleAr : styles.blackBorderedTextStyle}>
{props.text}
</Text>
</TouchableOpacity>
);
}
}
Вы думали об изменении статуса в родительском компоненте, где отображаются кнопки? Почему бы вам не отследить, какая кнопка была нажата в LanguageScreen
а затем передать эту информацию кнопкам.
_onPressButton (selectedLocale) {
this.setState({ selectedLocale })
}
var enButton = <RoundButton
onPress={this._onPressButton}
isSelected={this.state.selectedLocale === 'en'}
...youStaff
/>
var arButton = <RoundButton
onPress={this._onPressButton}
isSelected={this.state.selectedLocale === 'ar'}
...yourStaff
/>
И в вашем RoundButton
:
onClickListen = () => {
this.props.onPress(this.props.locale)
}
render() {
if (this.props.isSelected) {
return this.goldenGradient(this.props);
} else {
return this.blackBordered(this.props)
}
}