Реагируйте: у меня есть компонент, который отображает пользовательские данные, и я хочу отобразить сообщение об ошибке под разделом, если есть ошибка рендеринга данных - PullRequest
0 голосов
/ 24 мая 2019

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

User Info Component
import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'
import {
  Col,
  Row,
  Input,
  Checkbox
} from 'antd'


const CustomerDetails = ({ customer }) =>
  !!Object.keys(customer).length && (
    <Container>
      <h2>
        {/* Name */}
        Test Test
      </h2>
      <Row>
        <Col span={8}>
          <Ul>
            <h3><strong>Primary Contact</strong></h3>
            <li>Jane Doe</li>
            <li>212-333-3333</li>
          </Ul>
        </Col>
        <Col span={8}>
          <Ul>
            <h3><strong>Service Address</strong></h3>
            <li>1234 Stone Ave N</li>
            <li>STE FR6</li>
            <li>Seattle, WA 12345</li>
          </Ul>
        </Col>
        <Col span={8}>
          <Ul>
            <h3><strong>Billing Address</strong></h3>
            <li>1234 Stone Ave N</li>
            <li>STE FR6</li>
            <li>Seattle, WA 12345</li>
          </Ul>
        </Col>
      </Row>
      <br />
      <Row>
        <Col span={10}>
          <h4>PRIMARY CONTACT EMAIL</h4>
        </Col>
      </Row>
      <Row>
        <Col span={8}>
          <StyledInput />
        </Col>
        <Col span={12}>
          <StyledCheckbox /> EMAIL OPT OUT
        </Col>
      </Row>
      <br />
      <Row>
        <Col>
          <StyledCheckbox /> TAX EXEMPT
        </Col>
      </Row>
      <br />
      <Row>
        <Col>
          <h4>GO TO BUNDLE BUILDER</h4>
        </Col>
      </Row>
    </Container>
  )

CustomerDetails.propTypes = {
  customer: PropTypes.object
}

CustomerDetails.defaultProps = {
  customer: {}
}

const Container = styled.div`
  margin: 15px 5px;
`
const StyledCheckbox = styled(Checkbox)`

`
const StyledInput = styled(Input)`
  max-width: 75%;
`
const Ul = styled.ul`
  list-style-type: none;

  li {
    font-size: 1rem;
  }
`

export default CustomerDetails
API service to fetch user data
import Axios from 'axios'
import { logError } from './logging'

export async function getCustomer(customer = {}) {
  try {
    const { customerId } = customer
    console.info('Customer ID:', customerId)

    const { data } = await Axios.get('https://getUserInfoAPI.com')

    return new Promise(res => {
      setTimeout(() => res(data), 3000)
    })
  } catch (error) {
    logError(error)
    throw error
  }
}

1 Ответ

1 голос
/ 25 мая 2019

Как / Где вы делаете вызов API и передаете его в свой компонент?В React есть новый API-интерфейс ловушек, который позволяет вам использовать компоненты, основанные на функциях, для большинства вещей, но, похоже, вы новичок в реакции, и дихотомия между компонентами класса и функции может быть полезной для вас, когда вы начинаете.А пока подумайте об этом так:

  • Функциональные компоненты: немой.просто берет данные и отображает их.
  • Компоненты класса (или компоненты функций с перехватчиками): визуализируют данные, но также имеют свое собственное состояние и методы жизненного цикла

Так как яуверен, что вы понимаете, важно не только иметь способ получения данных и рендеринга данных, но также важно иметь способ управления состоянием.Например, вам нужно место, где вы можете хранить данные и обращаться к ним позже, или, возможно, указывать информацию о состоянии, такую ​​как «загрузка» (t / f) или «ошибка» (t / f).

Еще одна полезная концепцияявляется компонентным составом.Мы будем использовать компонент более высокого порядка, который сейчас обрабатывает вызов API (есть более сложные решения с такими библиотеками, как redux / redux-sagas и т. Д.), И условно отображает таблицу или сообщение об ошибке.

class MyComponent extends react.Component {
  constructor(props){
    super(props);
    this.state = {
      loading: false,
      error: false,
      data: {}
    }
  }

  //this is just a utility function so that you can use async / await with setState
  setStateAsync(state) {
    return new Promise((resolve) => {
      this.setState(state, resolve)
    });
  }

  //will run after your component is mounted to the dom
  async componentDidMount() {
    try{
      await this.setStateAsync({...this.state, loading: true})
      let data = await getCustomer();
      await this.setStateAsync({...this.state, loading: false, data})
    } catch(e) {
      this.setState({error: true, loading: false, data: {}})
    }
  }

  //stick what you would normally return in a function component here
  render() {
    return (
      {this.state.loading ? (<div>"...loading"</div>) :
         this.state.error ? (<div style={{color: 'red'}}>ERROR!</div> :
         (<CustomerDetails customer={this.state.data} />)
    )
  }
}

Прочитайте это для получения дополнительной информации о компонентах класса.Приведенный выше пример довольно прост, но обратите внимание, что:

  1. Существует локальное состояние
  2. Компонент выполняет рендеринг на основе как реквизита, так и локального состояния
  3. Оператор return обертыванияJavaScript в {}.Это включает в себя несколько троичных, чтобы условно определить, что визуализировать.Вы можете заменить сценарии загрузки и ошибок более детализированными компонентами, которые вы можете определить где угодно, в зависимости от ваших стилистических потребностей.
...