2017-02-20 4 views
0

Использование React Я пытаюсь передать проанализированный JSON-файл и отобразить его через объект. Однако, видя, как это объект, который я могу только отобразить объект, используя Object.keys, как показано ниже:Сопоставление объекта с дочерним компонентом в реакторе

const question = Object.keys(questions).map((data, index) => 
    <QuestionList questions={data} key={index} /> 

Однако при использовании этого я только в состоянии получить доступ к верхнему уровню моей структуры данных. Поэтому, используя этот код и передавая мой объект. Использование Object.keys() Я могу получить доступ только к «вопросам» или «q1» или типу, тексту, qId и т. Д. Я не могу передать все свойства объекта сразу и указать, что мне нужно в дочернем компоненте.

"questions": { 
    "q1": { 
     "qId": "1", 
     "type": "YN", 
     "text": "Text 1", 
     "tip": { 
     "logo": "assets/icons/gadgetz.svg", 
     "logofallback": "assets/img/gadgetz.png", 
     "heading": "Heading 1", 
     "text": "Text 2" 
     } 
    },... 

Что бы самый простой способ передать весь объект с детьми свойствами, так что я могу использовать их в качестве компонента ребенка? мне нужно использовать что-то другое, кроме реквизита?

+0

Почему вы не можете передать весь объект? –

+0

Да, вы можете передать объект в качестве типов Prop. Я думаю, проблема в том, что вы передаете значения, являющиеся путями к изображениям, что может быть проблемой, если вы используете webpack. – redconservatory

+0

Возможно, ошибка в другом месте видна, поскольку вы заявляете, что это должно работать. Причина, я думаю, что это не работает, потому что этот код: '{JSON.stringify (this.props.questions)}' возвращает только ключ "вопросы", "q1, q2, q3", или «qId, type, text» в зависимости от того, как я пропускаю объект. Если я пишу '{JSON.stringify (this.props.questions.q1)}', объект пуст. – dwigt

ответ

1
const questionObjects = Object.values(JSON.stringify(theJSONinYourQuestion)); 

const questionComponents = questionObjects.map(question => <Question qId={question.qId} />); 

В принципе, использовать Object.values вместо Object.keys, и у вас есть хороший набор вопросов, которые вы можете использовать.

Edit: если у вас нет Object.values доступны в среде (it is experimental)

const originalQuestions = JSON.stringify(theJSONinYourQuestion); 
const questionKeys = Object.keys(orginalQuestions); 
const questionObjects = questionKeys.map(key => originalQuestions[key]); 
... 
1

Вы можете сохранить доступ к объекту вопроса внутри .map, назначив его переменной вне этой сферы. Here's a jsBin с указанием идеи

const objectOfQuestions = { 
    "questions": { 
     "q1": { 
      "qId": "1", 
      "type": "YN", 
      "text": "Text 1", 
      "tip": { 
       "logo": "assets/icons/gadgetz.svg", 
       "logofallback": "assets/img/gadgetz.png", 
       "heading": "Heading 1", 
       "text": "Text 2" 
      } 
     }, 
     "q2": { 
      "qId": "2", 
      "type": "YN", 
      "text": "Text 1", 
      "tip": { 
       "logo": "assets/icons/gadgetz.svg", 
       "logofallback": "assets/img/gadgetz.png", 
       "heading": "Heading 1", 
       "text": "Text 2" 
      } 
     } 
    } 
} 

const Question = ({ id, question }) => { 
    return (
    <div> 
     <h1>Question: {id}</h1> 
     <p>id: {question.qId}</p> 
     <p>type: {question.type}</p> 
     <p>text: {question.type}</p> 
    </div> 
) 
} 

const QuestionList = ({ questions }) => { 
    const questionObj = questions; 
    return (
    <div> 
     {Object.keys(questions.questions).map((key, i) => { 
     return (
      <div key={key}> 
      <Question id={key} question={questionObj.questions[key]} /> 
      </div> 
     ); 
     })} 
    </div> 
); 
} 

ReactDOM.render(<QuestionList questions={objectOfQuestions} />, document.getElementById('app')); 
Смежные вопросы