別のオプションが選択されている場合に配列から来るオプションの選択を解除する方法

マーカス・ヘイナー

したがって、CardListingというカードを次のようにレンダリングするコンポーネントがあります。

return getWalletPayment.map(payment => (
  <CardListing
    key={payment._id}
    card={payment.card}
    cardNo={payment.cardNo}
    onChanged={selected => {
      this.setState({ selectedCard: selected });
    }}
  />
));

今のところ、2枚のカードをレンダリングします。1つを選択するとすべて問題ありませんが、2つ目を選択すると、もう一度タップして選択を解除するまで、最初の1つが選択されたままになります。

これが実装コードです

export default class CardListing extends Component {
  constructor(props) {
    super(props);
    this.state = {
      selected: false,
      scaleCheckmarkValue: new Animated.Value(0)
    };
    this.scaleCheckmark = this.scaleCheckmark.bind(this);
    this.selectPaymentOption = this.selectPaymentOption.bind(this);
  }

  scaleCheckmark(value) {
    Animated.timing(this.state.scaleCheckmarkValue, {
      toValue: value,
      duration: 400,
      easing: Easing.easeOutBack
    }).start();
  }

  selectPaymentOption() {
    const { selected } = this.state;
    this.setState({
      selected: !this.state.selected
    });
    this.props.onChanged(selected);
  }

  render() {
    const { selected, scaleCheckmarkValue } = this.state;
    const { card, cardNo } = this.props;
    const number = cardNo.substring(15);
    let logo;
    if (card == "visa") {
      logo = require("../../../assets/images/visa.png");
    }
    if (card == "master-card") {
      logo = require("../../../assets/images/mastercard.png");
    }
    if (card == "amex") {
      logo = require("../../../assets/images/amex.png");
    }
    if (card == "jcb") {
      logo = require("../../../assets/images/jcb.png");
    }
    if (card == "discover") {
      logo = require("../../../assets/images/discover.png");
    }
    const iconScale = this.state.scaleCheckmarkValue.interpolate({
      inputRange: [0, 0.5, 1],
      outputRange: [0.01, 1.6, 1]
    });

    const scaleValue = selected ? 1 : 0;
    this.scaleCheckmark(scaleValue);

    return (
      <View>
        <TouchableOpacity
          onPress={() => this.selectPaymentOption(this, cardNo)}
          style={styles.paymentOptionItem}
        >
          <View>
            <View
              style={{
                flexDirection: "row",
                justifyContent: "space-between"
              }}
            >
              <View style={{ flexDirection: "row" }}>
                <Image
                  source={logo}
                  style={{
                    width: 40,
                    height: 30,
                    marginTop: 3
                  }}
                />
                <View
                  style={{
                    flexDirection: "column"
                  }}
                >
                  <Text style={styles.paymentOptionTitle}>
                    {card.toUpperCase()}
                  </Text>
                  <Text style={styles.paymentOptionTitle}>Ending {number}</Text>
                </View>
              </View>
              <Animated.View
                style={[
                  { transform: [{ scale: iconScale }] },
                  styles.iconWrapper
                ]}
              >
                <Icon name="check" color={colors.black} size={20} />
              </Animated.View>
            </View>
          </View>
        </TouchableOpacity>
        <View style={styles.divider} />
      </View>
    );
  }
}

これを解決する方法はありますか?

Dacre Denny

<CardListing/>コンポーネントから「選択済み」状態を外部化して、親コンポーネントが現在選択されているクレジットカードを追跡することを検討してください(各<CardListing/>追跡内部状態を追跡して選択されているかどうかを判断するのではありません)。

まず、のselected外側を<CardListing/>親コンポーネントまで持ち上げます。これには、次のように、親コンポーネントのマップ/レンダリング機能の変更が含まれます。

/* 
Add this selectedCardId state to parent wallet component and
pass via selectedId. Also pass cardId prop so CardListing can
determine if it is the selected card
*/
return getWalletPayment.map(payment => (
  <CardListing
    key={payment._id}
    card={payment.card}
    cardNo={payment.cardNo}

    cardId={payment._id}
    selectedId={ this.state.selectedCard } 

    onChanged={selectedId => {
      this.setState({ selectedCard: selectedId});
    }}
  />
));

次に、実装修正<CardListing/>するようにselectedから取得されるthis.propsのではなくthis.state、そしてその結果cardIdを介して、選択されたカードのが戻されるonChanged()ようなのでコールバック。

selectPaymentOption() {
  /*
  Pass the id of the card to be selected to callback
  */
  this.props.onChanged( this.props.cardId);
}

render() {
  /*
  Determine if this card should be rendered a the selected 
  card
  */
  const selected = this.selectedId === this.cardId;

  /* 
  Remaining render method remains unchanged
  */
}

お役に立てれば!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このオプションが別の選択で選択されている場合に、選択でオプションを無効にする方法

分類Dev

選択された別の選択オプション(配列)に基づいて選択オプションを変更する方法は?

分類Dev

選択したオプションが他の選択オプションですでに選択されている場合にアラート

分類Dev

vuejsによって選択された別の選択オプションに基づいて選択オプションを変更する方法

分類Dev

すでに選択されている選択オプションを他の選択オプションから削除する

分類Dev

別の選択ドロップダウンの1つのオプションが選択されている場合、選択ドロップダウンリストを表示するにはどうすればよいですか。

分類Dev

同じオプションと値を持つ5つの選択がある場合、選択したオプションを別の選択タグから削除するにはどうすればよいですか?

分類Dev

すでに最初に選択されている場合は、2番目の選択からオプションを削除します

分類Dev

反応で別の選択のオプションを選択する際にオプションの選択を解除する方法

分類Dev

jspの選択タグのオプションが選択されているときにデータベースからデータを取得する方法

分類Dev

角度* ng選択タグの最後のオプションが選択されているかどうかを確認する場合

分類Dev

選択されていない場合、この選択オプションを検証するにはどうすればよいですか?

分類Dev

選択タグの「その他」オプションが選択されている場合に非表示フィールドを表示する

分類Dev

「ラジオボタン」から1つのオプションが選択されている場合、他のオプションを無効にするにはどうすればよいですか?

分類Dev

選択オプションが選択されている場合のフィルターdiv

分類Dev

別の選択でオプションが選択されたときに、あるオプションを表示/非表示にし、選択で他のオプションを表示/非表示にする方法はありますか?

分類Dev

複数選択から表示されているオプションのみを選択します

分類Dev

「その他」フィールドが選択されている場合、選択オプションをデータベースに投稿する

分類Dev

select2のallowClearオプションが選択されている場合にイベントをキャプチャする方法は?

分類Dev

ドロップダウンからオプションが選択されている場合にのみ、iframesrcに追加します

分類Dev

JAVASCRIPT/BOOTSTRAP-最初の選択のオプションに基づいて別の選択でオプションを自動選択する方法は?

分類Dev

オプションが選択されている場合、選択ドロップダウンのグループで選択オプションを無効にする

分類Dev

ある選択と別の選択からオプションを選択した場合にdiv要素を表示する

分類Dev

複数選択入力フォームのどのオプションがReactStrapから選択されているかを確認する方法

分類Dev

選択オプションタグの配列から選択した値を選択する

分類Dev

選択タグのオプションが選択されている場合、フォームフィールドを動的に追加します

分類Dev

デフォルトのオプションが選択されている場合は、「選択」にクラスを追加します

分類Dev

オプションが選択されている場合、選択ドロップダウンのグループで選択オプションを無効にします

分類Dev

別の選択オプションに基づいて表示される選択を変更し、同じオプション値を維持します

Related 関連記事

  1. 1

    このオプションが別の選択で選択されている場合に、選択でオプションを無効にする方法

  2. 2

    選択された別の選択オプション(配列)に基づいて選択オプションを変更する方法は?

  3. 3

    選択したオプションが他の選択オプションですでに選択されている場合にアラート

  4. 4

    vuejsによって選択された別の選択オプションに基づいて選択オプションを変更する方法

  5. 5

    すでに選択されている選択オプションを他の選択オプションから削除する

  6. 6

    別の選択ドロップダウンの1つのオプションが選択されている場合、選択ドロップダウンリストを表示するにはどうすればよいですか。

  7. 7

    同じオプションと値を持つ5つの選択がある場合、選択したオプションを別の選択タグから削除するにはどうすればよいですか?

  8. 8

    すでに最初に選択されている場合は、2番目の選択からオプションを削除します

  9. 9

    反応で別の選択のオプションを選択する際にオプションの選択を解除する方法

  10. 10

    jspの選択タグのオプションが選択されているときにデータベースからデータを取得する方法

  11. 11

    角度* ng選択タグの最後のオプションが選択されているかどうかを確認する場合

  12. 12

    選択されていない場合、この選択オプションを検証するにはどうすればよいですか?

  13. 13

    選択タグの「その他」オプションが選択されている場合に非表示フィールドを表示する

  14. 14

    「ラジオボタン」から1つのオプションが選択されている場合、他のオプションを無効にするにはどうすればよいですか?

  15. 15

    選択オプションが選択されている場合のフィルターdiv

  16. 16

    別の選択でオプションが選択されたときに、あるオプションを表示/非表示にし、選択で他のオプションを表示/非表示にする方法はありますか?

  17. 17

    複数選択から表示されているオプションのみを選択します

  18. 18

    「その他」フィールドが選択されている場合、選択オプションをデータベースに投稿する

  19. 19

    select2のallowClearオプションが選択されている場合にイベントをキャプチャする方法は?

  20. 20

    ドロップダウンからオプションが選択されている場合にのみ、iframesrcに追加します

  21. 21

    JAVASCRIPT/BOOTSTRAP-最初の選択のオプションに基づいて別の選択でオプションを自動選択する方法は?

  22. 22

    オプションが選択されている場合、選択ドロップダウンのグループで選択オプションを無効にする

  23. 23

    ある選択と別の選択からオプションを選択した場合にdiv要素を表示する

  24. 24

    複数選択入力フォームのどのオプションがReactStrapから選択されているかを確認する方法

  25. 25

    選択オプションタグの配列から選択した値を選択する

  26. 26

    選択タグのオプションが選択されている場合、フォームフィールドを動的に追加します

  27. 27

    デフォルトのオプションが選択されている場合は、「選択」にクラスを追加します

  28. 28

    オプションが選択されている場合、選択ドロップダウンのグループで選択オプションを無効にします

  29. 29

    別の選択オプションに基づいて表示される選択を変更し、同じオプション値を維持します

ホットタグ

アーカイブ