Реагировать на данные заголовка столбца таблицы - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать приложение Jeopardy, используя React и React Table, и я застрял. Я пытаюсь, чтобы заголовки столбцов были заполнены фактическим названием категории из API-интерфейса безопасности. Объект, полученный из API, выглядит следующим образом:

"id": 11111,
"title": "papers",
"clues_count": 5,
"clues":

где title - название категории. Этот запрос делается 6 раз, по одному разу для каждого столбца. Прямо сейчас у меня есть «категория x», жестко запрограммированная как значение заголовка для каждого столбца. Я не могу понять, как получить заголовок в качестве заголовка столбца. Мой код ниже (я знаю, что он грязный и нуждается в рефакторинге, но я кодирую только около 6 недель, поэтому, пожалуйста, будьте терпеливы):

Компонент столбца:

import React, { Component } from 'react';
import axios from 'axios';
const CAT_NUM = function () {
  return Math.floor(Math.random() * Math.floor(18418));
}

const URL = `http://jservice.io/api/category?id=`

class Column extends Component {
  constructor(props) {
    super()

    this.state = {
      category: '',
      clues: []
    }

    this.colRef = React.createRef();
  }

  getClues = function () {
    let self = this;

    const category = CAT_NUM();
    const clueUrl = URL + category;

    const request = axios.get(clueUrl)
      .then(function (response) {

        //fetch the category title
        const categoryTitle = response.data.title;

        //get an array of all the clues for this category
        const clueArray = response.data.clues;

        //grab the first five clues -- could be modified to grab a random five, but there are 18418 categories...
        const fiveClues = clueArray.slice(0, 5);=

        //set state to contain category, five clues
        self.setState({
          category: categoryTitle.toUpperCase(),
          clues: fiveClues
        })

        if (self.props.hasOwnProperty('addColumnData')) {
          self.props.addColumnData(self.state);
        }

        //check the state
    });
  }

  render () {
    {if (this.state.clues.length === 0) {
      this.getClues();
      return (
        <div>Loading...</div>
      )
    }
  }

    return (
        <div ref={this.colRef} />
    );
  }
}

export default Column

Компонент приложения:

import React, { Component } from 'react';
import Board from './components/Board.js';
import Column from './components/Column.js';
import ReactTable from "react-table";

import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
import "react-table/react-table.css";
import "./index.css";


class App extends Component {
  constructor() {
    super()

    this.state = {hasData:false};

    this.columnData = [];

    this.addColumnData = this.addColumnData.bind(this);
    this.renderColumns = this.renderColumns.bind(this);

  }
//Create each column with dollar amounts
  columns = [
    {
      Header: 'Category 1',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    },
    {
      Header: 'Category 2',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    },
    {
      Header: 'Category 3',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    },
    {
      Header: 'Category 4',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    },
    {
      Header: 'Category 5',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    },
    {
      Header: 'Category 6',
      accessor: 'value',
      style: {
        borderRadius: "5px",
        borderColor: "black"
      }
    }
  ]
  renderColumns () {
    let columnArray = [];
    console.log('render columns fn sees: ', this);
    for (let i=0; i<6; i++) {
      columnArray.push(
        <Column addColumnData={this.addColumnData} key={i}/>
      )
    }
    console.log(this.columnData)
    // const question = this.columnData[0].clues[0].question;
    // console.log(question)
    return columnArray;
  }


  addColumnData (object) {
    this.columnData.push(object)
    if (this.columnData.length === 6) {
      this.setState({columnData: this.columnData, hasData: true})
    }
    // console.log('columnData contains: ', this.columnData)
    // return this.columnData
    }


  render() {
    const getTdProps = (state, rowInfo, column, instance) => {
      return {
        onClick: (e, handleOriginal) => {
            console.log('You clicked: ', column.Header, rowInfo.original.value)
        }
      }
    }

    if(!this.state.hasData) {
      return (
        <div>
          {this.renderColumns()}
        </div>
      )
    }
return (
  <div className="App">
    <header className="App-header">
      <h1 className="App-title">Project (in) Jeopardy</h1>
    </header>
    <Column />
    <div className="container">
      <div className="row">
        <div className="col-md-2">
          <div className="score">
            Player 1 Score: {}
          </div>
        </div>
        <div className="col-md-8" id="table">
          <ReactTable
            style={{
              height:"500px",
              textAlign:"center",
              backgroundColor: "#060CE9",
              borderRadius: "5px",
              borderColor: "#000000",
              color: "#FFCC00",
              fontSize: "20",
              verticalAlign: "middle"
            }}
            data={this.state.columnData[0].clues}
            columns={this.columns}
            defaultPageSize = {5}
            sortable={false}
            showPagination={false}
            showPageSizeOptions={false}
            getTdProps={getTdProps}
          />
        </div>
        <div className="col-md-2">
          <button type="button" className="btn btn-primary">Restart</button>
        </div>
      </div>
    </div>
  </div>
);
  }
}

export default App;

Я пойму, если никто не сможет обойти это, так как я вставил кучу кода. Извините, я действительно новичок во всем этом. Спасибо за всех, кто нашел время, чтобы помочь мне!

...