简体   繁体   English

使用地图显示 JSON 数据时在 Reactjs 中出错?

[英]Getting error in Reactjs when using map to display JSON data?

I am trying to use map() and display json data but it throws error see screenshot below.I am mapping each JSON object ans displaying it out using showslots() function.我正在尝试使用map()并显示 json 数据,但它会引发错误,请参见下面的屏幕截图。我正在映射每个 JSON 对象并使用showslots()函数将其显示出来。

data.js:数据.js:

const data = {
        "template_type": "slot_picker",
        "selection_color": "#000000",
        "secondary_color": "#808080",
        "title": "Available Slots for Dr. Sumit",
        "available_slots": [
          {
            "date": "Wed, Dec 06",
            "date_slots": [

            ]
          },
          {
            "date": "Thu, Dec 07",
            "date_slots": [

            ]
          },
          {
            "date": "Fri, Dec 08",
            "date_slots": [

            ]
          },
          {
            "date": "Sat, Dec 09",
            "date_slots": [

            ]
          },
          {
            "date": "Today",
            "date_slots": [
              {
                "hour": "8",
                "hour_slots": [
                  {
                    "08:10 AM": "slotId001"
                  },
                  {
                    "08:50 AM": "slotId005"
                  }
                ]
              },
              {
                "hour": "3",
                "hour_slots": [
                  {
                    "03:00 PM": "slotId005"
                  },
                  {
                    "03:30 PM": "slotId007"
                  }
                ]
              }
            ]
          },
          {
            "date": "Tomorrow",
            "date_slots": [

            ]
          },
          {
            "date": "Wed, Dec 13",
            "date_slots": [
              {
                "hour": "4",
                "hour_slots": [
                  {
                    "04:30 PM": "slotId105"
                  },
                  {
                    "04:50 PM": "slotId106"
                  }
                ]
              },
              {
                "hour": "5",
                "hour_slots": [
                  {
                    "05:30 PM": "slotId202"
                  },
                  {
                    "05:45 PM": "slotId208"
                  }
                ]
              }
            ]
          }
        ]
      };

 export default data;

In datapicker.js :在 datapicker.js 中:

  import React, { Component } from 'react';
import data from './data';
import './datepicker.css';

class DatePicker extends Component {

  constructor(props){
    super(props);
     this.state = {
        counter:0,
        issubmitted:false
     };
   }

  increment(){
    if(this.state.counter < 6){
      this.setState(prevState => ({counter: prevState.counter + 1}))
    }
  }

  decrement(){
    if(this.state.counter > 0){
      this.setState(prevState => ({counter: prevState.counter-1}))
   }
  }

  formsubmitted(){
    this.setState({
        issubmitted:true
    })
  }

  showslots(){
        if(data.available_slots[this.state.counter].date_slots.length === 0){
            return(
                <p>No slots</p>
                )
        }else {
            return(

                    data.available_slots[this.state.counter].date_slots.map(obj =>{

                        return (
                          <div id="slotinfo">
                           <div> <p>Hour : {obj.hour}</p> </div>
                            <div><p>slot: {obj.hour_slots[0]}</p></div>
                            <div><p>slot: {obj.hour_slots[1]}</p></div>

                          </div>
                        );
                    })
                )
        }

  }

  render() {
    return (
      <div>

        <div id="center">
        <div className="title">
            <p>Pick a Date</p>
        </div>
        <div className="increment">
          <button type="button" className="btn btn-success" id="plus" onClick={this.increment.bind(this)}>+</button>
        </div>
        <div className="display">
          <input type="text" id="date" value={data.available_slots[this.state.counter].date}/>
        </div>
        <div className="decrement">
          <button type="button" className="btn btn-danger" id="minus" onClick={this.decrement.bind(this)}>-</button> 
        </div>
        <div className="status">
          { data.available_slots[this.state.counter].date_slots.length === 0 ? 
          <p>No slots available for today</p> : <p>Slots available for today</p> }
        </div>
        <div className="submit">
          <button type="button" className="btn btn-primary" id="submit" onClick={this.formsubmitted.bind(this)}>Book Slot</button> 
        </div>
      </div>

      <div>
        {this.state.issubmitted ? this.showslots() : ''}
      </div>


      </div>
    );
  }
}

export default DatePicker;

在此处输入图片说明

Write it like this:像这样写:

hour_slots.map((el,i) => {
   let key = Object.keys(el)[0];
   return <div key={i}>{key} : {el[key]}</div>
})

Full Code:完整代码:

data.available_slots[this.state.counter].date_slots.map((obj,j) => {
    return (
        <div id="slotinfo" key={j}>
            <div> <p>Hour : {obj.hour}</p> </div>
            {
                obj.hour_slots.map((el,i) => {
                    let key = Object.keys(el)[0];
                    return <div key={i}>{key} : {el[key]}</div>
                })
            }
        </div>
    );
})

Working Snippet:工作片段:

 const data = { "available_slots": [ { "date": "Today", "date_slots": [ { "hour": "8", "hour_slots": [ { "08:10 AM": "slotId001" }, { "08:50 AM": "slotId005" } ] }, { "hour": "3", "hour_slots": [ { "03:00 PM": "slotId005" }, { "03:30 PM": "slotId007" } ] } ] }, ] } const App = props => { return <div> {data.available_slots[0].date_slots.map(obj => { return ( <div id="slotinfo"> <div> <p>Hour : {obj.hour}</p> </div> { obj.hour_slots.map((el,i) => { let key = Object.keys(el)[0]; return <div key={i}>{key} : {el[key]}</div> }) } </div> ); })} </div> } ReactDOM.render(<App />, document.getElementById('app'))
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id='app' />

consider given data,考虑给定的数据,

"hour_slots": [
                  {
                    "08:10 AM": "slotId001"
                  },
                  {
                    "08:50 AM": "slotId005"
                  }
                ]

When you say obj.hour_slots[0] ,it gives an object当你说obj.hour_slots[0] ,它给出了一个对象

{ "08:10 AM": "slotId001" }

which react jsx not understand ant not able to render it.哪个反应 jsx 不理解蚂蚁无法渲染它。

That's why you getting such error.You need to access the individual property to display slotId001 .这就是您收到此类错误的原因。您需要访问单个属性以显示slotId001

EDIT :编辑 :

As per comment given below,in order to display "08:10 AM": "slotId001" ,根据下面给出的评论,为了显示"08:10 AM": "slotId001"

eg for first element.例如对于第一个元素。

`${ Object.keys(obj.hour_slots[0])[0] } : ${data[Object.keys(obj.hour_slots[0])[0]] }`

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM