如何在 React-Native-Render-Html 中强制标签为全角?
How to force a tag to full-width in React-Native-Render-Html?
我们有一个用于 span
标签的自定义渲染器,但我找不到任何方法来强制跨度为全角。我尝试将自定义渲染器包装在 View
中,并尝试应用所有常用的 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>
);
};
当我遇到 an example
时,我想我终于找到了解决问题的方法
这启发了我尝试使用此代码将 contentModel
设置为 block
:
(仍然没有骰子)
const customHTMLElementModels = {
span: defaultHTMLElementModels.span.extend({
contentModel: HTMLContentModel.block,
}),
};
你试过这样的事情吗:
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/>;
}
React Native 功能
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:使用块内容模型
您建议将 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
上级元素,从而确保弹性列显示。 LINK TO SNACK
我们有一个用于 span
标签的自定义渲染器,但我找不到任何方法来强制跨度为全角。我尝试将自定义渲染器包装在 View
中,并尝试应用所有常用的 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>
);
};
当我遇到 an example
时,我想我终于找到了解决问题的方法这启发了我尝试使用此代码将 contentModel
设置为 block
:
(仍然没有骰子)
const customHTMLElementModels = {
span: defaultHTMLElementModels.span.extend({
contentModel: HTMLContentModel.block,
}),
};
你试过这样的事情吗:
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/>;
}
React Native 功能
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:使用块内容模型
您建议将 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
上级元素,从而确保弹性列显示。 LINK TO SNACK