проблемы с массивом объектов из переменной в React render methodq

#javascript #reactjs #datatable

#javascript #reactjs #datatable

Вопрос:

** Я определил одну постоянную переменную blog из состояния в начале метода рендеринга. Он содержит массив объектов, которые выводятся на консоль, а затем передаются в DataTable качестве options.data реквизита.**

 import React, {Component} from "react";
import axios from "axios";
//import { WidgetGrid } from "../../../common/widgets/components";
import { Stats } from "../../../common/layout/components";
import { BigBreadcrumbs } from "../../../common/navigation";
import {
    WidgetGrid,
    JarvisWidget
} from "../../../common";
import Datatable from "../../../common/tables/components/Datatable";


export default class AllBlogs extends Component {

    state = {
        blogs: []
    }


    componentDidMount() {
        this.setState(() => ({blogs:[
            {
                "title":"Всемогущая функция Query — подробное руководство",
                "author":1,
                "viewers":213
            },
            {
                "title":"Всемогущая функция Query — подробное руководство",
                "author":1,
                "viewers":213
            }
        ]

        }))

    }



    render() {
        const {blogs} = this.state;
        console.log(this.state.blogs);
        return (

            <div id="content" className="animated fadeInUp">
                <WidgetGrid>
                    <div className="row">
                        <article className="col-sm-12">
                            <JarvisWidget id="wid-id-0" editbutton={false} color="darken">
                                <header>
                  <span className="widget-icon">
                    <i className="fa fa-table"/>
                  </span>
                                <h2>Standard Data Tables</h2>
                                </header>

                                <div>
                                    <div className="widget-body no-padding">

                                        <Datatable

                                              options={{
                                               data: {blogs},
                                               columns: [
                                                    {data: "title"},
                                                    {data: "author"},
                                                    {data: "viewers"},
                                             ]
                                            }}


                                            paginationLength={true}
                                            className="table table-striped table-bordered table-hover"
                                            width="100%"
                                        >
                                            <thead>
                                            <tr>
                                                <th data-hide="phone">Picture</th>
                                                <th data-hide="phone">Title</th>
                                                <th data-class="expand">
                                                    <i className="fa fa-fw fa-user text-muted hidden-md hidden-sm hidden-xs" />
                                                    Viewers
                                                </th>
                                                <th data-hide="phone">
                                                    <i className="fa fa-fw fa-phone text-muted hidden-md hidden-sm hidden-xs" />
                                                    Author
                                                </th>

                                            </tr>

                                            </thead>


                                        </Datatable>
                                    </div>
                                </div>
                            </JarvisWidget>
                        </article>
                    </div>
                </WidgetGrid>
            </div>
        );

    }
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>  

Это то, что console.log отображает:
http://prntscr.com/myzbz0

У меня есть этот массив объектов, и он отлично работает, если я вручную передаю его в options.data переменную в методе рендеринга.

 [
  {
    "title":"Всемогущая функция Query — подробное руководство",
    "author":1,
    "viewers":213
  },
  {
    "title":"Всемогущая функция Query — подробное руководство",
    "author":1,
    "viewers":213
  }
]
  

Почему ручная передача массива объектов сработала, а передача массива объектов из blog переменной не сработала? Есть идеи?

Это код компонента с возможностью обработки данных

     import React from "react";

import $ from "jquery";

require("datatables.net-bs");
require("datatables.net-buttons-bs");
require("datatables.net-buttons/js/buttons.colVis.js");
require("datatables.net-buttons/js/buttons.flash.js");
require("datatables.net-buttons/js/buttons.html5.js");
require("datatables.net-buttons/js/buttons.print.js");
require("datatables.net-colreorder-bs");
require("datatables.net-responsive-bs");
require("datatables.net-select-bs");

export default class Datatable extends React.Component {
  componentDidMount() {
    this.datatable(this.props.data);
  }

  datatable() {
    const element = $(this.refs.table);
    let { options } = { ...this.props } || {};

    let toolbar = "";
    if (options.buttons) toolbar  = "B";
    if (this.props.paginationLength) toolbar  = "l";
    if (this.props.columnsHide) toolbar  = "C";

    if (typeof options.ajax === "string") {
      let url = options.ajax;
      options.ajax = {
        url: url,
        complete: function(xhr) {
          // AjaxActions.contentLoaded(xhr)
        }
      };
    }

    options = {
      ...options,
      ...{
        dom:
          "<'dt-toolbar'<'col-xs-12 col-sm-6'f><'col-sm-6 col-xs-12 hidden-xs text-right'"  
          toolbar  
          ">r>"  
          "t"  
          "<'dt-toolbar-footer'<'col-sm-6 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-6'p>>",
        oLanguage: {
          sSearch:
            "<span class='input-group-addon input-sm'><i class='glyphicon glyphicon-search'></i></span> ",
          sLengthMenu: "_MENU_"
        },
        autoWidth: false,
        retrieve: true,
        responsive: true
      }
    };

    const _dataTable = element.DataTable(options);

    if (this.props.filter) {
      // Apply the filter
      element.on("keyup change", "thead th input[type=text]", function() {
        _dataTable
          .column(
            $(this)
              .parent()
              .index()   ":visible"
          )
          .search(this.value)
          .draw();
      });
    }

    if (!toolbar) {
      element
        .parent()
        .find(".dt-toolbar")
        .append(
          '<div class="text-right"><img src="assets/img/logo.png" alt="SmartAdmin" style="width: 111px; margin-top: 3px; margin-right: 10px;"></div>'
        );
    }

    if (this.props.detailsFormat) {
      const format = this.props.detailsFormat;
      element.on("click", "td.details-control", function() {
        const tr = $(this).closest("tr");
        const row = _dataTable.row(tr);
        if (row.child.isShown()) {
          row.child.hide();
          tr.removeClass("shown");
        } else {
          row.child(format(row.data())).show();
          tr.addClass("shown");
        }
      });
    }
  }

  render() {
    let {
      children,
      options,
      detailsFormat,
      paginationLength,
      ...props
    } = this.props;
    return (
      <table {...props} ref="table">
        {children}
      </table>
    );
  }
}
  

Комментарии:

1. Будет лучше, если вы поместите этот код в codesandbox, чтобы другие могли проверить

2. Можете ли вы добавить версию метода рендеринга, в которой вы передаете объекты напрямую? (Возможно, лучше всего показать, что код в codesandbox .)

3. Извините, у меня ошибки в codesandbox, и я не знаю, как их исправить, пожалуйста, помогите мне

4. Используете ли вы библиотеку для вашего datatable? Можете ли вы показать код вашего компонента Datatable?

5. Я показываю компонент datatables в своей задаче, спасибо

Ответ №1:

Поскольку блоги будут неопределенными для первоначального рендеринга

     <Datatable

       options={{
       data: {blogs amp;amp; blogs},
       columns: [
       {data: "title"},
        {data: "author"},
        {data: "viewers"},
      ]
 }}