React Native — есть ли лучший способ присвоить каждой кнопке стиль `borderRadius`?

#react-native #styles #mapping #border-radius

#react-native #стили #сопоставление #граница-радиус

Вопрос:

Я создал три кнопки, используя map , а 1-я и 3-я кнопки расположены borderRadius сбоку.

Вот как это выглядит :

Как вы можете видеть, первая и вторая кнопки должны иметь borderRadius

Хотя я в любом случае отображал кнопки, как ожидалось, но я чувствую, что этот код должен быть лучше, чем я сделал. Кроме того, я не уверен, можно ли сопоставлять кнопки таким образом..

Мой код ниже :

 const styles = StyleSheet.create({
  row: {
    flexDirection: 'row',
    justifyContent: 'flex-end',
    marginRight: 15,
    marginTop: 15,
  },
  btnWrap: {
    width: 50,
    height: 24,
    backgroundColor: colors.white_two,
    borderWidth: 0.5,
    borderColor: colors.very_light_pink_five,
    justifyContent: 'center',
    alignItems: 'center',
  },
  textStyle: {
    fontSize: 10,
    fontWeight: 'normal',
    color: colors.very_light_pink_five,
  },
  btnLeft: {
    borderTopLeftRadius: 6,
    borderBottomLeftRadius: 6,
  },
  btnRight: {
    borderTopRightRadius: 6,
    borderBottomRightRadius: 6,
  },
  btnMiddle: {
    borderLeftWidth: 0,
    borderRightWidth: 0,
  },
  selected: {
    backgroundColor: colors.black,
  },
  selectedText: {
    color: colors.white_two,
  },
});


const pointType = ['one', 'two', 'three'];

const MypagePoint = ({ totalPoint }) => {
  const [btnClicked, setBtnClicked] = useState(null);

  return (
    <View style={[styles.container]}>
      
      <View style={[styles.row, { marginBottom: 15 }]}>
        {pointType.map((type, index) => (
          <TouchableOpacity
            style={[
              styles.btnWrap,
              btnClicked === index amp;amp; styles.selected,

              // This is the part I doubt
              index === 0 amp;amp; styles.btnLeft,
              index === 1 amp;amp; styles.btnMiddle,
              index === 2 amp;amp; styles.btnRight,
            ]}
            onPress={() => setBtnClicked(index)}
          >
            <Text
              style={[
                styles.textStyle,
                btnClicked === index amp;amp; styles.selectedText,
              ]}
            >
              {type}
            </Text>
          </TouchableOpacity>
        ))}
      </View>
    </View>
  );
};
 

Не могли бы вы сообщить мне лучший способ кодирования?

Ответ №1:

Старое решение: вместо этого используйте тернарный оператор.

Обновлено: создайте вспомогательную функцию и используйте стиль закругленных углов только для первой и последней кнопок.

Рабочий пример: закуска на выставке

введите описание изображения здесь

 import React, { useState, useEffect } from 'react';
import {
  Text,
  View,
  StyleSheet,
  TouchableOpacity,
  FlatList,
} from 'react-native';
import Constants from 'expo-constants';

const styles = StyleSheet.create({
  row: {
    flexDirection: 'row',
    justifyContent: 'flex-end',
    marginRight: 15,
    marginTop: 15,
  },
  btnWrap: {
    width: 50,
    height: 24,
    backgroundColor: 'white',
    borderWidth: 1,
    borderColor: 'pink',
    justifyContent: 'center',
    alignItems: 'center',
    margin: -2,
  },
  textStyle: {
    fontSize: 10,
    fontWeight: 'normal',
    color: 'pink',
  },
  btnLeft: {
    borderTopLeftRadius: 6,
    borderBottomLeftRadius: 6,
  },
  btnRight: {
    borderTopRightRadius: 6,
    borderBottomRightRadius: 6,
  },
  selected: {
    backgroundColor: 'black',
  },
  selectedText: {
    color: 'white',
  },
});

const pointType = ['one', 'two', 'three', 'four', 'five', 'six'];

export default MypagePoint = ({ totalPoint }) => {
  const [btnClicked, setBtnClicked] = useState(null);

  const buttonStyle = (index) => {
    if (index === 0) return styles.btnLeft;
    else if (index === pointType.length - 1) return styles.btnRight;
  };

  return (
    <View style={[styles.container]}>
      <View style={[styles.row, { marginBottom: 15 }]}>
        {pointType.map((type, index) => (
          <Button
            index={index}
            btnClicked={btnClicked}
            buttonStyle={buttonStyle}
            setBtnClicked={setBtnClicked}
            type={type}
          />
        ))}
      </View>
    </View>
  );
};

const Button = ({ index, btnClicked, buttonStyle, setBtnClicked, type }) => {
  return (
    <TouchableOpacity
      style={[
        styles.btnWrap,
        btnClicked === index amp;amp; styles.selected,
        buttonStyle(index),
      ]}
      onPress={() => setBtnClicked(index)}>
      <Text
        style={[styles.textStyle, btnClicked === index amp;amp; styles.selectedText]}>
        {type}
      </Text>
    </TouchableOpacity>
  );
};
 

Комментарии:

1. Правильно.. Я могу использовать троичный оператор, чтобы выглядеть аккуратно. Могу ли я спросить, можно ли использовать map для кнопок ..?

2. карта выглядит аккуратно для меня. но поскольку кнопок всего три, вы могли бы также создать новый компонент и отобразить его без использования map.

3. Это то, что я сделал сначала, но проблема, с которой я столкнулся, заключалась в том, что я не мог изменить стиль кнопки, которая выбрана, поскольку нет index , если я не использую map..

4. Спасибо, но у меня есть еще один вопрос. Итак, в любом случае, мне нужно использовать map даже после создания компонента button, чтобы изменить цвет выбранной кнопки? Что делать, если есть только две кнопки, но их все равно нужно сопоставить ..?

5. Мы можем использовать условный рендеринг, где мы сравним первую и последнюю кнопки. Подождите, я покажу вам пример