【问题标题】:Inserting a page break into of <table> in React app在 React 应用程序中的 <table> 中插入分页符
【发布时间】:2018-10-16 17:10:57
【问题描述】:

所以基本上,我的表格有一堆子标题,我希望在这些小节之后插入一个分页符,并防止在其中一个节的中间自动分页符。大致是这样的。灰色区域是分页符之前的子标题,如果它是第 4、8、12 等小节。

我遇到的两个主要问题可能是 React 独有的,也可能不是 React 独有的。另外,我正在使用 Bootstrap。

1) &lt;div&gt; 作为&lt;table&gt;&lt;tbody&gt;&lt;thead&gt; 的子问题:

我最初的想法是在每 4 个 &lt;th&gt; 之后插入 &lt;div className='pagebreak'&gt;。这将触发错误(解释)为&lt;div&gt; cannot be a child of &lt;table&gt;/&lt;tbody&gt;/&lt;thead&gt;

因此,不允许执行以下操作:

let i = 1;

return _.map(section, s => {
    i++;
    return (
        <table>
            <tbody>
                <tr>
                    <th colSpan='6'>{s.subSectionTitle}</th>
                </tr>
                <tr>
                    <td>{s.data1}</td>
                    <td>{s.data2}</td>
                    <td>{s.data3}</td>
                    <td>{s.data4}</td>
                    <td>{s.data5}</td>
                    <td>{s.data6}</td>
                </tr>
                { i = 4 ? <div className='pagebreak'></div> : null }
            </tbody>
        </table>
    )
})

我有一些其他没有用的好主意是:

{ i = 4 ? <tr className='pagebreak'></tr> : null }

或者:

{ i = 4 ? <th><td className='pagebreak'></th></tr> : null }

或者:

{ i = 4 ? <tr><th><div className='pagebreak'></div></th></tr> : null }

虽然这些会绕过那里的错误,但它们不会做任何事情。它将忽略pagebreak

您似乎不能在 &lt;table&gt; 标记内放置任何类型的分页符。

2) 为每个小节创建一个新的&lt;table&gt;

它看起来像废话,因为列宽会因表而异,除非我将宽度设为静态,而我不想这样做。希望在保持所有列宽度相同的同时保持动态,这取决于给定列中数据点的最大宽度。

话虽如此,这确实有效,因为它实际上插入了一个分页符:

    return (
        <table>
            <tbody>
                <tr>
                    <th colSpan='6'>{s.subSectionTitle}</th>
                </tr>
                <tr>
                    <td>{s.data1}</td>
                    <td>{s.data2}</td>
                    <td>{s.data3}</td>
                    <td>{s.data4}</td>
                    <td>{s.data5}</td>
                    <td>{s.data6}</td>
                </tr>
            </tbody>
        </table>
        <div className='pagebreak'></div>
        <table>
            <tbody>
                <tr>
                    <th colSpan='6'>{s.subSectionTitle}</th>
                </tr>
                <tr>
                    <td>{s.data1}</td>
                    <td>{s.data2}</td>
                    <td>{s.data3}</td>
                    <td>{s.data4}</td>
                    <td>{s.data5}</td>
                    <td>{s.data6}</td>
                </tr>
            </tbody>
        </table>   
    )

对如何处理有什么建议吗?

【问题讨论】:

  • &lt;div className='pagebreak'&gt;&lt;/div is missing a &gt; 我认为你应该在一个包装元素中返回所有内容,而不是两个表和一个 DIV
  • 修复了标签。这就是我想做的,最好是在&lt;table&gt; 的中间,但请参阅问题1)。它不接受它。
  • 你试过用引号括起来吗? { i = 4 ? "&lt;div className='pagebreak'&gt;&lt;/div&gt;" : "" }
  • validateDOMNesting(...): Text nodes cannot appear as a child of &lt;tbody&gt; 基本上忽略了标签。

标签: html css twitter-bootstrap reactjs


【解决方案1】:

基于 Rounin 的回应,展示 React 示例中的工作原理:

@media print {

    tr {
        display: block;
    }

    .pagebreak {
        break-after: always !important;
        page-break-after: always !important;
        page-break-inside: avoid !important;
    }
}

// component.jsx
import React, { Component } from 'react';
import ReactDOM from 'react-dom';

import styles from '../assets/scss/app.scss';

class TestPrint extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data: [
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test',
                'test', 'test', 'test', 'test', 'test', 'test'
            ]
        }
    }

    renderContent() {
        let i = 0;
        return this.state.data.map((d) => {
            i++
            if (i % 10 === 0) {
                return (
                    <tr key={i} className='pagebreak'>
                        <td key={i}>{i} - {d}</td>
                    </tr>                    
                )
            } else {
                return (
                    <tr key={i}>
                        <td key={i}>{i} - {d}</td>
                    </tr>
                )
            }
        });
    }

    render() {
        return (
            <table>
                <tbody>
                    { this.renderContent() }
                </tbody>
            </table>
        )
    }
}

ReactDOM.render(<TestPrint />, document.getElementById('app'));

【讨论】:

  • 嗨,tr {display: block;} 弄乱了桌子的风格。你是怎么解决的?
【解决方案2】:

这是正确的:

&lt;div&gt; 不能是 &lt;table&gt;&lt;tbody&gt;&lt;thead&gt; 的子代

但是没有什么可以阻止您对表格进行标记和样式设置,这样您就可以经常有一行,样式为块级元素,代表分页符,在 CSS 中使用以下命令声明:

page-break-before: always;

其中包含单个无内容数据单元,使用:

<td colspan="7">

您还可以使用以下方法避免常规表格行中的分页符:

page-break-before: avoid 

工作示例:

table {
border-collapse: collapse;
}

td {
height: 12px;
padding: 6px 24px;
border: 1px solid rgb(0, 0, 0);
}

tr {
page-break-before: avoid;
}

tr.page-break {
display: block;
page-break-before: always;
}

tr.page-break td {
border: 1px solid rgba(0, 0, 0, 0);
}
<table>
<tr class="page-break">
<td colspan="7">
</tr>

<tr>
<td>A1</td>
<td>A2</td>
<td>A3</td>
<td>A4</td>
<td>A5</td>
<td>A6</td>
<td>A7</td>
</tr>

<tr>
<td>B1</td>
<td>B2</td>
<td>B3</td>
<td>B4</td>
<td>B5</td>
<td>B6</td>
<td>B7</td>
</tr>

<tr>
<td>C1</td>
<td>C2</td>
<td>C3</td>
<td>C4</td>
<td>C5</td>
<td>C6</td>
<td>C7</td>
</tr>

<tr>
<td>D1</td>
<td>D2</td>
<td>D3</td>
<td>D4</td>
<td>D5</td>
<td>D6</td>
<td>D7</td>
</tr>

<tr>
<td>E1</td>
<td>E2</td>
<td>E3</td>
<td>E4</td>
<td>E5</td>
<td>E6</td>
<td>E7</td>
</tr>

<tr>
<td>F1</td>
<td>F2</td>
<td>F3</td>
<td>F4</td>
<td>F5</td>
<td>F6</td>
<td>F7</td>
</tr>

<tr class="page-break">
<td colspan="7">
</tr>

<tr>
<td>G1</td>
<td>G2</td>
<td>G3</td>
<td>G4</td>
<td>G5</td>
<td>G6</td>
<td>G7</td>
</tr>
</table>

page-break-* 属性的进一步阅读:

https://css-tricks.com/almanac/properties/p/page-break/

【讨论】:

  • 谢谢!我花了一段时间才回到这一点,但这让我朝着正确的方向前进。我确实为 React 设置中的工作添加了一个答案,以防其他人需要它。
猜你喜欢
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多