尝试使用redux根据api数据做出条件状态

Posted

技术标签:

【中文标题】尝试使用redux根据api数据做出条件状态【英文标题】:Trying to make a conditional state based on api data using redux 【发布时间】:2021-01-21 14:32:55 【问题描述】:

我试图找出基于天气设置条件模式弹出窗口的最佳方法,来自 api 调用的响应是否为空。我最熟悉功能组件,但在这里我使用的是作为类组件构建的组件。我想知道我是否可以使用 redux 存储来设置状态,或者如果有从 api 调用返回的数据,那么显示我的UnsignedNoteModal 的最佳方式是什么,这是我需要设置条件语句的父组件:

const mapStateToProps = (state, ownProps) => 
  return 
    permissions: state.common.permissions,
    currentUser: state.common.currentUser,
    assignedFaxCount: (
      get(state.componentData, `$ASSIGNED_FAX_LIST.data.items`) || []
    ).filter((i) => !i.complete).length,
    unassignedFaxCount: (
      get(state.componentData, `$UNASSIGNED_FAX_LIST.data.items`) || []
    ).filter((i) => !i.assigned).length,
  ;
;

const mapDispatchToProps = (dispatch) => ();

class ProviderDashboard extends Component 
  constructor(props) 
    super(props);
    this.state =  unsignedNote: true ;
    this.toggle = () => this.setState( unsignedNote: false );
  

  unassignedFaxList() 
    return (
      <DashboardFaxList
        title="Faxes to forward"
        getItems=api.Faxes.unassignedFaxes
        currentUser=this.props.currentUser
        listName=UNASSIGNED_FAX_LIST
        viewMode=FAX_VIEW_MODE_ASSIGN
        count=this.props.unassignedFaxCount
      />
    );
  

  assignedFaxList() 
    return (
      <DashboardFaxList
        title="Faxes to address"
        getItems=api.Faxes.assignedFaxes
        currentUser=this.props.currentUser
        listName=ASSIGNED_FAX_LIST
        viewMode=FAX_VIEW_MODE_COMPLETE
        count=this.props.assignedFaxCount
      />
    );
  

  render() 
    const canManage = hasPermission(this.props.permissions, PERMISSION_MANAGE);
    const canSeePatients = hasPermission(
      this.props.permissions,
      PERMISSION_SEE_PATIENTS
    );

    return (
      <div>
        this.state.unsignedNote && (
          <UnsignedNoteModal
            onSubmit=this.toggle
            getList=api.Encounters.unsignedEncounters((e) => e)
            
          />
        )
        <NavBar />
        <div className="dashboard-container">
          <h4>
            " "
            <div className="header-icon float-left">
              <DashboardIcon />
            </div>" "
            Dashboard" "
          </h4>
          <Row>
            <Col md= size: 8 ></Col>
            <Col md= size: 4 >
              canSeePatients && <PrescriptionErrors />
              canManage && this.unassignedFaxList()
              (canSeePatients || canManage) && this.assignedFaxList()
            </Col>
          </Row>
        </div>
      </div>
    );
  


export default connect(
  mapStateToProps,
  mapDispatchToProps
)(ProviderDashboard);

现在我在此组件设置中有状态来显示我一直在构建的模式,但我需要更改它以仅显示我在 UnsignedNoteModal 中发送的 api 调用是否返回 null 以外的其他内容。我不确定处理这个问题的最佳途径是什么,任何关于从哪里开始或如何解决这个问题的见解都会很棒。

【问题讨论】:

使用“getDerivedStateFromProps”从您从 API 收到的道具中更新“this.state.unsignedNote”。 reactjs.org/docs/… 【参考方案1】:

您可以使用“getDerivedStateFromProps”从道具更新您的状态。您需要根据您的 API 数据在“mapStateToProps”中将“unsignedNote”设置为“false/true”。

static getDerivedStateFromProps(nextProps, prevState) 
    const 
      unsignedNote = false, // Default value is false
     = nextProps;
    const 
      unsignedNote: unsignedNoteInState = false, //Default value is false
     = prevState;

    if(unsignedNote & unsignedNote !== unsignedNoteInState) 
      return 
        ...prevState,
        unsignedNote,
      
    
    return prevState;
  

【讨论】:

感谢您的回复!我理解为什么你会说使用“getDerivedStateFromProps”从道具更新你的状态。我试图弄清楚如何在我的 mapStateToProps 函数中将未签名的注释设置为真/假。我应该在 mapStateToProps 函数中进行 api 调用吗?喜欢unsignedNote: if(api.Encounters.unsignedEncounters === null) unsignedNote === false...etc @CourtneyJ,所以流程是这样的,1. 你调用一个动作来进行 API 调用,2. 动作使用 Reducers 更新 Redux 存储并从 API 响应(可能有数据或没有数据) , 3. 您将在“状态”中获取该数据作为“mapStateToProps”的参数。 4. 写unsignedNote: unsignedEncounters ? false : true,之类的逻辑。 (如果它是一个检查对象是否为空的数组,则可以根据 unsignedEncounters 的长度编写逻辑)。

以上是关于尝试使用redux根据api数据做出条件状态的主要内容,如果未能解决你的问题,请参考以下文章

Redux:如何根据其他状态创建状态?

如何在不改变状态的情况下对 redux 操作做出反应

使用redux,如何避免在进行新的API调用之前渲染旧的状态数据?

有条件的 Redux reducer 使用

如何使用 redux 模式在 react native 中刷新组件?

Preact 使用 Storeon 进行状态管路