Ошибка типа: undefined не является функцией (оценка userItems.map) - PullRequest
0 голосов
/ 03 мая 2018

Редактировать: теперь я использую "реагировать-родной-навигация @ последние" все в порядке.

Когда я открываю приложение в первый раз оно правильно загружает данные , но после второго обновления произошла ошибка

TypeError: undefined не является функцией (оценивает 'userItems.map')

эта ошибка находится по адресу:
в пользователях (создано Connect (Users));
....

....

Компонент / Users.js

  componentWillMount(){
    this.props.fetchUsers();
  }

  render() {
    const userItems = this.props.users || [];
    const abc = userItems.map((user,index) => (
      <Text key={index}>
      {user.email}
      </Text>
    ));
    return (
      <View>
        {abc}
      </View>
    );
  }
}
const mapStateToProps = state => ({
  users: state.UserReducer.items
})

const mapDispatchToProps = {
  fetchUsers
};


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

Действия

export function fetchUsers() {
  return dispatch => {
    fetch("http://example.com/v1/users")
      .then(res => res.json())
      .then(users =>
        dispatch({
          type: FETCH_USERS,
          payload: users
        })
      );
  };
}

редуктор / userReducer.js

import { FETCH_USERS } from "../Actions/types";

    const initialState = {
      items: []
    };

    const userReducer= (state = initialState, action) => {
        switch(action.type){
            case FETCH_USERS:
                return {
                    ...state,
                    items:action.payload
                }
            default:
                return state;
        }
    }
export default userReducer;

редуктор / index.js

import UserReducer from './userReducer';
const AppReducer = combineReducers({
  ...
  UserReducer,
  ...
  ...
  ...
});

export default AppReducer;

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

пользовательский бэкэнд

  const router = new express.Router();

  router.route("/users").get((req, res) => {
    User.find({},{password:0}, (err, users) => {
      if (err) {
        return res.status(404).send({message: "error"});
        console.log(err);
      } else {
        return res.status(200).send({users});
      }
    });
  });

ответный бэкэнд

{
    "users": [
        {
            "dateCreated": "..",
            "dateModified": "...",
            "lastLogin": "...",
            "_id": "...",
            "email": "...",
            "__v": 0
        },
        {
            "dateCreated": "..",
            "dateModified": "...",
            "lastLogin": "...",
            "_id": "...",
            "email": "...",
            "__v": 0
        }
    ]
}

package.json зависимости

 "dependencies": {
    "asyncstorage": "^1.5.0",
    "es6-promise": "^4.2.4",
    "react": "16.3.1",
    "react-native": "0.55.3",
    "react-native-vector-icons": "^4.6.0",
    "react-navigation": "v1.0.0-beta.26",
    "react-redux": "^5.0.7",
    "redux": "^3.7.2",
    "redux-logger": "^3.0.6",
    "redux-persist": "^5.9.1",
    "redux-thunk": "^2.2.0"
  },

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Если /users ответ такой:

{
    "users": [
        {
            "dateCreated": "..",
            "dateModified": "...",
            "lastLogin": "...",
            "_id": "...",
            "email": "...",
            "__v": 0
        }
    ]
}

Затем при отправке FETCH_USERS вы должны сделать это так: (обратите внимание на свойство полезной нагрузки)

export function fetchUsers() {
  return dispatch => {
    fetch("http://example.com/v1/users")
      .then(res => res.json())
      .then(data =>
        dispatch({
          type: FETCH_USERS,
          payload: data.users
        })
      );
  };
}

Или вы можете сделать это внутри редуктора (обратите внимание на свойство items):

const userReducer= (state = initialState, action) => {
    switch(action.type){
        case FETCH_USERS:
             return {
                  ...state,
                  items: action.payload.users 
             }
             default:
             return state;
    }
}
0 голосов
/ 04 мая 2018

Похоже, ваш код использует ответ-родной-маршрутизатор-поток (который имеет реакцию-навигацию в качестве зависимости) из приведенного примера кода. Существует открытая проблема с этим , указанным на github . Текущее решение этого, как обсуждалось в этом SO ответе , состоит в том, чтобы использовать версию beta26 + собственного реактивного маршрутизатора-потока. Я подозреваю, что это решит вашу проблему. Если нет, то стоит попробовать! ..

Hth ..

0 голосов
/ 03 мая 2018

Вы уверены, что отображаете свои действия в MapDispatchToProps? (В идеале этот пост будет комментарием, но у меня пока нет прав на комментарии).

const mapDispatchToProps = (dispatch) => {
    return {
        fetchUsers: () => dispatch(fetchUsers());
    };    
};
...