使用 ReactJS 的 Datatables.net,在一列中渲染一个 ReactJS 组件

Posted

技术标签:

【中文标题】使用 ReactJS 的 Datatables.net,在一列中渲染一个 ReactJS 组件【英文标题】:Datatables.net with ReactJS, render a ReactJS component in a column 【发布时间】:2017-10-20 00:28:21 【问题描述】:

我有以下带有数据表的组件:

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"   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"
          
          ref="main"
        />
    )
  


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

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

问题是,对于数据表,我需要使用 react 路由器渲染链接,使用锚链接 () 不是解决方案,因为它会重新渲染整个页面。所以我需要在具有指定链接的列中呈现一个自定义组件。链接是用 ID 构建的。

【问题讨论】:

上!,需要一个答案:) 已经为此苦苦挣扎了一段时间。你找到答案了吗? 我对一个未决问题有两个多星期的相同问题,有人回答。 :( 我会把它贴在这里。如果有人知道答案,请也帮助我。在为此苦苦挣扎了一段时间后,我没有下定决心。 ***.com/questions/43927638/… 【参考方案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 元素,因此您可以直接在那里渲染 react 组件,唯一的问题是您无法渲染 Links,这是因为路由器需要一个上下文并且该上下文丢失了。所以最好的方法是使用一个方法去到具体的路由,在这种情况下goto就是从父级传递过来的this.props.router.push

【讨论】:

但是.. 你渲染的是a,而不是react路由器的链接,对吧? .你能举一个更扩展的例子吗?或者通过这里,请回答我,好吗? ***.com/questions/43927638/… 。谢谢。 链接不起作用,因为它需要一个上下文,这就是为什么你需要添加一个 onClick 事件来处理路由。 轻松处理路由,无需使用 标签,使用 react router 4+,您可以像这样重定向到其他页面: this.props.history.push( pathname: '/your_path ',状态: id: some_value );详情请参考:***.com/a/31079244/960326 @Nico 你能看看这个,不是很相似,但我被困在这里,需要一个答案:***.com/questions/53945879/…。谢谢。【参考方案2】:

也许你可以利用 ReactDOM.render。该函数接受一个组件和一个容器,因此您可以将链接初始化为空节点,并将您的道具作为数据类型。然后在 componentDidMount 中,您可以循环并调用如下所示的函数: 编辑: Link 组件需要 react 上下文隐式导航,我不认为 reactDOM.render 可以将您的上下文对象与它创建的对象相协调。最好的办法是创建一个自定义链接组件以在此处使用,该组件使用 browserHistory(react-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 节点来渲染,如下所示:

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

告诉我进展如何!

【讨论】:

我试过了,但它不起作用。我也导入了 ReactDOM:import ReactDOM from 'react-dom'; 但我收到错误 ReactDom is not defined 警告:失败的道具类型:道具toLink中标记为必填,但其值为undefined。在 Link ------ 这是由于未识别 href 属性 警告:上下文类型失败:上下文routerLink中标记为必填,但其值为undefined。 in Link ------ 不知道为什么 Uncaught TypeError: Cannot read property 'history' of undefined --- 这都没有 4.1.1。最新的。另外我在你的渲染上添加了ReactDOM.render(&lt;Link to=linkURL&gt;HELLO&lt;/Link&gt;, node);,因为链接有一个名字

以上是关于使用 ReactJS 的 Datatables.net,在一列中渲染一个 ReactJS 组件的主要内容,如果未能解决你的问题,请参考以下文章

使用 reactjs(非本机)从我的网站创建一个移动应用程序

reactjs - 如何使用nivo Rocks为reactjs添加文本以使饼图居中?

如何在 Wordpress 插件中使用 ReactJS

ReactJs 生命周期反驳

Reactjs - 正确设置内联样式

如何使用 MySQL 使用 ReactJS、NodeJS 登录?