javascript - 如何更改在 React 中动态创建的 div 中的值

标签 javascript reactjs api

我有一些数据存储在组件状态 Prop 中名为 cards 的数组中。 当我从 API 获取数据时,我将结果放入该数组中,对于数组的每个元素,我使用相应元素的数据渲染 a 。该数据的属性之一称为数量,它始终从 1 开始。

问题是,在该 div 上,我想增加或减少每个单独元素的值,但我不知道如何操作。我知道的唯一方法是使用 this.setValue() 更改状态属性中的值,但这是在组件属性中,而不是数组的单个元素。

那么如何在不使用 setState() 的情况下更新动态生成的 div 的值?

这是我的div。当我点击按钮时什么也没有发生。控制台上也没有显示任何内容。

enter image description here

这是我的数组定义:

constructor(props) {
    super(props);
    this.state = {
        value: '',
        list: [],
        cards: [],//this will store the data from the API
    };
    this.handleChange = this.handleChange.bind(this);
}

这是将 GET 请求的结果插入到我的 cards 数组中的函数:

searchCard = () => {
    const response = axios.get("https://api.scryfall.com/cards/search?q=".concat(this.state.value)).then(result => {
        let cardsArray = [];            
        result.data.data.map((element) => {
            element.quantity = 1;
            cardsArray.push(element)
        });
        this.setState({ cards: cardsArray });
        console.log(this.state.cards);
    }).catch(error => console.log(error));
}

这是我自动生成的 div:

addCardToPool = (element) => {
    if (element.quantity <= 3) {
        element.quantity += 1;
    }

}
removeCardFromPool=(element) => {
    if (element.quantity >= 1) {
        element.quantity -= 1;
    }
}
<div className="card-thumbnail-container">                    
                {this.state.cards.length > 0 ? //if the cards array is not empty
                    this.state.cards.map((element, key) =>
                        <div className="card-thumbnail" key={key}>
                            <div className="card-image"><img src={element.image_uris.normal} /></div>
                            <div className="quantity buttons">
                                <button className="button is-small is-danger" onClick={this.addCardToPool(element)}>Rem.</button>
                                <div><button className="button is-success is-info">Add: {element.quantity}</button></div>
                                <button className="button is-small is-info" onClick={this.removeCardFromPool(element)}>Add.</button>
                            </div>
                        </div>
                    )
           :<div></div>}
    </div>

最佳答案

React 的一个经常被忽视的功能是您可以从其他组件构建组件,这个概念称为组合。

因此,在您的示例中,不要尝试在一个组件中完成所有操作,而是将其拆分为 2 个组件。可能称为 CardsCard

这样做的优点是 Card 将拥有自己的状态,因此维护更新变得微不足道。

下面是一个例子,它使用了 Hooks,但是如果你使用组件方法,同样的概念也适用。我还添加了一个假装的远程数据库获取,然后将显示一条请等待消息。

const {useState, useEffect} = React;

//pretend async get cards
function getCards() {
  return new Promise((r, x) => {
    setTimeout(() => {
      const cards = [
        {name:'one', qty: 1},
        {name:'two', qty: 1},
        {name:'three', qty: 1}
      ]
      r(cards);
    }, 500);
  });
}

function Card(props) {
  const [card, setCard] = useState(props.card);
  function btAdd(value) {
    return () => {
      const newQty = card.qty + value;
      if (newQty < 1 || newQty > 4) return;
      setCard({...card, qty: newQty});
    }
  }
  return <div>
    <button onClick={btAdd(-1)}>-</button>
    <div style={{margin: "0 10px", width: "70px", display: "inline-block"}}>
      {card.name} = {card.qty}</div>
    <button onClick={btAdd(+1)}>+</button>
  </div>;
}

function Cards() {
  const [cards, setCards] = useState([]);
  useEffect(() => {
    getCards().then(c => setCards(c));
  }, []);
  return cards.length
    ? cards.map((card, ix) => 
      <Card key={ix} card={card}/>)
    : <div>Loading please wait..</div>;
}


ReactDOM.render(<Cards/>, document.querySelector('#mount'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="mount"></div>

关于javascript - 如何更改在 React 中动态创建的 div 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234145/

相关文章:

javascript - Meteor,如何修复 npm 包

javascript - 如何配置 dxFileUploader 像一个简单的按钮一样显示?

javascript - 如何知道 jQuery $([CSS Selectors]) 方法中查询的选择器是什么

reactjs - 类型错误:无法在主机组件上调用 ShallowWrapper::dive()

javascript - 股票市场 API Node.JS

javascript - 如何使用 opencv_contrib 构建自定义 opencv.js

reactjs - React useEffect 钩子(Hook)依赖于第二个效果

reactjs - 用 Jest 测试 onChange 事件

json - 规范化 JSON API 标准 v1

java - Retrofit 需要太多时间才能得到响应