2

我们有一个用于span标签的自定义渲染器,但我找不到任何方法来强制跨度为全角。我尝试将自定义渲染器包装在 aView中,并在没有运气的情况下应用所有常用的 React-Native 样式。

给定输入 HTML,如下所示

<span>Hello</span><span>Goodbye</span>

我们如何渲染它如下?

Hello     
goodbye 

目前它呈现内联,如:

hello goodbye


自定义渲染器如下所示:


const renderers = {
  span: RenderedSpan,
};

const RenderedSpan = props => {
  return (
      <Text>
        Some hardcoded text
      </Text>
  );
};

当我遇到一个例子时,我想我终于找到了解决这个问题的方法

这启发了我尝试将此代码设置contentModelblock

(仍然没有骰子)

const customHTMLElementModels = {
  span: defaultHTMLElementModels.span.extend({
    contentModel: HTMLContentModel.block,
  }),
};
4

2 回答 2

1

反应本机功能

React Native 大致有两种显示算法:flex 和 text-inline。任何有Text父元素的元素都将使用 text-inline 算法显示,所有其他元素将使用 flex 算法显示。前者严重限制了将支持的样式集,这是您遇到的问题。

text-inline 中的元素将忽略以下样式:

  • 边距
  • 百分比宽度
  • 所有弹性规则

我建议你玩一个像下面这样的片段来获得一个要点:

import React from 'react';
import {SafeAreaView, useWindowDimensions, View, Text} from 'react-native';

export default function App() {
  const {width} = useWindowDimensions();
  return (
    <SafeAreaView style={{flex: 1}}>
      <Text>
        Hello world!
        <View style={{ /* play with padding, margins, flex... etc! */ }}>
          <Text>I'm inside a view!</Text>
        </View>
        How are you doing?
      </Text>
    </SafeAreaView>
  );
}

解决方案一:力宽

因此,我们可以通过样式实现您正在寻找的唯一方法是将其设置width为传递contentWidth

import React from 'react';
import {SafeAreaView, useWindowDimensions, View} from 'react-native';
import RenderHTML, {
  CustomTextualRenderer,
  useContentWidth,
} from 'react-native-render-html';

const htmlContent = `
<span>Hello</span><span>Goodbye</span>
`;

const RenderedSpan: CustomTextualRenderer = ({TDefaultRenderer, ...props}) => {
  const width = useContentWidth();

  return (
    <View style={{width}}>
      <TDefaultRenderer {...props} />
    </View>
  );
};

const renderers = {
  span: RenderedSpan,
};

export default function App() {
  const {width} = useWindowDimensions();
  return (
    <SafeAreaView style={{flex: 1}}>
      <RenderHTML
        renderers={renderers}
        source={{html: htmlContent}}
        contentWidth={width}
      />
    </SafeAreaView>
  );
}

链接到小吃

解决方案 2:使用 Block 内容模型

您建议将span内容模型设置为block您提供的代码段,效果很好:

import React from 'react';
import {SafeAreaView, useWindowDimensions, View} from 'react-native';
import RenderHTML, {
  defaultHTMLElementModels,
  HTMLContentModel,
} from 'react-native-render-html';

const htmlContent = `
<span>Hello</span><span>Goodbye</span>
`;

const customHTMLElementModels = {
  span: defaultHTMLElementModels.span.extend({
    contentModel: HTMLContentModel.block,
  }),
};

export default function App() {
  const {width} = useWindowDimensions();
  return (
    <SafeAreaView style={{flex: 1}}>
      <RenderHTML source={{html: htmlContent}} contentWidth={width} customHTMLElementModels={customHTMLElementModels} />
    </SafeAreaView>
  );
}

块内容模型将强制渲染引擎保证渲染的span元素不会有任何Text上升,从而确保弹性列显示。链接到小吃

于 2021-12-03T13:47:21.857 回答
0

你有没有尝试过这样的事情:

    import * as React from 'react';
    import { Text, View, StyleSheet } from 'react-native';

    export default function App() {

        const renderers = {
          span: RenderedSpan,
        };

        const RenderedSpan = props => {

          const styles = StyleSheet.create({
            container: {
              flex: 1,
              backgroundColor:"#ff0000"
            },
          });
                    
          return (
            <View style={styles.container}>
              <Text>Some hardcoded text</Text>
            </View>
          );
        };

        return <RenderedSpan/>;
    }
于 2021-12-03T04:04:36.037 回答