React/Redux 调用一排卡片

Posted

技术标签:

【中文标题】React/Redux 调用一排卡片【英文标题】:React/Redux calls for a row of cards 【发布时间】:2018-08-15 03:56:47 【问题描述】:

我正在创建一排 10 张卡片。每张卡都需要调用自己的 API 来获取演绎 url。我将如何使用 React/Redux 实现这一目标?

下面是我的 React Card 组件。我循环这个组件 10 次,每次都使用不同的cardId,卡片用来调用 API 来获取图像 url。

import React, Component from 'react';
import connect from 'react-redux';
import fetchRendition from '../../../actions/RenditionAction';


class Card extends Component 

    componentDidMount() 
      // action call to fetch rendition for card
      this.props.fetchRendition(this.props.cardId);
    


    render() 
       return (
          <div className='card'>
             <div className='card-image-container'>
                <div className='card-image' style = backgroundImage: `url($this.props.rendition.url)`/>
            </div>
         </div>
      );
    


function mapStateToProps(state) 
  return rendition: state.card 


export default connect(mapStateToProps, fetchRendition)(Card);

循环通过此卡片组件如下所示:

import React, Component from 'react';

 class RowOfCards extends Component 

    render() 
      const ArrayOfIds = ['id1', 'id2', 'id3', 'id4','id5', 'id6', 'id7', 'id8'. 'id9', 'id10']
      return ArrayOfIds.map((id) => <Card cardId = id/>))
   


export default RowOfCards;

现在,通过此实现,所有 10 张卡片最终都具有相同的图像。预期的行为是每张卡片应该有不同的图像。在每张卡片调用 API 后,如何让卡片更新为自己的图像?

【问题讨论】:

渲染所有 10 张卡片的循环代码在哪里?你也可以添加吗? @mindaJalaj 我更新了一个循环的例子 你也可以分享 fetchRendition 的代码吗?到目前为止,您提到的任何内容似乎都是正确的,对于每个 cardid fetchRendition,现在您存储此响应的方式很重要 【参考方案1】:

您似乎正在用更新的图像替换reducer 中获取的图像,并且由于您的reducer 中只有一个rendition 图像,因此所有卡都使用相同的图像。

对于您的用例,似乎不需要redux,您需要将图像存储在Card组件状态,除了Card组件之外没有人知道自己的图像。

export default class Card extends Component 
    state = 
      rendition: 
    
    componentDidMount() 
      // action call to fetch rendition for card
      fetchRendition(this.props.cardId).then((res) =>   // make an api call and store the response in state and not in redux store
        this.setState(rendition: res)
      );
    


    render() 
       return (
          <div className='card'>
             <div className='card-image-container'>
                <div className='card-image' style = backgroundImage: `url($this.state.rendition.url)`/>
            </div>
         </div>
      );
    

Redux 的作者@dan_abramov,在You might not need redux 上写了一篇文章。请看一下

【讨论】:

很高兴它有帮助,请仔细阅读@dan_abramov 的文章。【参考方案2】:

根据您的代码,您似乎只在减速器中存储了一个“卡片”对象。您应该将其存储为“卡片”对象的数组。

我假设你的减速器看起来像这样

const card = (state = null, action) => 
  switch(action.type) 
    case 'STORE_CARD':
      return 
        action.payload.data
      ,
    ...
  

如果上述情况属实,每个动作都会覆盖卡片对象。相反,将卡片对象数据存储为以 cardId 作为键的对象列表,如下所示:

const cards = (state = null, action) => 
  switch(action.type) 
    case 'STORE_CARDS':
      return 
        ...state,
        [action.payload.data.cardId]: action.payload.data
      ,
    ...
  

然后,在你的组件中:

render() 
   return (
      <div className='card'>
         <div className='card-image-container'>
            <div className='card-image' style = backgroundImage: `url($this.props.rendition[this.props.cardId].url)`/>
        </div>
     </div>
  );

【讨论】:

以上是关于React/Redux 调用一排卡片的主要内容,如果未能解决你的问题,请参考以下文章

[codevs1743]反转卡片

codevs 1743 反转卡片

趣味字母卡片-拼多多笔试题

趣味字母卡片-拼多多笔试题

Splay复习

React-Native + Redux 将 ID 传递给组件