Подтвердить что ты не робот

Datatables.net с помощью ReactJS, создайте компонент ReactJS в столбце

i имеет следующий компонент с datatables:

import React, { Component } from 'react'
import { Link } from 'react-router'


import { PanelContainer, Panel, PanelBody, Grid, Row, Col } from '@sketchpixy/rubix'

import $ from 'jquery'
import DataTable from 'datatables.net'

$.DataTable = DataTable

const columns = [{
  title: '<input type="checkbox" />',
  data: 'check',
}, {
  title: 'Foto',
  data: 'avatar',
}, {
  title: 'Nombre',
  data: 'name',
}, {
  title: 'Dirección',
  data: 'address',
}, {
  title: 'Clasificación',
  data: 'clasification',
}, {
  title: 'Editar',
  data: 'editLink',
  render: x => `<a href="${x}"><i class="icon-fontello-edit"></i></a>`, // <-- this line i'm interested!
}]

class Table extends Component {
  transform(content) {
    return content.map(x => ({
      ...x,
      check: '<input type="checkbox" />',
      avatar: '<img src="/public/imgs/app/nico.jpg" width="40" height="40" style="border-radius: 100%;">',
      clasification: `<i class="${x.clasification.icon}"></i> ${x.clasification.name}`,
    }))
  }

  componentDidMount(nextProps, nextState) {
    this.table = $(this.refs.main).DataTable({
      dom: '<"data-table-wrapper"tip>',
      data: [],
      columns,
      language: {
        info: 'Mostrando _START_-_END_ de _TOTAL_ puntos',
        infoEmpty: 'No hay puntos',
        paginate: {
          next: 'Siguiente',
          previous: 'Anterior',
        },
      },
    })
  }

  componentWillUpdate() {
    this.table.clear()
    this.table.rows.add(this.transform(this.props.data))
    this.table.draw()
  }

  componentWillUnmount() {
    $('.data-table-wrapper')
    .find('table')
    .DataTable()
    .destroy(true)
  }

  render() {
    return (
        <table
          className="table table-striped hover"
          cellSpacing="0"
          width="100%"
          ref="main"
        />
    )
  }
}

export default p =>
  <PanelContainer>
    <Panel>
      <PanelBody>
        <Grid>
          <Row>
            <Col xs={12}>
              <Table data={p.data} />

            </Col>
          </Row>
        </Grid>
      </PanelBody>
    </Panel>
  </PanelContainer>

Проблема в том, что с datatables мне нужно отобразить Link с помощью реагирующего маршрутизатора, использование anchorlink() не является решением, потому что оно будет повторно отображать всю страницу. Поэтому мне нужно отобразить пользовательский компонент в столбце с указанной ссылкой. Ссылка построена с идентификатором.

4b9b3361

Ответ 1

Я отвечу на свой вопрос для других разработчиков. Я сделал следующее:

columnDefs: [{
  targets: 5,
  createdCell: (td, cellData, rowData, row, col) =>
    ReactDOM.render(
      <a style={{ cursor: 'pointer' }}
        onClick={() => this.props.goto(cellData) }>
        <i className="icon-fontello-edit"></i>
      </a>, td),
} // ... the rest of the code

Метод createdCell получает фактический элемент dom, поэтому вы можете визуализировать компонент реакции непосредственно там, единственная проблема заключается в том, что вы не можете отображать ссылки, потому что маршрутизатору нужен контекст, и этот контекст потерян. Поэтому лучший способ - использовать метод для перехода к определенному маршруту, который в этом случае goto есть this.props.router.push, переданный из родителя.

Ответ 2

Возможно, вы могли бы использовать ReactDOM.render. Функция принимает компонент и контейнер, поэтому вы можете инициализировать свои ссылки как пустые узлы с помощью реквизита в качестве типов данных. Затем в componentDidMount вы можете выполнить цикл и вызвать функцию, которая выглядит так: edit: компонент Link требует, чтобы контекст реагирования коснулся неявно, и я не думаю, что responseDOM.render примиряет ваш объект контекста с тем, который он создает. Лучше всего было бы создать компонент пользовательской ссылки, который будет использоваться здесь, где используется браузерHistory (response-router v3) или только библиотека истории для навигации.

componentDidMount() {
 function populateLinks(node) {
   const linkURL = node.dataset.linkURL;
   reactDOM.render(<Link to={linkURL}>Hello</Link>, node);
  }
$('.link-div').get().forEach(populateLinks);
}

Похоже, вы бы указали конкретный dom node, чтобы сделать что-то вроде этого:

$('#example').dataTable( {
  "columnDefs": [ {
    "targets": 0,
    "data": "download_link",
    "render": function ( data, type, full, meta ) {
      return `<div class="link-div" data-linkURL=${data}></div>`;
    }
  } ]
} );

Сообщите мне, как это происходит!