【问题标题】:Can't access JSON object information React/Redux无法访问 JSON 对象信息 React/Redux
【发布时间】:2019-12-24 18:01:21
【问题描述】:

感觉我在这里遗漏了一些明显的东西——但我不知道如何访问我的 JSON 数据。我有一个容器组件:

class About extends Component {
  componentDidMount(){
    const APP_URL = 'http://localhost/wordpress/'
    const PAGES_URL = `${APP_URL}/wp-json/wp/v2/pages`

    this.props.fetchAllPages(PAGES_URL, 'about')
  }

  render(){
    return (
      <div>
        <Header/>
        <div className="bg">
          <div className="home-wrapper">
            <h1>AAAAABBBBBOOOOUUUUUT</h1>
            <Counter/>
            <AboutInfo />
          </div>
        </div>
        <Footer/>
      </div>
    )
  }
}

const mapDispatchToProps = (dispatch) => {
  return bindActionCreators({ fetchAllPages }, dispatch)
}

export default connect(null, mapDispatchToProps)(About);

还有一个智能组件:

class AboutInfo extends Component {
  render(){
    console.log(this.props.page);
    console.log(this.props.page.id);
    return (
      <div>
        <h1>This is ID: {this.props.page.id}</h1>
      </div>
    )
  }
}

const mapStateToProps = ({ page }) => {
  return { page }
}

export default connect(mapStateToProps)(AboutInfo);

我的行动:

export const fetchAllPages = (URL, SLUG) => {
  var URLEN;

  if(!SLUG){
    URLEN = URL
  } else {
    URLEN = URL + "?slug=" + SLUG
  }

  return (dispatch) => {
    dispatch(fetchRequest());
    return fetchPosts(URLEN).then(([response, json]) => {
      if(response.status === 200){
        if(!SLUG) {
          dispatch(fetchPagesSuccess(json))
        } else {
          dispatch(fetchPageBySlugSuccess(json))
        }
      } else {
        dispatch(fetchError())
      }
    })
  }
}

const fetchPageBySlugSuccess = (payload) => {
  return {
    type: types.FETCH_PAGE_BY_SLUG,
    payload
  }
}

我的减速机:

const page = (state = {}, action) => {
  switch (action.type) {
    case FETCH_PAGE_BY_SLUG:
      console.log(action.paylod)
      return action.payload
    default:
      return state
  }
}

这给了我:

当我在 AboutInfo 组件中使用 console.log(this.props.page) 时,它会打印该对象,但是当我打印 console.log(this.props.page.id) 时,它会给我 undefined强>。为什么我不能打印 JSON 内容?谢谢!

【问题讨论】:

  • 页面似乎是一个数组。 this.props.page[0].id 怎么样?
  • @HenrikStåhlberg 然后我得到“Uncaught TypeError: Cannot read property 'id' of undefined”:(
  • 对象的截图没有显示整个对象。如果您在“AboutInfo.js:6”处扩展它,则更容易追踪问题。

标签: json reactjs redux


【解决方案1】:

页面是一个数组,因此this.props.page.idundefined。你可能想访问数组中的第一个元素,在这种情况下你会这样做

this.props.page[0].id

但您可能还需要添加测试,因为在响应可用之前,您将尝试访问 page[0].id,它可能会中断。

你可以写

this.props.page && this.props.page[0] && this.props.page[0].id

【讨论】:

  • @ShubhamKatri 当我尝试 console.log(this.props.page[0]) 或 console.log(this.props.page[0].id) 我只得到“未捕获的类型错误:无法读取未定义的属性 '0'" :(
  • 这就是我提到添加条件检查的原因
  • 但是我总是需要写“

    这是ID:{this.props.page && this.props.page[0] && this.props.page[0].id}

    " 当我想访问一个值时? @ShubhamKhatri
  • @fransBernhard,当数据最初不可用时,您需要编写条件检查。流类型在这种情况下非常有用
  • 我一直在尝试一些东西,阅读 hackernoon.com/… ,但我真的不知道如何工作 - 你能不能写一个例子?或者我会在哪里使用 Flow 类型? @ShubhamKhatri
【解决方案2】:

从存储中获取数据是异步的,所以你必须在你的 reducer 上添加加载变量

class AboutInfo extends Component {
 render(){
  if(this.props.loading) return (<div>loading</div>);
  return (
   <div>
    <h1>This is ID: {this.props.page.id}</h1>
   </div>
  );
 }
}

const mapStateToProps = ({ page, loading }) => {
 return { page, loading }
}

根据您的操作尝试返回

json.page[0]

【讨论】:

  • 当我尝试它时,我得到“Uncaught TypeError: Cannot read property '0' of undefined”:(
  • 不是 this.props.page[0].id 做 this.props.page.page[0].id
  • 感谢您的回答!当我尝试 dispatch(fetchPageBySlugSuccess(json.page[0]) 操作时,我类似地得到“Uncaught (in promise) TypeError: Cannot read property '0' of undefined”
  • 使用其中一种解决方案
  • this.props.page.page[0].id 还是一样的问题
【解决方案3】:

这是因为page 是一个数组,而id 是其第一个元素的属性。

所以使用this.props.page[0].id

如果您的屏幕截图中记录的对象是this.props.page,那么您将需要额外的.page,因为这也是对象this.props.page.page[0].id的一部分

【讨论】:

  • 感谢@Gaby 的回复,console.log(this.props.page[0].id) 和 console.log(this.props.page.page[0].id) 只是给了我“未捕获的类型错误:无法读取未定义的属性‘0’”:(
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2019-08-01
  • 2018-10-29
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多