【问题标题】:React iteration through object &render通过对象 &render 反应迭代
【发布时间】:2017-12-16 08:59:17
【问题描述】:
class PortfolioDetail extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      portfolio: [],
      PF: []
    };
  }

  componentWillMount() {
    var params = new URLSearchParams();

    params.append("post_id", this.props.postID);
    params.append("getportfolio", 1);

    var self = this;
    axios
      .get(this.props.dataURL, { params })
      .then(function(response) {
        self.setState({
          portfolio: {
            title: response.data[0].title,
            data: response.data
          },
          PF: response.data
        });
      })
      .catch(function(error) {});
  }

  componentDidUpdate() {

  }


  render() {
    console.log(this.state.PF);
    const portfolioQuals = Object.keys(this.state.PF).map(function(key) {
        var item = this.state.PF[key];
        console.log(key);
        return (
          <tr key={key}>
            <td>test</td>
            <td>test</td>
          </tr>
        );
    });
    return (
      <div className="container">
        <h1>
          {this.state.portfolio.title}
        </h1>
        <table className="table table-bordered table-hover">
          <thead>
            <tr>
              <th>Name</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            {portfolioQuals}
          </tbody>
        </table>
      </div>
    );
  }
}

如何遍历对象并将其呈现在下面。我的 const 坏了,什么也没显示。我已经尝试了一切——Object.keys、Object.map、for..in——没有任何帮助。我从 json 服务器得到了非常具体的响应,有人能给我一个方向吗? 这是 JSON 结构

{
0: {
"title": "Awesome title"
},
"_stp_postmeta_form_of_participation": [
  "Awesome text"
],
"_stp_postmeta_result": [
  "Awesome text "
],
"_stp_postmeta_description_of_the_event": [
  "Awesome text"
],
"_stp_postmeta_year_of_holding_receipt": [
  "09.04.2016"
],
"_stp_postmeta_type_of_event_organization": [
  "Awesome text"
],
"_thumbnail_id": [
  "116243"
],
"_stp_postmeta_document_individual": [
  "/files/portfolio/stud002240804/54524dd19f48d90c1bb0a46751f05d6b.jpg"
],
"_stp_approved_individual": [
  "1"
],
"_stp_approved_documents_education": [
  "1"
],
"_stp_approved_document_professional": [
  "1"
],
"_stp_approved_document_scientific": [
  "1"
],
"_stp_approved_documents_learning": [
  "1"
],
"_stp_approved_document_promotion": [
  "1"
],
"_stp_approved_document_publication": [
  "1"
],
"_stp_approved_document_seniority": [
  "1"
],
}

【问题讨论】:

  • 你的布局需要什么样的映射之王。
  • 像往常一样 - 键值。返回 ( {key} {value} );
  • 您对上述 JSON 响应的键和值有何期望
  • 例如 - 键 - _stp_postmeta_form_of_participation,值 - “真棒文本”
  • 关于最后一个问题,您的数组"_stp_postmeta_form_of_participation": [ "Awesome text" ], 是否包含单个元素的多个元素

标签: javascript reactjs iteration jsx


【解决方案1】:

您需要将mapObject.keys 结合使用,然后使用instanceof 检查对象值是否是一个数组,然后如果您只需要一个数组的第一个值,则返回该数组的第一个值,否则再次映射它。

class App extends React.Component {
   data = {
    0: {
    "title": "Awesome title"
    },
    "_stp_postmeta_form_of_participation": [
      "Awesome text"
    ],
    "_stp_postmeta_result": [
      "Awesome text "
    ],
    "_stp_postmeta_description_of_the_event": [
      "Awesome text"
    ],
    "_stp_postmeta_year_of_holding_receipt": [
      "09.04.2016"
    ],
    "_stp_postmeta_type_of_event_organization": [
      "Awesome text"
    ],
    "_thumbnail_id": [
      "116243"
    ],
    "_stp_postmeta_document_individual": [
      "/files/portfolio/stud002240804/54524dd19f48d90c1bb0a46751f05d6b.jpg"
    ],
    "_stp_approved_individual": [
      "1"
    ],
    "_stp_approved_documents_education": [
      "1"
    ],
    "_stp_approved_document_professional": [
      "1"
    ],
    "_stp_approved_document_scientific": [
      "1"
    ],
    "_stp_approved_documents_learning": [
      "1"
    ],
    "_stp_approved_document_promotion": [
      "1"
    ],
    "_stp_approved_document_publication": [
      "1"
    ],
    "_stp_approved_document_seniority": [
      "1"
    ],
    }
    render() {
        return (
            <table>
              {Object.keys(this.data).map((key, index) => {
                  if( this.data[key] instanceof Array) {
                  return (
                      <tr key={key}>
                         <td>{key}</td>
                         <td>{this.data[key][0]}</td>
                      </tr>
                  )
                  }
                  return null;
              })}
            </table>
        )
    }
}

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"></div>

【讨论】:

  • 什么意思?
  • 我的意思是我的意思 - 在我的代码中没有任何作用。您的解决方案可能在独立脚本中是正确的,但在我的代码中它被破坏了。无论如何 - 我自己做的,请参阅下面的答案。
【解决方案2】:

我刚刚创建了一个 JSX6 方法,并在那里实现了所有的魔法

 iterateData(json) {

    var iter = [];
    for (var key in json) {
      console.log(key);
      console.log(json[key]);
      iter.push(
        <tr key={key}>
          <td>{key}</td>
          <td>{json[key]}</td>
        </tr>
      );
    }
    return iter;
  }

return (
  <div className="container">
    <h1>
      {this.state.portfolio.title}
    </h1>
    <table className="table table-bordered table-hover">
      <thead>
        <tr>
          <th>Name</th>
          <th>Value</th>
        </tr>
      </thead>
      <tbody>
        {this.iterateData(this.state.PF)}
      </tbody>
    </table>
  </div>
);

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2021-12-25
    • 2016-06-10
    • 1970-01-01
    相关资源
    最近更新 更多