Как отобразить другое значение из api при нажатии кнопки-переключателя в react js.?

#javascript #reactjs #api #radio-button #buttonclick

#javascript #reactjs #API #кнопка переключения #buttonclick

Вопрос:

У меня есть компонент переключателя, и я сопоставляю с ним данные API, чего я хочу, так это всякий раз, когда выбран параметр, на моем веб-сайте должны отображаться некоторые данные, скажем, какой-то текст описания. проблема в том, что данные не меняются при нажатии кнопки, они остаются неизменными для каждого выбранного параметра.

Это моя кнопка переключения, а тег p ниже — это место, где должен отображаться текст

 <input
type="radio"
title="giftCard"
value={this.state.giftCard}
name={this.props.giftDetails.variations.map(
       (e) => e.reward_text 
     )}
   onChange={(e) => {
      this.setState({ giftCard: e.target.value });
       }}
                           
    onClick={() => {
      this.props.giftDetails.variations.map(
      (e) => this.setState({ giftDescription: e.reward_description })
            )
         }}
                            
 />
<p dangerouslySetInnerHTML={{ __html: giftDescription}}/>

 

мой ответ api

 "variations": [
          {
            "variation_id": 1,
            "variation_name": "210kr",
            "price": "210",
            "reward_text": "200kr. Price",
            "reward_description": "Med et gavekort til Sendentanke.dk kan du vælge mellem gavekort til hundredevis af butikker og oplevelser ét sted."
          },
          {
            "variation_id": 2,
            "variation_name": "400kro",
            "price": "400",
            "reward_text": "400 Price",
            "reward_description": "Earn a reward"
          }
        ],
 

На картинке вы можете видеть, как добавляются переключатели и как отображается текст

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

1. Добавьте атрибут checked к типу ввода checked={this.props.giftDetails.variations.filter(v =>v.variation_name === this.state.giftCard) } примерно так.

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

3. @ShankarGaneshJayaraman я хочу установить описание награды в соответствии с нажатием кнопки радиокомпонента, я хочу отобразить описание награды в соответствии с выбранным текстом награды.

Ответ №1:

Удалить onclick , поскольку вы можете обрабатывать setState с onChange самим собой, также используйте checked атрибут для кнопки переключения и генерируйте переключатели с помощью итерации, как показано ниже.

 const Options = this.props.giftDetails.variations.map((v) => {
      return (
        <React.Fragment key={v.variation_id}>
          <input
            type="radio"
            value={v.variation_id}
            checked={v.variation_id == this.state.giftCard}
            onChange={(e) => {
              this.setState({
                giftCard: e.target.value,
                giftDescription: v.reward_description,
              });
            }}
          />
          {v.reward_text}
        </React.Fragment>
      );
    });

    return (
      <React.Fragment>
        {Options}
        <p>{this.state. giftDescription}</p>
      </React.Fragment>
    );
 
 class Hello extends React.Component {
  constructor() {
    super();
    this.state = { giftCard: null, giftDescription: null };
  }

  render() {
    console.log("this.state", this.state);
    const variants = {
      variations: [
        {
          variation_id: 1,
          variation_name: "210kr",
          price: "210",
          reward_text: "200kr. Price",
          reward_description:
            "Med et gavekort til Sendentanke.dk kan du vælge mellem gavekort til hundredevis af butikker og oplevelser ét sted.",
        },
        {
          variation_id: 2,
          variation_name: "400kro",
          price: "400",
          reward_text: "400 Price",
          reward_description: "Earn a reward",
        },
      ],
    };

    const Options = variants.variations.map((v) => {
      return (
        <React.Fragment>
          <input
            key={v.variation_id}
            type="radio"
            value={v.variation_id}
            checked={v.variation_id == this.state.giftCard}
            onChange={(e) => {
              this.setState({
                giftCard: e.target.value,
                giftDescription: v.reward_description,
              });
            }}
          />
          {v.reward_text}
        </React.Fragment>
      );
    });

    return (
      <React.Fragment>
        {Options}
        <p>{this.state.giftDescription}</p>
      </React.Fragment>
    );
  }
}

ReactDOM.render(<Hello name="World" />, document.getElementById("container")); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container">
    <!-- This element's contents will be replaced with your component. -->
</div> 

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

1. Спасибо за решение проблемы @Shankar, но проверенный реквизит не работает, он не проверяется по умолчанию, я хочу, чтобы по умолчанию был отмечен 1 параметр.

2. если вы заранее знаете идентификатор варианта по умолчанию, а затем назначаете constructor() его с this.state = { giftCard: 1, giftDescription: null }; помощью also, вы можете динамически устанавливать состояние с помощью метода жизненного цикла Rect ComponentDidMount()

3. как я могу установить для него значение checked и отобразить giftDescription эту опцию

4. вы можете установить оба состояния перед рендерингом, используя componentDidMount() {} внутри этого метода выборку API с идентификатором по умолчанию и установить состояние для карточки и описания.