【问题标题】:how to parse loop for json in react js如何在反应js中解析json的循环
【发布时间】:2017-05-16 11:37:47
【问题描述】:

我是新来的反应。

    this.state = { histories: [
                   {
                  "qas":[
                    {"question": "hi1", "answer": "hello1"},
                    {"question": "hi2", "answer": "hello2"}

                  ]
                }
              ] };
render(){
    return ( 
      <div>
          <History 
          histories={this.state.histories} />
      </div>
    );
  }

在单独的组件页面中,我想使用react js通过循环或地图来呈现问答,但是我尝试了地图,它无法识别地图。我试过for循环,但它没有从中获取子属性。

   const history = ({histories}) => { 
     return(
          <div>
              {histories[0].qas[0].question}
          </div>
          <div}>
            {histories[0].qas[0].answer}
          </div>
      );
}

【问题讨论】:

  • map向我们展示代码
  • state.histories 上使用map,因为那是数组。

标签: javascript json reactjs ecmascript-6


【解决方案1】:

这是一个地图的例子,希望对你有所帮助。

const History = ({histories}) => {
  // Quick, hacky way to set key.
  // More on keys in React https://facebook.github.io/react/docs/lists-and-keys.html#keys
  let key = 1;
  const questionsAndAnswers = histories[0].qas.map(child =>
    <div key={key++}>
      <div>{child.question}</div>
      <div>{child.answer}</div>
    </div>
  );

  return (
    <div>{questionsAndAnswers}</div>
  );
};

class Histories extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      histories: [
        {
          "qas":[
            {"question": "hi1", "answer": "hello1"},
            {"question": "hi2", "answer": "hello2"}
          ]
        }
      ]
    };
  }

  render() {
      return(
        <div>
          <History histories={this.state.histories}/>
        </div>
      )
    }
}

ReactDOM.render(
  <Histories/>,
  document.getElementById("history")
);
<div id="history"></div>
<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>

如果您从&lt;div&gt;{questionsAndAnswers}&lt;/div&gt; 中删除“div”,那么您将收到您遇到的错误“A valid React element (or null)...”。如果要渲染多个元素,则需要将它们包装在 div 中。更多关于这个https://facebook.github.io/react/docs/jsx-in-depth.html#jsx-children

【讨论】:

  • @user2235768,如果对您有帮助,请接受答案。这将帮助其他寻找类似解决方案的人
  • @user2235768 乐于助人!
  • 再次感谢,您想看看这个反应问题吗? stackoverflow.com/questions/44023350/…
  • @user2235768 是的,但已经回答了。问题在于绑定,所以这些答案中的任何一个都是正确的。不幸的是,现在我无法在那里添加 cmets。
  • @user2235768 太好了,箭头函数中的“this”从封闭的上下文中具有其原始含义。
【解决方案2】:

它无法识别这些历史,因为我敢打赌它们在你开始时是未定义的。

const history = ({histories}) => {
  if (!histories || histories.length < 1) return (<div>nothing</div>);
  return histories.map(v => (<div>JSON.stringify(v)</div>))
}

另一个问题可能是this.state.roundshistories。在您的示例中未定义。

【讨论】:

  • 历史是通过这个,当我使用你的代码时出现错误消息:必须返回一个有效的 React 元素(或 null)。您可能返回了未定义、数组或其他一些无效对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
相关资源
最近更新 更多