не могу получить доступ к данным json, используя точечную нотацию, это действительно странно

#javascript #reactjs #redux

#javascript #reactjs #сокращение

Вопрос:

Это действительно странная проблема, с которой я никогда раньше не сталкивался. Я могу ссылаться только на определенный уровень в файле JSON, используя точечную нотацию, тогда он вообще не распознается и возвращает undefined, даже если данные определенно определены.

Я вообще ничего не нашел в Интернете по этому поводу, поэтому надеюсь, что кто-то еще сталкивался с этой проблемой раньше.

Вот ссылка на один из файлов JSON, с которыми я работаю, я использовал myjson.com чтобы создать его:https://api.myjson.com/bins/revu0

Вот мой запрос данных, который работает нормально, за исключением 1 вещи.

 export const fetchPosts = () => {

return async dispatch => {
    const response = await jsonPlaceholder.get('https://api.myjson.com/bins/15iffs');

    dispatch({ type: 'FETCH_POSTS', payload: response.data.apartments })
  }
}
  

Обратите внимание, что я пишу response.data.aparmtents, это потому, что если я не напишу это здесь, я не смогу получить к нему доступ в других моих файлах.

В этом единственном файле я не могу получить доступ к .adress, он возвращает undefined. Я могу читать другие свойства, только не это.

 import './ApartmentCountTitle.css';
import React from 'react';
import { connect } from 'react-redux';
import ToolTip from '../ToolTip/ToolTip';

const ApartmentCountTitle = (props) => {
   console.log(props.apts[0].address)
  return (
    <div className="ApartmentCountTitle containerapttitle">
      <div>558 of 889 Listings In </div>
      <div className="tooltip">
        <ToolTip />
      </div>
    </div>
  );
}


const mapStateToProps = (state) => {
  return { apts: state.PostsReducer }
}

export default connect(mapStateToProps)(ApartmentCountTitle);
  

В этом другом файле я могу получить доступ к некоторым данным, которые мне нужны, но я действительно хочу получить доступ к данным на базовом уровне ответа здесь, и тоже не могу этого сделать, он также возвращает undefined. Даже точечная нотация точно такая же.

импортировать ‘./ApartmentList.css’;

 import React, { Component } from 'react';
import { connect } from 'react-redux';
import { fetchPosts } from '../../actions';
import Grid from '@material-ui/core/Grid';

class PostList extends Component {

  componentDidMount() {
    this.props.fetchPosts();
  }

  renderList() {
    if(this.props.apts) {
      return this.props.apts.map(apartment => {
        return (
          <Grid key={apartment._id} item lg={4} md={6} xs={12}> 
            <div> 
              <img style={{objectFit: 'cover'}} src={apartment.images.photos[0].path} alt="" width='100%' height="150px"/>
              <div className="containeraps">
                <div className='aptprice'>{apartment.pricing.price} €</div>
                <div className="monthutil">
                  <div>Per Month</div>
                  <div>Utilities incl.</div>
                </div>
              </div>
              <div className="movein">
                from 29.24.2019 - {parseInt(apartment.details.squareMeters)} m² - {apartment.bedroomCount} bedroom
              </div>
            </div>
          </Grid>
        )
      })
    }
  }

  render() {
    return (
      <div className='aptlist'>
        <Grid container spacing={24}>
          {this.renderList()}
        </Grid>
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return { apts: state.PostsReducer }
}

export default connect(mapStateToProps,
  {fetchPosts}
)(PostList);

import './ApartmentList.css';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { fetchPosts } from '../../actions';
import Grid from '@material-ui/core/Grid';

class PostList extends Component {

  componentDidMount() {
    this.props.fetchPosts();
  }

  renderList() {
    if(this.props.apts) {
      return this.props.apts.map(apartment => {
        return (
          <Grid key={apartment._id} item lg={4} md={6} xs={12}> 
            <div> 
              <img style={{objectFit: 'cover'}} src={apartment.images.photos[0].path} alt="" width='100%' height="150px"/>
              <div className="containeraps">
                <div className='aptprice'>{apartment.pricing.price} €</div>
                <div className="monthutil">
                  <div>Per Month</div>
                  <div>Utilities incl.</div>
                </div>
              </div>
              <div className="movein">
                from 29.24.2019 - {parseInt(apartment.details.squareMeters)} m² - {apartment.bedroomCount} bedroom
              </div>
            </div>
          </Grid>
        )
      })
    }
  }

  render() {
    return (
      <div className='aptlist'>
        <Grid container spacing={24}>
          {this.renderList()}
        </Grid>
      </div>
    );
  }
}

const mapStateToProps = (state) => {
  return { apts: state.PostsReducer }
}

export default connect(mapStateToProps,
  {fetchPosts}
)(PostList);
  

Я надеюсь, что я это ясно объясняю, это действительно странная проблема, и я совершенно в тупике. Никогда не было проблем с использованием точечной записи для доступа к данным, независимо от размера файла.

 export default (state = [], action) => {
  switch(action.type) {
    case 'FETCH_POSTS':
      return action.payload;
    default:
      return state;
  }
}
  

Комментарии:

1. Можете ли вы опубликовать код PostsReducer ?

2. просто включил это внизу

3. Можете ли вы проверить (например, в Redux dev tools), какова форма вашего хранилища после отправки?

Ответ №1:

Вы не можете получить доступ props.apts[0].address , потому что при начальной загрузке компонента в исходном состоянии reducer нет доступных данных, вы получаете данные после http-вызовов. Вы можете получить доступ к данным в PostList компоненте, потому что вы добавили условие if внутри рендеринга.

Комментарии:

1. Я добавил условие в функцию renderLIst(), но теперь данные вообще не загружаются

2. кроме того, когда я запускаю console.log(this.props.apts.data), данные отображаются, но когда я запускаю console.log(this.props.apts.data.apartments), я получаю неопределенную ошибку, даже если она определена.

3. Это странно, можете ли вы попробовать получить доступ с использованием скобочной записи this.props.apts.data[‘apartments’] . Если не работает, даже Fiddle поможет.