reactjs 通过渲染回调从嵌套组件输出中剥离React-PDF样式

smtd7mpg  于 2023-01-30  发布在  React
关注(0)|答案(1)|浏览(157)

我正尝试将共享组件传递给<View fixed>元素,但输出似乎缺少样式属性...
看起来子组件的样式被保留了,但是任何子组件都没有...
进一步的研究表明,即使对所有<View><Text>style进行硬编码,也会导致嵌套元素被剥离...
React-PDF Repl

有没有什么原因会发生这种情况?有没有办法让我把风格包括在内?

const TableHeaders = () => (
    <TableRow>
        {['name', 'age', 'location'].map(label =>
            <TableCell>{label}</TableCell>)}
    </TableRow>
);

const TableRow = ({children}) => <View style={styles.row}>{children}</View>;

const TableCell = ({children}) => (
    <View style={styles.column}>
        <Text>{children}</Text>
    </View>
);

const FixedHeader = () => <View fixed render={() => <TableHeaders />} />;

const HardcodedHeader = () => (
  <View render={() => (
      <View style={styles.row}>
        {['name', 'age', 'location'].map(label => (
          <View style={styles.column}>
              <Text>{label}</Text>
          </View>
        ))}
      </View>
  )} />
)

const HardcodedHeaderWithHardcodedStyles = () => (
  <View render={() => (
      <View style={{
        flexDirection: 'row',
        backgroundColor: 'lightblue',
        borderRadius: 4,
        margin: '2px 0',
        padding: '10px 7px'
      }}>
        {['name', 'age', 'location'].map(label => (
          <View style={{
            margin: '0 5px',
            fontSize: 10,
            color: 'red'
          }}>
              <Text>{label}</Text>
          </View>
        ))}
      </View>
  )} />
)

const Quixote = () => (
  <Document>
    <Page style={styles.body}>
      <TableHeaders />
      <FixedHeader />
      <HardcodedHeader />
      <HardcodedHeaderWithHardcodedStyles />
    </Page>
  </Document>
);

const styles = StyleSheet.create({
  column: {
    margin: '0 5px',
    fontSize: 10,
    color: 'red'
  },
  row: {
    flexDirection: 'row',
    backgroundColor: 'lightblue',
    borderRadius: 4,
    margin: '2px 0',
    padding: '10px 7px'
  },
  body: {
    paddingTop: 35,
    paddingBottom: 65,
    paddingHorizontal: 35,
  }
});

ReactPDF.render(<Quixote />);
ldioqlga

ldioqlga1#

解决!

事实证明是的,使用render ={()=〉{}}属性渲染具有子元素的元素确实会引起一些麻烦,如果您不小心的话。

边距和填充

对于Margin和Padding,我最初使用字符串格式定义值,这与我们在适当的css文件中的做法类似:

{
   [margin|padding]: '[vertical]px [horizontal]px'
}

这一定是在渲染过程中弄混了,并且被误解了。经过大量的实验,我们发现如果我们把定义分解成它们的组成部分,并且传递数值而不是字符串,那么它实际上是正确地执行的(注意:除非另有配置,否则将数字解释为"px"):

{
    marginTop: 2,
    marginBottom: 2,
    paddingTop: 10,
    paddingBottom: 10,
    paddingLeft: 7,
    paddingRight: 7
}

字体

字体有点奇怪。看起来render回调方法以某种方式将fontFamilyfontSizefontWeight等与父元素的关联从任何子元素中剥离出来。这意味着我们必须要么重新定义我们想要样式化的<Text>元素中的这些部分,或者我们可以将原始定义从它们的<View>容器向下移动到那些<Text>元素。

持续问题

我唯一无法工作的是borderRadius
∮ ∮ ∮ ∮

相关问题