Диспетчерское действие React-Redux в компоненте - PullRequest
0 голосов
/ 25 марта 2019

Я довольно новичок, чтобы реагировать на нативную проблему, проблема, с которой я пытаюсь получить данные из действия в componentdidmount, но когда я устанавливаю свои реквизиты, данные равны нулю.Реквизиты устанавливаются, если я обращаюсь к ним в методе рендеринга.Может кто-нибудь, пожалуйста, посмотрите на код и скажите мне, что я делаю неправильно.

Ниже приведено то, где я получаю действие

export const Accountability = connect(

// inject states
(state: States) => ({

    // props.loading -> modules.app.loading
    loading: state.app.loading,
    doctorName: state.doctor.doctorName
}),

// inject actions
dispatch => ({
     doDoctors: () =>
        dispatch(actions.doctor.getDoctors())
 })
 )(AccountabilityView)

Это то место, где я его называю.

render() {
 const {loading, doDoctors, doctorName } = this.props

 // Getting the data here. 
 doDoctors()
 }

Одна вещь, которую я замечаю, это то, что я получаю предупреждение в консоли

ExceptionsManager.js: 82 Предупреждение: невозможно обновить во время существующего перехода состояния (например, в render),Методы рендеринга должны быть чистой функцией реквизита и состояния.

ОБНОВЛЕНИЕ: в настоящее время все мои файлы разделены (действие, редуктор, константы, индекс).Мое действие получает данные из вызова API.Ниже мой редуктор:

import { handleActions } from 'redux-actions'
import { LOAD_DOCTORS } from './constants'

export type DoctorState = {
doctorName: string
}

const initialState: DoctorState = {
doctorName: '',
}

export default handleActions(
{
    [LOAD_DOCTORS]: (state: DoctorState = initialState, action): DoctorState 
 => {
        const p = action.payload
        return {
            doctorName: p.doctorName,
        }
      },
   },
   initialState
)

ОБНОВЛЕНИЕ: 2 Это то, что код показывает в консоли, обратите внимание, doDoctors, который возвращает массив пуст при первом вызове.При вызове в ComponentDidMount он показывает только первое, а не второе.

ComponentDidMount

{screenProps: undefined, navigation: {…}, loading: true, doctorName: "", 
doDoctors: ƒ}

render

{screenProps: undefined, navigation: {…}, loading: true, doctorName: "", 
doDoctors: ƒ}
{screenProps: undefined, navigation: {…}, loading: true, 
doctorName: Array(10), doDoctors: ƒ}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 марта 2019

Возможные события, при которых вы могли бы вызвать action: => componentDidMount и componentWillReceiveProps ... render метод используется только для возврата некоторого jsx в зависимости от обновления вашего компонента props:

class YourComponent extends React.Component {
  componentDidMount() {
    // Here's where you call your action,
    // first time your component is loaded: <<<===
    this.props.doDoctors();
  }

  componentWillReceiveProps(nextProps) {
    // Here's where you could call your action,
    // if the component is already mounted: <<<===
    this.props.doDoctors();
  }

  render() {
    const {loading, doctorName } = this.props;

    return (
      <View>
        ...
      </View>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...